4.1.1 Creating Mailboxes |
|
To create a mailbox and assign a channel and logical name
to it, a process uses the Create Mailbox and Assign Channel ($CREMBX)
system service. A logical name can optionally be associated with the
mailbox. If a logical name is specified for the mailbox, the system
enters the logical name in a logical name table and gives it an equivalence
name of MBAn, where n is
a unique unit number.
$CREMBX also establishes the characteristics of
the mailbox. These characteristics include a protection mask, a permanence
indicator, maximum message size, buffer quota, and direction in which
I/O can be performed (read, write, or read/write). A mailbox is created
as either temporary or permanent; both types require privilege to
create. Applications and restrictions on how to use temporary and
permanent mailboxes are described in the following sections. (See
the HP OpenVMS System Services Reference Manual for additional information on creating mailboxes.)
Other processes can
assign additional channels to a mailbox using either the $CREMBX or
the Assign I/O Channel ($ASSIGN) system service. The mailbox is identified
by its logical name both when it is created and when it is assigned
channels by cooperating processes. Channels assigned to the mailbox
can specify the direction that I/O can be performed on the channel.
Figure 4-1 shows the use of $CREMBX and $ASSIGN.
If sufficient dynamic memory for the mailbox data
structure is not available when a mailbox is created, a resource wait
occurs if resource wait mode is enabled.
When a mailbox is created, a certain amount of
space is specified for buffering messages that have been written to
the mailbox but have not yet been read. The bufquo argument to the $CREMBX system service specifies
this amount or quota. If that argument is omitted, its value defaults
to the system parameter DEFMBXBUFQUO.
A message written to a mailbox, in the absence
of an outstanding read request, is queued to the mailbox, and the
size of the message (the QIO P2 argument) is subtracted from the available
buffering space. After the message is read, it is added back to the
available buffering space.
If a process attempts to write to a mailbox that
is full or has insufficient buffering space and if the process has
resource wait enabled (which is the default case), the process is
placed in miscellaneous resource wait mode until sufficient space
is available in the mailbox. If resource wait is not enabled, the
I/O completes with the status return SS$_MBFULL in the I/O status
block (IOSB).
Channels can be assigned to mailboxes as bidirectional
(read/write), read only, or write only. This allows for greater synchronization
between users of the mailbox. To specify a unidirectional channel
to the mailbox, specify the flags argument for the $CREMBX or $ASSIGN system services.
The flags argument
is a longword bit mask that enables you to specify that the channel
assigned to the mailbox is a read-only or write-only channel. If the flags argument is not specified, the default
channel behavior is read/write. A channel assigned to the mailbox
as read only is considered a reader. A channel assigned to the mailbox
as write only is considered a writer. A channel assigned to the mailbox
as read/write is considered both a reader and a writer.
For the $ASSIGN system service, the $AGNDEF macro
defines a symbolic name for each flag bit. These flags are as follows:
AGN$M_READONLY—
When this flag is specified, $ASSIGN assigns a read-only channel to
the mailbox device. An attempt to issue a $QIO WRITE operation on
the mailbox channel causes an illegal I/O operation error.
AGN$M_WRITEONLY—
When this flag is specified, $ASSIGN assigns a write-only channel
to the mailbox device. An attempt to issue a $QIO READ operation on
the mailbox channel causes an illegal I/O operation error.
For the $CREMBX system service, the $CMBDEF macro
defines a symbolic name for each flag bit. These flags are as follows:
CMB$M_READONLY—
When this flag is specified, $CREMBX assigns a read-only channel to
the mailbox device. An attempt to issue a $QIO WRITE operation on
the mailbox channel causes an illegal I/O operation error.
CMB$M_WRITEONLY—
When this flag is specified, $CREMBX assigns a write-only channel
to the mailbox device. An attempt to issue a $QIO READ operation on
the mailbox channel causes an illegal I/O operation error.
See the HP OpenVMS System
Services Reference Manual for a syntax description of the
$CREMBX and $ASSIGN system services.
The programming examples at the end of this section
(“Mailbox Driver Programming Examples”)
show mailbox creation, interprocess communication, and synchronization.
4.1.2 Deleting Mailboxes |
|
As each process finishes using a mailbox, it deassigns the channel
using the Deassign I/O Channel ($DASSGN) system service. Temporary
mailboxes or permanent mailboxes that have been marked for deletion
are actually deleted when no more channels are assigned to them.
If a mailbox channel is deassigned, any incomplete
I/O requests on the mailbox channel for the process deassigning the
channel are removed.
Permanent mailboxes that have not been marked
for deletion must be explicitly deleted using the Delete Mailbox ($DELMBX)
system service. An explicit deletion can occur at any time. As is
true for temporary mailboxes, the mailbox is deleted when no processes
have channels assigned to it.
When a temporary mailbox is deleted, its message
buffer quota is returned to the process that created it. (No quota
charge is made for permanent mailboxes.)
4.1.3 Mailbox Protection |
|
Mailboxes (both temporary and permanent) are protected by a code,
or mask, that is similar to the code used in protecting volumes. As
with volumes, four types of users (defined by UIC) can gain access
to a mailbox: SYSTEM, OWNER, GROUP, and WORLD; however, only three
types of access—logical I/O, read, and write—are meaningful
to users of a mailbox. Therefore, when creating a mailbox, you can
specify logical I/O, read, and write access to the mailbox separately
for each type of user. Logical I/O access is required for any mailbox
operation. The set protection function modifier provides additional
control of mailbox access (see “Set Protection”).
For additional information on temporary mailboxes
and mailbox protection, see the description of the $CREMBX system
service in the HP OpenVMS System Services
Reference Manual.