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
This commit is contained in:
Jonathan Peyton 2017-08-02 20:06:32 +00:00
parent 4f90c82aec
commit 1b536724d9
1 changed files with 2 additions and 3 deletions

View File

@ -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 // Deallocates a task deque for a particular thread. Happens at library
// deallocation so don't need to reset all thread data fields. // deallocation so don't need to reset all thread data fields.
static void __kmp_free_task_deque(kmp_thread_data_t *thread_data) { 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) { 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); TCW_4(thread_data->td.td_deque_ntasks, 0);
__kmp_free(thread_data->td.td_deque); __kmp_free(thread_data->td.td_deque);
thread_data->td.td_deque = NULL; 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 #ifdef BUILD_TIED_TASK_STACK
// GEH: Figure out what to do here for td_susp_tied_tasks // GEH: Figure out what to do here for td_susp_tied_tasks