Fix for SPEC CPU2017 621.wrf_s failure, add missing locking code.
authorJim Wilson <jim.wilson@r3-a15.aus-colo>
Mon, 26 Jun 2017 21:40:47 +0000 (21:40 +0000)
committerJim Wilson <wilson@gcc.gnu.org>
Mon, 26 Jun 2017 21:40:47 +0000 (14:40 -0700)
libgfortran/
PR libfortran/81195
* io/unit.c (get_unit): Call __gthread_mutex_lock before newunit_stack
and newunit_tos references.  Call __gthread_mutex_unlock afterward.

From-SVN: r249667

libgfortran/ChangeLog
libgfortran/io/unit.c

index de85da9bef63d9ada9fad53a5de5fb1bf7f2699e..778056ba29ee1096072c0a36d1342b1823fb3134 100644 (file)
@@ -1,3 +1,9 @@
+2017-06-26  Jim Wilson  <jim.wilson@r3-a15.aus-colo>
+
+       PR libfortran/81195
+       * io/unit.c (get_unit): Call __gthread_mutex_lock before newunit_stack
+       and newunit_tos references.  Call __gthread_mutex_unlock afterward.
+
 2017-06-24  Thomas Koenig  <tkoenig@gcc.gnu.org>
 
         PR fortran/52473
index bcc1e37e2e30a39a01ea1c5c79a16104904245e6..ef94294526a3628f5316d1e902a4b480c23ca986 100644 (file)
@@ -583,14 +583,17 @@ get_unit (st_parameter_dt *dtp, int do_create)
        }
       else
        {
+         __gthread_mutex_lock (&unit_lock);
          if (newunit_tos)
            {
              dtp->common.unit = newunit_stack[newunit_tos].unit_number;
              unit = newunit_stack[newunit_tos--].unit;
+             __gthread_mutex_unlock (&unit_lock);
              unit->fbuf->act = unit->fbuf->pos = 0;
            }
          else
            {
+             __gthread_mutex_unlock (&unit_lock);
              dtp->common.unit = newunit_alloc ();
              unit = xcalloc (1, sizeof (gfc_unit));
              fbuf_init (unit, 128);
@@ -603,12 +606,15 @@ get_unit (st_parameter_dt *dtp, int do_create)
   /* If an internal unit number is passed from the parent to the child
      it should have been stashed on the newunit_stack ready to be used.
      Check for it now and return the internal unit if found.  */
+  __gthread_mutex_lock (&unit_lock);
   if (newunit_tos && (dtp->common.unit <= NEWUNIT_START)
       && (dtp->common.unit == newunit_stack[newunit_tos].unit_number))
     {
       unit = newunit_stack[newunit_tos--].unit;
+      __gthread_mutex_unlock (&unit_lock);
       return unit;
     }
+  __gthread_mutex_unlock (&unit_lock);
 
   /* Has to be an external unit.  */
   dtp->u.p.unit_is_internal = 0;