[PATCH, libfortran] PR 48587 Newunit allocator

Jerry DeLisle jvdelisle@charter.net
Thu Oct 13 20:08:00 GMT 2016

On 10/13/2016 08:16 AM, Janne Blomqvist wrote:
> Currently GFortran newer reuses unit numbers allocated with NEWUNIT=,
> instead having a simple counter that is decremented each time such a
> unit is opened.  For a long running program which repeatedly opens
> files with NEWUNIT= and closes them, the counter can wrap around and
> cause an abort.  This patch replaces the counter with an allocator
> that keeps track of which units numbers are allocated, and can reuse
> them once they have been deallocated.  Since operating systems tend to
> limit the number of simultaneous open files for a process to a
> relatively modest number, a relatively simple approach with a linear
> scan through an array suffices.  Though as a small optimization there
> is a low water indicator keeping track of the index for which all unit
> numbers below are already allocated.  This linear scan also ensures
> that we always allocate the smallest available unit number.
> 2016-10-13  Janne Blomqvist  <jb@gcc.gnu.org>
> 	PR libfortran/48587
> 	* io/io.h (get_unique_unit_number): Remove prototype.
> 	(newunit_alloc): New prototype.
> 	* io/open.c (st_open): Call newunit_alloc.
> 	* io/unit.c (newunits,newunit_size,newunit_lwi): New static
> 	variables.
> 	(next_available_newunit): Remove variable.
> 	(get_unit): Call newunit_alloc.
> 	(close_unit_1): Call newunit_free.
> 	(close_units): Free newunits array.
> 	(get_unique_number): Remove function.
> 	(newunit_alloc): New function.
> 	(newunit_free): New function.
> Regtested on x86_64-pc-linux-gnu. Ok for trunk?

Yes, OK, clever! Thanks!


More information about the Gcc-patches mailing list