The following library, called OBJECT/FILEMANAGER/LIB, uses dynamic provision to export a set of file management routines. This library demonstrates features of dynamic provision, but does not necessarily represent efficient programming.
$SHARING = PRIVATE
BEGIN % FILEMANAGER/LIB.
TASK ARRAY LIBTASKS [0:10]; % PROVIDE UP TO 11 DIFFERENT LIBRARY
% PROCESSES.
STRING ARRAY FILETITLES [0:10]; % LIBPARAMETER FOR EACH LIB PROCESS
PROCEDURE FILEMANAGER (TASKINDEX);
VALUE TASKINDEX;
INTEGER TASKINDEX;
BEGIN
PROCEDURE READFILE;
BEGIN
.
.
.
END READFILE;
PROCEDURE WRITEFILE;
BEGIN
.
.
.
END WRITEFILE;
EXPORT READFILE, WRITEFILE;
FREEZE (TEMPORARY);
FILETITLES [TASKINDEX]:= “.”;
END FILEMANAGER;
PROCEDURE SELECTION (USERSFILE, MCPCHECK);
VALUE USERSFILE;
EBCDIC STRING USERSFILE;
PROCEDURE MCPCHECK (T); TASK T; FORMAL;
BEGIN
INTEGER TASKINDEX;
BOOLEAN FOUND;
LABEL SEARCH;
% LOOK AT ALL THE FILETITLES CHECKING TO SEE IF A LIBRARY PROCESS
% HAS ALREADY BEEN INITIATED FOR FILE TITLE USERSFILE.
SEARCH:
WHILE NOT FOUND AND (TASKINDEX LEQ 10) DO
BEGIN
IF FILETITLES [TASKINDEX] = USERSFILE THEN
FOUND:= TRUE
ELSE
TASKINDEX:= * + 1;
END;
% IF NO LIBRARY PROCESS EXISTS FOR THIS FILE TITLE, THEN CREATE ONE
IF NOT FOUND THEN
BEGIN
TASKINDEX:= 0;
WHILE NOT FOUND AND (TASKINDEX LEQ 10) DO
IF LIBTASKS [TASKINDEX].STATUS LEQ 0 THEN
FOUND:= TRUE
ELSE
TASKINDEX:= * + 1;
IF NOT FOUND THEN
BEGIN
% WAIT A SECOND AND MAYBE
% A LIBRARY PROCESS WILL GO TO EOT.
WAIT ((1));
GO SEARCH; %
END;
PROCESS FILEMANAGER (TASKINDEX) [LIBTASKS [TASKINDEX]];
WHILE LIBTASKS [TASKINDEX].STATUS NEQ VALUE (FROZEN) DO
WAIT ((1));
FILETITLES [TASKINDEX]:=USERSFILE;
END;
MCPCHECK (LIBTASKS [TASKINDEX]);
END SELECTION;
PROCEDURE READFILE;
BY CALLING SELECTION;
PROCEDURE WRITEFILE;
BY CALLING SELECTION;
EXPORT READFILE, WRITEFILE;
FREEZE (TEMPORARY);
END LIBRARY.Before attempting to understand this example, you should be familiar with the concepts discussed under Dynamic Provision in this section.
OBJECT/FILEMANAGER/LIB exports two procedures: READFILE and WRITEFILE. OBJECT/FILEMANAGER/LIB provides these procedures dynamically. The procedures are ultimately provided by various library processes that are initiated by OBJECT/FILEMANAGER/LIB. Each of these offspring library processes is an instance of the procedure FILEMANAGER. Each library process is intended to provide read and write access to a different data file. Each client process is expected to use the LIBPARAMETER library attribute to indicate the name of the file to be read or written.
The system automatically invokes the SELECTION procedure whenever a client process first links to OBJECT/FILEMANAGER/LIB. The system passes an MCP procedure to the MCPCHECK parameter of the SELECTION procedure. The system also passes the LIBPARAMETER attribute specified by the client process to the USERSFILE parameter of the SELECTION procedure.
The SELECTION procedure searches the string array FILETITLES to see if a library process with the name specified by USERSFILE is already running. If so, the SELECTION procedure selects the task variable of the requested library process. If no library process with the requested name is yet running, SELECTION initiates a new library process and stores the name of the process in the FILETITLES array.
After SELECTION has selected a task variable, it invokes the procedure MCPCHECK, passing the selected task variable as a parameter. The MCPCHECK procedure informs the system to link the client process to the library process with the specified task variable. The actual library linkage is not performed until SELECTION has been exited.

