diff options
-rw-r--r-- | libgomp/ChangeLog.omp | 5 | ||||
-rw-r--r-- | libgomp/oacc-init.c | 12 |
2 files changed, 13 insertions, 4 deletions
diff --git a/libgomp/ChangeLog.omp b/libgomp/ChangeLog.omp index 75c4591..922e00f 100644 --- a/libgomp/ChangeLog.omp +++ b/libgomp/ChangeLog.omp @@ -1,3 +1,8 @@ +2020-03-26 Thomas Schwinge <thomas@codesourcery.com> + + * oacc-init.c (acc_init_1): Move other 'acc_init_state' logic to + where it belongs. + 2020-03-25 Thomas Schwinge <thomas@codesourcery.com> * oacc-init.c (acc_init_1): Move 'acc_init_state' logic to where diff --git a/libgomp/oacc-init.c b/libgomp/oacc-init.c index 765fa2f..40c14fa 100644 --- a/libgomp/oacc-init.c +++ b/libgomp/oacc-init.c @@ -317,10 +317,6 @@ acc_init_1 (acc_device_t d, acc_construct_t parent_construct, int implicit) gomp_init_device (acc_dev); gomp_mutex_unlock (&acc_dev->lock); - gomp_mutex_lock (&acc_init_state_lock); - acc_init_state = initialized; - gomp_mutex_unlock (&acc_init_state_lock); - if (profiling_p) { prof_info.event_type = acc_ev_device_init_end; @@ -329,6 +325,14 @@ acc_init_1 (acc_device_t d, acc_construct_t parent_construct, int implicit) &api_info); } + /* We're setting 'initialized' *after* 'goacc_profiling_dispatch', so that a + nested 'acc_get_device_type' called from a profiling callback still sees + 'initializing', so that we don't deadlock when it then again tries to lock + 'goacc_prof_lock'. See also the discussion in 'acc_get_device_type'. */ + gomp_mutex_lock (&acc_init_state_lock); + acc_init_state = initialized; + gomp_mutex_unlock (&acc_init_state_lock); + return base_dev; } |