|
HP OpenVMS System Services Reference Manual
If this argument is omitted (the default) or is zero, the context
associated with the new RM participant is the same as that of the RMI
with which it is associated.
timout
OpenVMS usage: |
date_time |
type: |
quadword (unsigned) |
access: |
read only |
mechanism: |
by reference |
Reserved to HP.
bid
OpenVMS usage: |
branch_id |
type: |
octaword (unsigned) |
access: |
write only |
mechanism: |
by reference |
The identifier of an authorized branch (BID) that may be added to the
transaction by a subsequent call to $START_BRANCH on the same node as
that of the RMI. This argument is ignored if the DDTM$M_COORDINATOR
flag is clear in the flags argument. The call to
$START_BRANCH should specify the node of the RMI for the
tm_name argument.
Description
The $JOIN_RM system service:
- Adds a new RM participant to the specified transaction. The new RM
participant is associated with the RMI whose identifier is passed in
the rm_id argument.
- Introduces a new transaction to DECdtm if the new RM participant is
a coordinator and the specified transaction is unknown to DECdtm.
- Authorizes a new branch of the transaction if the new RM
participant is a coordinator.
Preconditions for the successful completion of $JOIN_RM are:
- Unless the DDTM$M_COORDINATOR flag is set, the calling process must
contain at least one branch of the specified transaction.
- The calling process must contain the specified RMI.
- The caller must not be in a less privileged mode than the access
mode of the specified RMI.
- If the DDTM$M_COORDINATOR flag is set, either the calling process
must have the SYSPRV privilege, or the caller must be in executive or
kernel mode.
- If the DDTM$M_COORDINATOR flag is set, the specified RMI must not
be volatile. That is, the DDTM$M_VOLATILE flag must not have been set
on the call to the $DECLARE_RM that created it.
- The access mode of the specified RMI must not be less privileged
than that of the specified transaction in this process.
$JOIN_RM can fail for various reasons, including:
- Preconditions were not met.
- The DDTM$M_COORDINATOR flag was set, but no bid
argument was supplied.
When $JOIN_RM completes successfully, a new RM participant running in
the calling process is added to the transaction. This RM participant is
associated with the specified RMI.
The DECdtm transaction manager will report to the new RM participant
the types of event specified in the call to $DECLARE_RM that created
the RMI with which it is associated. Note however that events of type
prepare, one-phase commit, and commit are never reported to RM
participants that set the DDTM$M_COORDINATOR flag on the call to
$JOIN_RM.
If the call to $DECLARE_RM requested prepare and one-phase commit
events, and the $JOIN_RM call does not set the DDTM$M_COORDINATOR flag,
the new RM participant is entitled to a vote on the outcome of the
transaction.
If the $JOIN_RM call sets the DDTM$M_COORDINATOR flag, then the new RM
participant is expected to initiate commit or abort processing by a
call to $TRANS_EVENT. No events of type prepare, one-phase commit, or
commit are delivered to the RM participant.
Events of type abort are reported to the RM participant.
The new RM participant is removed from the transaction when the first
of the following conditions is met:
- On successful completion of a call to $ACK_EVENT that acknowledges
an event report delivered to that RM participant, if the event and its
acknowledgment were one of those listed in the following table:
Event |
Acknowledgment (report_reply) |
Abort
|
SS$_FORGET
|
Commit
|
SS$_FORGET or SS$_REMEMBER
|
Prepare
|
SS$_FORGET
|
One-phase commit
|
SS$_NORMAL or SS$_VETO
|
- On completion of a successful call to $TRANS_EVENT that specifies a
commit or abort event, if the DDTM$M_COORDINATOR flag is set.
- When a commit or abort event occurs, and no associated event report
is delivered to the RM participant.
- On successful completion of a call to $FORGET_RM that deletes the
RMI with which it is associated.
- When the current process terminates (normally or abnormally).
- When the current image terminates (normally or abnormally).
If the DDTM$M_COORDINATOR flag is set:
- A new branch is authorized for the transaction and its identifier
is returned in the octaword that the bid argument
points to. $JOIN_RM uses the $CREATE_UID system service to generate the
BID. No other call to $ADD_BRANCH, $JOIN_RM, or $CREATE_UID on any
other node ever returns the same BID value.
- The transaction cannot commit until the new branch has been started
by a matching call to $START_BRANCH. (See the description of
$START_BRANCH for the definition of a matching call to $START_BRANCH.)
- If the transaction is not already known to this process, then the
transaction is introduced to this process with an access mode equal to
the access mode of the caller. (See the description of $START_TRANS for
a definition of the access mode of a transaction.)
There is also a wait form of the service, $JOIN_RMW.
Required Privileges
If the DDTM$M_COORDINATOR flag is set, then either the calling process
must have the SYSPRV privilege or the caller must be in executive or
kernel mode.
Required Quotas
BYTLM, ASTLM
Related Services
$ABORT_TRANS, $ABORT_TRANSW, $ACK_EVENT, $ADD_BRANCH, $ADD_BRANCHW,
$CREATE_UID, $DECLARE_RM, $DECLARE_RMW, $END_BRANCH, $END_BRANCHW,
$END_TRANS, $END_TRANSW, $FORGET_RM, $FORGET_RMW, $GETDTI, $GETDTIW,
$GET_DEFAULT_TRANS, $JOIN_RMW, $SETDTI, $SETDTIW, $SET_DEFAULT_TRANS,
$SET_DEFAULT_TRANSW, $START_BRANCH, $START_BRANCHW, $START_TRANS,
$START_TRANSW, $TRANS_EVENT, $TRANS_EVENTW
Condition Values Returned
SS$_NORMAL
|
If returned in R0, the request was successfully queued. If returned in
the I/O status block, the service completed successfully.
|
SS$_SYNCH
|
The service completed successfully and synchronously (returned only if
the DDTM$M_SYNC flag is set).
|
SS$_ACCVIO
|
An argument was not accessible to the caller.
|
SS$_BADPARAM
|
The options flags were invalid, the specified
tid was invalid, or DTM$M_COORDINATOR set but no
bid supplied.
|
SS$_EXASTLM
|
The process AST limit (ASTLM) was exceeded.
|
SS$_EXQUOTA
|
The job buffered I/O byte limit quota (BYTLM) was exceeded.
|
SS$_ILLEFC
|
The event flag number was invalid.
|
SS$_INSFARGS
|
A required argument was missing.
|
SS$_INSFMEM
|
There was insufficient system dynamic memory for the operation.
|
SS$_INVBUFLEN
|
The string passed in the
part_name argument was too long.
|
SS$_NOSYSPRIV
|
The DDTM$M_COORDINATOR flag was set and the caller was in user or
supervisor mode but the calling process did not have the SYSPRV
privilege.
|
SS$_NOCURTID
|
An attempt was made to add a new participant to the default transaction
(the
tid argument was zero or omitted) but the calling
process did not have a default transaction.
|
SS$_NOSUCHTID
|
The DDTM$M_COORDINATOR flag was clear and the calling process did not
contain any branches in the transaction.
|
SS$_NOSUCHRM
|
The calling process did not contain the specified RMI.
|
SS$_WRONGACMODE
|
The caller was in a less privileged access mode than that of the RMI.
|
SS$_WRONGSTATE
|
The transaction was in the wrong state for the attempted operation
because either:
- An abort event had occurred for the transaction.
- A call to $END_TRANS to end the transaction was in progress and it
is too late to add a new RM participant to the transaction.
|
$JOIN_RMW
Adds a new Resource Manager (RM) participant to a transaction.
$JOIN_RMW always waits for the request to complete before returning to
the caller. Other than this, it is identical to $JOIN_RM.
Format
SYS$JOIN_RMW [efn] ,[flags] ,iosb ,[astadr] ,[astprm] ,rm_id [,[tid]
,[part_name] ,[rm_context] ,[timout] ,[bid] ]
C Prototype
int sys$join_rmw (unsigned int efn, unsigned int flags, struct _iosb
*iosb, void (*astadr)(__unknown_params), int astprm, unsigned int
rm_id,...);
$LCKPAG
Locks a page or range of pages in memory. The specified virtual pages
are forced into the working set and then locked in memory. A locked
page is not swapped out of memory if the working set of the process is
swapped out. These pages are not candidates for page replacement and in
this sense are locked in the working set as well.
Format
SYS$LCKPAG inadr ,[retadr] ,[acmode]
C Prototype
int sys$lckpag (struct _va_range *inadr, struct _va_range *retadr,
unsigned int acmode);
Arguments
inadr
OpenVMS usage: |
address_range |
type: |
longword (unsigned) |
access: |
read only |
mechanism: |
by reference |
Starting and ending virtual addresses of the range of pages to be
locked. The inadr argument is the address of a
2-longword array containing, in order, the starting and ending process
virtual addresses. Only the virtual page number portion of each virtual
address is used; the low-order byte-within-page bits are ignored.
On VAX systems, if the starting and ending virtual addresses are the
same, a single page is locked.
retadr
OpenVMS usage: |
address_range |
type: |
longword (unsigned) |
access: |
write only |
mechanism: |
by reference |
Starting and ending process virtual addresses of the pages that $LCKPAG
actually locked. The retadr argument is the address of
a 2-longword array containing, in order, the starting and ending
process virtual addresses.
acmode
OpenVMS usage: |
access_mode |
type: |
longword (unsigned) |
access: |
read only |
mechanism: |
by value |
Access mode to be associated with the pages to be locked. The
acmode argument is a longword containing the access
mode. The $PSLDEF macro defines the four access modes.
The most privileged access mode used is the access mode of the caller.
For the $LCKPAG service to complete successfully, the resultant access
mode must be equal to or more privileged than the access mode already
associated with the pages to be locked.
Description
The Lock Pages in Memory service locks a page or range of pages in
memory. The specified virtual pages are forced into the working set and
then locked in memory. A locked page is not swapped out of memory if
the working set of the process is swapped out. These pages are not
candidates for page replacement and in this sense are locked in the
working set as well.
If more than one page is being locked and you need to determine
specifically which pages were previously locked, the pages should be
locked one at a time.
If an error occurs while the $LCKPAG service is locking pages, the
return array, if requested, indicates the pages that were successfully
locked before the error occurred. If no pages are locked, both
longwords in the return address array contain the value --1.
On Alpha and I64 systems, if you are attempting to lock executable
code, you should issue multiple $LCKPAG calls: one to lock the code
pages and others to lock the linkage section references into these
pages.
Required Access or Privileges
The calling process must have PSWAPM privilege to lock pages into
memory.
Required Quota
None
Related Services
You can unlock pages locked in memory with the Unlock Pages from Memory
($ULKPAG) service. Locked pages are automatically unlocked at image
exit.
For more information, refer to the chapter on memory management in the
OpenVMS Programming Concepts Manual.
Condition Values Returned
SS$_WASCLR
|
The service completed successfully. All of the specified pages were
previously unlocked.
|
SS$_WASSET
|
The service completed successfully. At least one of the specified pages
was previously locked.
|
SS$_ACCVIO
|
The input array cannot be read; the output array cannot be written; the
page in the specified range is inaccessible or nonexistent; or an
attempt to lock pages was made by a caller whose access mode is less
privileged than the access mode associated with the pages.
|
SS$_LCKPAGFUL
|
The system-defined maximum limit on the number of pages that can be
locked in memory has been reached.
|
SS$_LDWSETFUL
|
The locked working set is full. If any more pages are locked, not
enough dynamic pages will be available to continue execution.
|
SS$_NOPRIV
|
The process does not have the privilege to lock pages in memory.
|
SS$_PAGOWNVIO
|
The pages could not be locked because the access mode associated with
the call to $LCKPAG was less privileged than the access mode associated
with the pages that were to be locked.
|
$LCKPAG_64 (Alpha and I64)
On Alpha and I64 systems, locks a range of pages in memory. The
specified virtual pages are forced into the working set and then locked
in memory. A locked page is not swapped out of memory if the working
set of the process is swapped out. These pages are not candidates for
page replacement and, in this sense, are locked in the working set as
well.
This service accepts 64-bit addresses.
Format
SYS$LCKPAG_64 start_va_64 ,length_64 ,acmode ,return_va_64
,return_length_64
C Prototype
int sys$lckpag_64 (void *start_va_64, unsigned __int64 length_64,
unsigned int acmode, void *(*(return_va_64)), unsigned __int64
*return_length_64);
Arguments
start_va_64
OpenVMS usage: |
address |
type: |
quadword address |
access: |
read only |
mechanism: |
by value |
The starting virtual address of the pages to be locked. The specified
virtual address will be rounded down to a CPU-specific page boundary.
length_64
OpenVMS usage: |
byte count |
type: |
quadword (unsigned) |
access: |
read only |
mechanism: |
by value |
Length of the virtual address space to be locked. The specified length
will be rounded up to a CPU-specific page boundary so that it includes
all CPU-specific pages in the requested range.
acmode
OpenVMS usage: |
access_mode |
type: |
longword (unsigned) |
access: |
read only |
mechanism: |
by value |
Access mode associated with the pages to be locked. The
acmode argument is a longword containing the access
mode.
The $PSLDEF macro in STARLET.MLB and the file PSLDEF.H in
SYS$STARLET_C.TLB define the following symbols and their values for the
four access modes:
Value |
Symbolic Name |
Access Mode |
0
|
PSL$C_KERNEL
|
Kernel
|
1
|
PSL$C_EXEC
|
Executive
|
2
|
PSL$C_SUPER
|
Supervisor
|
3
|
PSL$C_USER
|
User
|
The most privileged access mode used is the access mode of the caller.
For the $LCKPAG_64 service to complete successfully, the resultant
access mode must be equal to or more privileged than the access mode
already associated with the pages to be locked.
return_va_64
OpenVMS usage: |
address |
type: |
quadword address |
access: |
write only |
mechanism: |
by 32- or 64-bit reference |
The lowest process virtual address of the pages locked in memory. The
return_va_64 argument is the 32- or 64-bit virtual
address of a naturally aligned quadword into which the service returns
the virtual address.
return_length_64
OpenVMS usage: |
byte count |
type: |
quadword (unsigned) |
access: |
write only |
mechanism: |
by 32- or 64-bit reference |
The 32- or 64-bit virtual address of a naturally aligned quadword into
which the service returns the length of the virtual address range
locked in bytes.
Description
The Lock Pages in Memory service locks a range of pages in memory. The
specified virtual pages are forced into the working set and then locked
in memory. A locked page is not swapped out of memory if the working
set of the process is swapped out. These pages are not candidates for
page replacement and, in this sense, are locked in the working set as
well.
If the condition value SS$_ACCVIO is returned by this service, a value
cannot be returned in the memory locations pointed to by the
return_va_64 and return_length_64
arguments. If a condition value other than SS$_ACCVIO is returned, the
returned address and returned length indicate the pages that were
successfully locked before the error occurred. If no pages were locked,
the return_va_64 argument will contain the value -1,
and a value cannot be returned in the memory location pointed
to by the return_length_64 argument.
Required Privileges
A process must have PSWAPM privilege to call the $LCKPAG_64 service.
Required Quota
None
Related Services
$LCKPAG, $ULKPAG, $ULKPAG_64
Condition Values Returned
SS$_WASCLR
|
The service completed successfully. All of the specified pages were
previously unlocked.
|
SS$_WASSET
|
The service completed successfully. At least one of the specified pages
was previously locked in the working set.
|
SS$_ACCVIO
|
The
return_va_64 argument or the
return_length_64 argument cannot be written by the
caller, or an attempt was made to lock pages by a caller whose access
mode is less privileged than the access mode associated with the pages.
|
SS$_LCKPAGFUL
|
The system-defined maximum limit on the number of pages that can be
locked in memory has been reached.
|
SS$_LKWSETFUL
|
The locked working set is full. If any more pages are locked, not
enough dynamic pages will be available to continue execution.
|
SS$_NOPSWAPM
|
The process does not have the privilege to lock pages in memory.
|
SS$_PAGOWNVIO
|
The pages could not be locked because the access mode associated with
the call to $LCKPAG_64 was less privileged than the access mode
associated with the pages that were to be locked.
|
|