Hi!

We'd noticed before some locking issues in libgomp; in r245783 I just
committed the following to gomp-4_0-branch:

commit 921620f947485002e56f736d4ca18bd2ae33e05b
Author: tschwinge <tschwinge@138bc75d-0d04-0410-961f-82ee72b054a4>
Date:   Tue Feb 28 17:35:49 2017 +0000

    libgomp, OpenACC: Fix locking of cached_base_dev (guarded by 
acc_device_lock)
    
            libgomp/
            * oacc-init.c (goacc_register, acc_init, goacc_lazy_initialize):
            Fix locking of cached_base_dev (guarded by acc_device_lock).
            (goacc_lazy_initialize): Don't call acc_init; copy code here,
            instead.
    
    git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/gomp-4_0-branch@245783 
138bc75d-0d04-0410-961f-82ee72b054a4
---
 libgomp/ChangeLog.gomp |  7 +++++++
 libgomp/oacc-init.c    | 25 +++++++++++++------------
 2 files changed, 20 insertions(+), 12 deletions(-)

diff --git libgomp/ChangeLog.gomp libgomp/ChangeLog.gomp
index 637be06..af6a28b 100644
--- libgomp/ChangeLog.gomp
+++ libgomp/ChangeLog.gomp
@@ -1,3 +1,10 @@
+2017-02-28  Thomas Schwinge  <tho...@codesourcery.com>
+
+       * oacc-init.c (goacc_register, acc_init, goacc_lazy_initialize):
+       Fix locking of cached_base_dev (guarded by acc_device_lock).
+       (goacc_lazy_initialize): Don't call acc_init; copy code here,
+       instead.
+
 2017-02-27  Chung-Lin Tang  <clt...@codesourcery.com>
 
        * testsuite/libgomp.oacc-c-c++-common/gang-private-1.c: New test.
diff --git libgomp/oacc-init.c libgomp/oacc-init.c
index 71e9ccf..05bb663 100644
--- libgomp/oacc-init.c
+++ libgomp/oacc-init.c
@@ -64,6 +64,10 @@ static gomp_mutex_t goacc_thread_lock;
    grouped by device in target.c:devices).  */
 static struct gomp_device_descr *dispatchers[_ACC_device_hwm] = { 0 };
 
+/* Register a device.
+
+   ACC_DEVICE_LOCK must be held before calling this function.  */
+
 attribute_hidden void
 goacc_register (struct gomp_device_descr *disp)
 {
@@ -71,15 +75,11 @@ goacc_register (struct gomp_device_descr *disp)
   if (disp->target_id != 0)
     return;
 
-  gomp_mutex_lock (&acc_device_lock);
-
   assert (acc_device_type (disp->type) != acc_device_none
          && acc_device_type (disp->type) != acc_device_default
          && acc_device_type (disp->type) != acc_device_not_host);
   assert (!dispatchers[disp->type]);
   dispatchers[disp->type] = disp;
-
-  gomp_mutex_unlock (&acc_device_lock);
 }
 
 /* OpenACC names some things a little differently.  */
@@ -449,13 +449,10 @@ goacc_attach_host_thread_to_device (int ord)
 void
 acc_init (acc_device_t d)
 {
+  gomp_mutex_lock (&acc_device_lock);
   if (!cached_base_dev)
     gomp_init_targets_once ();
-
-  gomp_mutex_lock (&acc_device_lock);
-
   cached_base_dev = acc_init_1 (d);
-
   gomp_mutex_unlock (&acc_device_lock);
   
   goacc_attach_host_thread_to_device (-1);
@@ -704,12 +701,16 @@ attribute_hidden void
 goacc_lazy_initialize (void)
 {
   struct goacc_thread *thr = goacc_thread ();
-
   if (thr && thr->dev)
     return;
 
+  gomp_mutex_lock (&acc_device_lock);
   if (!cached_base_dev)
-    acc_init (acc_device_default);
-  else
-    goacc_attach_host_thread_to_device (-1);
+    {
+      gomp_init_targets_once ();
+      cached_base_dev = acc_init_1 (acc_device_default);
+    }
+  gomp_mutex_unlock (&acc_device_lock);
+
+  goacc_attach_host_thread_to_device (-1);
 }


Grüße
 Thomas

Reply via email to