From 1b536724d9fb49657b56b25e8f1514b4fe4cea60 Mon Sep 17 00:00:00 2001 From: Jonathan Peyton Date: Wed, 2 Aug 2017 20:06:32 +0000 Subject: [PATCH] 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 --- openmp/runtime/src/kmp_tasking.cpp | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/openmp/runtime/src/kmp_tasking.cpp b/openmp/runtime/src/kmp_tasking.cpp index a64914c..e120fa8 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 -- 2.7.4