GNAT fully implements the pragma
the purpose of designating shared passive packages.
This allows the use of passive partitions in the
context described in the Ada Reference Manual; i.e., for communication
between separate partitions of a distributed application using the
features in Annex E.
However, the implementation approach used by GNAT provides for more
extensive usage as follows:
The implementation approach used is to store the data in files. A separate stream file is created for each object in the package, and an access to an object causes the corresponding file to be read or written.
The environment variable
SHARED_MEMORY_DIRECTORY should be
set to the directory to be used for these files.
The files in this directory
have names that correspond to their fully qualified names. For
example, if we have the package
package X is pragma Shared_Passive (X); Y : Integer; Z : Float; end X;
and the environment variable is set to
/stemp/, then the files created
will have the names:
These files are created when a value is initially written to the object, and the files are retained until manually deleted. This provides the persistence semantics. If no file exists, it means that no partition has assigned a value to the variable; in this case the initial value declared in the package will be used. This model ensures that there are no issues in synchronizing the elaboration process, since elaboration of passive packages elaborates the initial values, but does not create the files.
The files are written using normal
If you want to be able
to communicate between programs or partitions running on different
architectures, then you should use the XDR versions of the stream attribute
routines, since these are architecture independent.
If active synchronization is required for access to the variables in the shared passive package, then as described in the Ada Reference Manual, the package may contain protected objects used for this purpose. In this case a lock file (whose name is ___lock (three underscores) is created in the shared memory directory. This is used to provide the required locking semantics for proper protected object synchronization.
As of January 2003, GNAT supports shared passive packages on all platforms except for OpenVMS.