Cleanup NEWUNIT allocation.
authorJanne Blomqvist <jb@gcc.gnu.org>
Tue, 1 Nov 2011 11:44:12 +0000 (13:44 +0200)
committerJanne Blomqvist <jb@gcc.gnu.org>
Tue, 1 Nov 2011 11:44:12 +0000 (13:44 +0200)
2011-11-01  Janne Blomqvist  <jb@gcc.gnu.org>

* io/io.h (next_available_newunit): Remove prototype.
* io/unit.h (next_available_newunit): Make variable static,
initialize it.
(init_units): Don't initialize next_available_newunit.
(get_unique_unit_number): Use atomic builtin if available.

From-SVN: r180734

libgfortran/ChangeLog
libgfortran/io/io.h
libgfortran/io/unit.c

index cbad61a..a022ee2 100644 (file)
@@ -1,3 +1,11 @@
+2011-11-01  Janne Blomqvist  <jb@gcc.gnu.org>
+
+       * io/io.h (next_available_newunit): Remove prototype.
+       * io/unit.h (next_available_newunit): Make variable static,
+       initialize it.
+       (init_units): Don't initialize next_available_newunit.
+       (get_unique_unit_number): Use atomic builtin if available.
+
 2011-10-31  Janne Blomqvist  <jb@gcc.gnu.org>
 
        * io/inquire.c (inquire_via_unit): Check whether we're at the
index 23f07ca..3569c54 100644 (file)
@@ -576,10 +576,6 @@ gfc_unit;
 extern gfc_offset max_offset;
 internal_proto(max_offset);
 
-/* Unit number to be assigned when NEWUNIT is used in an OPEN statement.  */
-extern GFC_INTEGER_4 next_available_newunit;
-internal_proto(next_available_newunit);
-
 /* Unit tree root.  */
 extern gfc_unit *unit_root;
 internal_proto(unit_root);
index b4d10cd..33072fe 100644 (file)
@@ -71,8 +71,9 @@ see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
 
 /* Subroutines related to units */
 
-GFC_INTEGER_4 next_available_newunit;
+/* Unit number to be assigned when NEWUNIT is used in an OPEN statement.  */
 #define GFC_FIRST_NEWUNIT -10
+static GFC_INTEGER_4 next_available_newunit = GFC_FIRST_NEWUNIT;
 
 #define CACHE_SIZE 3
 static gfc_unit *unit_cache[CACHE_SIZE];
@@ -525,8 +526,6 @@ init_units (void)
   __GTHREAD_MUTEX_INIT_FUNCTION (&unit_lock);
 #endif
 
-  next_available_newunit = GFC_FIRST_NEWUNIT;
-
   if (options.stdin_unit >= 0)
     {                          /* STDIN */
       u = insert_unit (options.stdin_unit);
@@ -808,16 +807,19 @@ get_unique_unit_number (st_parameter_open *opp)
 {
   GFC_INTEGER_4 num;
 
+#ifdef HAVE_SYNC_FETCH_AND_ADD
+  num = __sync_fetch_and_add (&next_available_newunit, -1);
+#else
   __gthread_mutex_lock (&unit_lock);
   num = next_available_newunit--;
+  __gthread_mutex_unlock (&unit_lock);
+#endif
 
   /* Do not allow NEWUNIT numbers to wrap.  */
-  if (next_available_newunit >=  GFC_FIRST_NEWUNIT )
+  if (num > GFC_FIRST_NEWUNIT )
     {
-      __gthread_mutex_unlock (&unit_lock);
       generate_error (&opp->common, LIBERROR_INTERNAL, "NEWUNIT exhausted");
       return 0;
     }
-  __gthread_mutex_unlock (&unit_lock);
   return num;
 }