From:	CRDGW2::CRDGW2::MRGATE::"SMTP::CRVAX.SRI.COM::RELAY-INFO-VAX" 30-JUN-1989 19:24
To:	MRGATE::"ARISIA::EVERHART"
Subj:	RE: Use C to call SYS$CRMPSC?

Received: From KL.SRI.COM by CRVAX.SRI.COM with TCP; Fri, 30 JUN 89 14:35:15 PDT
Received: from LBL.Gov by KL.SRI.COM with TCP; Fri, 30 Jun 89 14:30:18 PDT
Received: from warner.hepnet by LBL.Gov with VMSmail ;
	Fri, 30 Jun 89 14:27:27 PDT
Date:    Fri, 30 Jun 89 14:27:27 PDT
From: nagy%warner.hepnet@LBL.Gov (Frank J. Nagy/VAX Guru&Wizard)
Message-Id: <890630142727.2b600dc9@LBL.Gov>
Subject: RE: Use C to call SYS$CRMPSC?
To: Info-VAX@kl.sri.com
X-St-Vmsmail-To: info_vax

>   I have a question for all of the C gurus out there.  What I would
>like to do is map a file to virtual memory with a private section using the
>SYS$CRMPSC system service.  What I would like to know, is how do I find a range
>of virtual address that I can use, and set it aside such that the malloc
>function still works correctly.

What I do is to have $CRMPSC expand the P0 region with new virtual addresses.
How this is done:

	1. Specify the inadr argument as a pair of longwords, put 512 into
	   each longword (512 is just convienent, all they do is tell $CRMPSC
	   to work in P0 space).

	2. Specify the retadr argument as a pair of longwords to be written
	   into.  When $CRMPSC returns (successfully), then retadr[0] is the
	   address of the base of the section you have created.  This can be
	   typecast into a C pointer of the appropriate type.  Usually, I
	   just need generic pointers (char *), so I define retadr as:

		char *retadr[2];

	   and then do sys$crmpsc( inadr, retadr, ...);

	3. Make sure the SEC$M_EXPREG flag is set in the flags argument to
	   $CRMPSC to tell the service to expand the P0 address space, 
	   placing the new section in the newly created addresses.

malloc (which is based ultimately on $CRETVA) will continue to work, its
just that the memory pool malloc has to work with will be discontinuous
around your section.

= Dr. Frank J. Nagy   "VAX Guru & Wizard"
= Fermilab Research Division/Electrical and Electronics Dept/Controls Group
= HEPNET: WARNER::NAGY (43198::NAGY) or FNAL::NAGY (43009::NAGY)
= BitNet: NAGY@FNAL
= USnail: Fermilab POB 500 MS/220 Batavia, IL 60510