Path: utzoo!utgpu!jarvis.csri.toronto.edu!rutgers!tut.cis.ohio-state.edu!ucbvax!MAINE.BITNET!MICHAEL From: MICHAEL@MAINE.BITNET (Michael Johnson) Newsgroups: comp.lang.asm370 Subject: Re: (no subject given) Message-ID: <8907010024.AA16862@jade.berkeley.edu> Date: 29 Jun 89 15:29:09 GMT Sender: daemon@ucbvax.BERKELEY.EDU Reply-To: IBM 370 Assembly Programming Discussion List Distribution: inet Organization: The Internet Lines: 56 The basic definition of a reentrant program is one that can be executed by two separate control threads simultaneously without harm. I.e. the program can be entered, then reentered, without ill effect. In practical terms what this means is that all of your variables must be in a free storage area acquired by the program. The address of this storage area must be in a working register which the program uses as a base register. For a truly reentrant program, these storage areas must either have a lifetime only as long as the invocation of the program, or must exist in completely different address spaces. The "reentrant" code in the CMS nucleus works by this latter approach. The variables it uses are in the storage of the virtual machine. Separate invocations of the CMS nucleus (i.e. IPL CMS) address totally different address spaces, even though the nucleus code itself is being shared by many virtual machines. For all practical purposes, programs that you write to run under CMS but which you want to have be reentrant need only acquire and release dynamic storage to keep their variables in. If you do this (and don't write self-modifying code) then you will be writing reentrant programs. Most macros in CMS that build parameter lists have an MF=L and MF=(E,list) format. The MF=L is used in the DSECT for your storage area. The MF=(E,list) is used to make the macro build its actual parameter list in your working storage. For example, the following code section illustrates: LA R0,WORKSIZE Get size of work area in dwords DMSFREE DWORDS=(0),ERROR=NOSTORE LR R10,R1 Load WORKAREA base address USING WORKAREA,R10 ST R10,WORKWORD Set USER WORD value HNDIO MF=(L,HNDIO) Initialize HNDIO plist . . . HNDIO SET,DEVNAME=RDR1,MF=(E,HNDIO),EXIT=RDREXIT, DEVICE=00C,UWORD=(R10) . . . WORKAREA DSECT , WORKWORD DS F WORKSAVE DS 18F HNDIO HNDIO MF=L . . . Where I have put in periods there would logically be code to do other things. I merely have illustrated the major elements of using a macro with MF= to write reentrant code. Michael Johnson "We are the Priests of the Temples University of Maine System of Syrinx. Our great computers fill Computing and Data Processing Services the hallowed halls." - Neil Peart