summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJonathan Peyton <jonathan.l.peyton@intel.com>2017-08-02 20:06:32 +0000
committerJonathan Peyton <jonathan.l.peyton@intel.com>2017-08-02 20:06:32 +0000
commit1b536724d9fb49657b56b25e8f1514b4fe4cea60 (patch)
tree37f9a0b9c0f51d930d2ac1ffcd39b96b5e6bfdc3
parent4f90c82aecdb23539b2b2b4ab844017387153c6a (diff)
downloadbcm5719-llvm-1b536724d9fb49657b56b25e8f1514b4fe4cea60.tar.gz
bcm5719-llvm-1b536724d9fb49657b56b25e8f1514b4fe4cea60.zip
Move lock acquire/release functions in task deque cleanup code
The original locations can be reached without initializing the lock variable (td_deque_lock), so it is potentially unsafe. It is guaranteed that the lock is initialized if the deque (td_deque) is not NULL, and lock functions can be safely called. Patch by Hansang Bae Differential Revision: https://reviews.llvm.org/D36017 llvm-svn: 309875
-rw-r--r--openmp/runtime/src/kmp_tasking.cpp5
1 files changed, 2 insertions, 3 deletions
diff --git a/openmp/runtime/src/kmp_tasking.cpp b/openmp/runtime/src/kmp_tasking.cpp
index a64914c0656..e120fa81825 100644
--- a/openmp/runtime/src/kmp_tasking.cpp
+++ b/openmp/runtime/src/kmp_tasking.cpp
@@ -2504,14 +2504,13 @@ static void __kmp_realloc_task_deque(kmp_info_t *thread,
// Deallocates a task deque for a particular thread. Happens at library
// deallocation so don't need to reset all thread data fields.
static void __kmp_free_task_deque(kmp_thread_data_t *thread_data) {
- __kmp_acquire_bootstrap_lock(&thread_data->td.td_deque_lock);
-
if (thread_data->td.td_deque != NULL) {
+ __kmp_acquire_bootstrap_lock(&thread_data->td.td_deque_lock);
TCW_4(thread_data->td.td_deque_ntasks, 0);
__kmp_free(thread_data->td.td_deque);
thread_data->td.td_deque = NULL;
+ __kmp_release_bootstrap_lock(&thread_data->td.td_deque_lock);
}
- __kmp_release_bootstrap_lock(&thread_data->td.td_deque_lock);
#ifdef BUILD_TIED_TASK_STACK
// GEH: Figure out what to do here for td_susp_tied_tasks
OpenPOWER on IntegriCloud