Section A.14 of the Ada 95 Reference Manual allows implementations to provide a wide variety of behavior if an attempt is made to access the same external file with two or more internal files.
To provide a full range of functionality, while at the same time minimizing the problems of portability caused by this implementation dependence, GNAT handles file sharing as follows:
shared=
xxx
form parameter, an attempt
to open two or more files with the same full name is considered an error
and is not supported. The exception Use_Error
will be
raised. Note that a file that is not explicitly closed by the program
remains open until the program terminates.
shared=no
appears in the form string, the
file can be opened or created with its own separate stream identifier,
regardless of whether other files sharing the same external file are
opened. The exact effect depends on how the C stream routines handle
multiple accesses to the same external files using separate streams.
shared=yes
appears in the form string for
each of two or more files opened using the same full name, the same
stream is shared between these files, and the semantics are as described
in Ada 95 Reference Manual, Section A.14.
When a program that opens multiple files with the same name is ported
from another Ada compiler to GNAT, the effect will be that
Use_Error
is raised.
The documentation of the original compiler and the documentation of the
program should then be examined to determine if file sharing was
expected, and shared=
xxx parameters added to
Open
and Create
calls as required.
When a program is ported from GNAT to some other Ada compiler, no
special attention is required unless the shared=
xxx form
parameter is used in the program. In this case, you must examine the
documentation of the new compiler to see if it supports the required
file sharing semantics, and form strings modified appropriately. Of
course it may be the case that the program cannot be ported if the
target compiler does not support the required functionality. The best
approach in writing portable code is to avoid file sharing (and hence
the use of the
shared=
xxx parameter in the form string)
completely.
One common use of file sharing in Ada 83 is the use of instantiations of
Sequential_IO on the same file with different types, to achieve
heterogeneous input-output. Although this approach will work in GNAT if
shared=yes
is specified, it is preferable in Ada 95 to use Stream_IO
for this purpose (using the stream attributes)