This is the mail archive of the fortran@gcc.gnu.org mailing list for the GNU Fortran project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH, libfortran] PR 48587 Newunit allocator


On 10/14/2016 02:48 PM, 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-15  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.
	(GFC_FIRST_NEWUNIT): Rename to NEWUNIT_START.
	(next_available_newunit): Remove variable.
	(get_unit): Call newunit_alloc, don't try to create negative
	external unit.
	(close_unit_1): Call newunit_free.
	(close_units): Free newunits array.
	(get_unique_number): Remove function.
	(newunit_alloc): New function.
	(newunit_free): New function.
	* io/transfer.c (data_transfer_init): Check for invalid unit
	number.

testsuite ChangeLog:

2016-10-15  Janne Blomqvist  <jb@gcc.gnu.org>

	PR libfortran/48587
	* gfortran.dg/negative_unit2.f90: New testcase.

Regtested on x86_64-pc-linux-gnu.

Version 2 of the patch. Compared to v1:
* Check for invalid unit number in transfer.c:data_transfer_init and
  unit.c:get_unit.
* Add testcase to check invalid unit number.
* Reduce initial size of newunits array from 32 to 16.

Yes, OK. It affects another patch I am doing related to IOLENGTH, so I applied them together and I am going to have to do something different with the invalid unit. More on this later.

Thanks,

Jerry


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]