HP OpenVMS Systemsask the wizard |
The Question is:
I am working with $CRMPSC and related services and seem to be a bit confused as
to what's going on. I am attempting to create a system global section which is
backed by the pagefile.
If I run my "proof of concept" in two different sessions under the debugger I
can see the data changing (in the other process).
If I then call $UPDSECW to write the global section out $UPDSEC returns
SS$_NOTMODIFIED at both the return value and in the IOSB.
Why am I seeing SS$_NOTMODIFIED as the return value when I have obviously (at
least I think I have) changed data in the section and observed the changed
data in another process which has the section mapped (by running the same
program). Am I misunderstand
ing the use of $UPDSEC when a section is pagefile backed?
The example I have been playing with follows. Error checking and anything
unnecessary has been removed. The example has only been tested on OpenVMS 7.3.
#include <descrip.h>
#include <efndef.h>
#include <lib$routines.h>
#include <psldef.h>
#include <secdef.h>
#include <starlet.h>
#include <syidef.h>
#include <string.h>
typedef struct {
int status;
int unused;
} IOSB;
void main(void) {
IOSB iosb;
int status;
$DESCRIPTOR(SecDsc, "XferData");
int inadr[ ] = { 0x200, 0x200 },
mapadr[2],
retadr[2];
int flags = SEC$M_GBL | SEC$M_DZRO | SEC$M_EXPREG | SEC$M_WRT |
SEC$M_SYSGBL | SEC$M_PAGFIL;
status = sys$crmpsc(&inadr, /* inadr.r */
&retadr, /* retadr.r */
PSL$C_USER, /* acmode.v */
flags, /* flags.v */
&SecDsc, /* gsdnam.d */
0, /* ident.r */
0, /* relpag.v */
0, /* chan.v */
32, /* pagcnt.v */
0, /* vbn.v */
0, /* prot.v */
32); /* pfc.v */
int *ptr = (int *) retadr[0];
for (int i = 1; i < 2048; ptr++, i++)
*ptr = 0xaabbccdd;
status = sys$updsecw(&retadr, &mapadr, PSL$C_USER, 0, EFN$C_ENF, &iosb, 0, 0);
The Answer is :
The sys$updsec and sys$updsecw services are intended to write the pages
that the calling process has modified out to the backing storage file.
(Key here is that the information on modified pages is process-local.)
NOTMODIFIED, no pages in the section were modified
Facility: SYSTEM, System Services
Explanation: The update request completed successfully without queuing any
I/O requests because no pages in the input address range had
been modified. The operating system does not normally display
this message; the user program should be able to detect and
respond to the condition.
User Action: None.
When a section is backed by a page file, the data is considered volatile.
The data itself arguably resides in system virtual memory, and will vanish
when there are no processes mapped to the section file. (The page file
is used to permit the paging of the memory associated with larger sections,
and not to provide the ability to survive system or application restarts.)
If you wish your data to survive process rundowns or system restarts, you
should use a section that is backed by an application section file.
Topic (1661) contains a list of some of the more common programming
errors, and contains pointers to topics on correctly accessing shared
memory and on correct interactions with the memory caches. In addition
to (1661), topics (6984) and (7383) will be of interest here, as will
(2681) and (2486).
|