Commit ea5e3c04 by Janne Blomqvist

Cleanup NEWUNIT allocation.

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
parent 1f9ed162
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> 2011-10-31 Janne Blomqvist <jb@gcc.gnu.org>
* io/inquire.c (inquire_via_unit): Check whether we're at the * io/inquire.c (inquire_via_unit): Check whether we're at the
......
...@@ -576,10 +576,6 @@ gfc_unit; ...@@ -576,10 +576,6 @@ gfc_unit;
extern gfc_offset max_offset; extern gfc_offset max_offset;
internal_proto(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. */ /* Unit tree root. */
extern gfc_unit *unit_root; extern gfc_unit *unit_root;
internal_proto(unit_root); internal_proto(unit_root);
......
...@@ -71,8 +71,9 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see ...@@ -71,8 +71,9 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
/* Subroutines related to units */ /* 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 #define GFC_FIRST_NEWUNIT -10
static GFC_INTEGER_4 next_available_newunit = GFC_FIRST_NEWUNIT;
#define CACHE_SIZE 3 #define CACHE_SIZE 3
static gfc_unit *unit_cache[CACHE_SIZE]; static gfc_unit *unit_cache[CACHE_SIZE];
...@@ -525,8 +526,6 @@ init_units (void) ...@@ -525,8 +526,6 @@ init_units (void)
__GTHREAD_MUTEX_INIT_FUNCTION (&unit_lock); __GTHREAD_MUTEX_INIT_FUNCTION (&unit_lock);
#endif #endif
next_available_newunit = GFC_FIRST_NEWUNIT;
if (options.stdin_unit >= 0) if (options.stdin_unit >= 0)
{ /* STDIN */ { /* STDIN */
u = insert_unit (options.stdin_unit); u = insert_unit (options.stdin_unit);
...@@ -808,16 +807,19 @@ get_unique_unit_number (st_parameter_open *opp) ...@@ -808,16 +807,19 @@ get_unique_unit_number (st_parameter_open *opp)
{ {
GFC_INTEGER_4 num; 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); __gthread_mutex_lock (&unit_lock);
num = next_available_newunit--; num = next_available_newunit--;
__gthread_mutex_unlock (&unit_lock);
#endif
/* Do not allow NEWUNIT numbers to wrap. */ /* 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"); generate_error (&opp->common, LIBERROR_INTERNAL, "NEWUNIT exhausted");
return 0; return 0;
} }
__gthread_mutex_unlock (&unit_lock);
return num; return num;
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment