Trailing-Edge
-
PDP-10 Archives
-
SRI_NIC_PERM_FS_1_19910112
-
c/lib5/usys/getpid.c
There are 8 other files named getpid.c in the archive. Click here to see a list.
/* GETPID - USYS simulation of getpid().
**
** Copyright (c) 1987 by Ken Harrenstien, SRI International
**
** GFRKS% algorithm by Greg Satz / Stanford University / 15-Sep-84
**
** See USYS.DOC for an explanation of the T20/10X PID encoding.
*/
#include "c-env.h"
#if SYS_T20+SYS_10X
#include "jsys.h"
#include "sys/usysig.h"
#endif
#if SYS_10X
#define MAP_SIZE 100
struct fork_map {
unsigned parap : 18;
unsigned infp : 18;
unsigned supp : 18;
unsigned handle : 18;
unsigned status;
};
#endif /* 10X */
/* These must be externals so fork() and kill() can hack them. */
int _pidslf = 0; /* Saved getpid() value for process */
int _pidpar = 0; /* Saved parent PID from fork() */
int
getpid()
{
#if SYS_T10+SYS_WAITS
/* PJOB returns job # */
asm("\
skipe 1,.pidslf\n\
popj 17,\n\
pjob 1,\n\
movem 1,.pidslf\n"); /* Get job # as return val and store it. */
#elif SYS_ITS
/* Get user index # */
asm("\
skipe 1,.pidslf\n\
popj 17,\n\
.suset [.ruind,,1]\n\
movem 1,.pidslf\n"); /* Get user idx # as ret val and store it. */
#elif SYS_T20
/* T20 and 10X need to be careful to suspend interrupts as otherwise
** successive calls might return different values if both decide
** to generate a PID!
*/
int acs[5], argblk[3];
USYS_BEG();
if (_pidslf) /* Check now that ints are off */
USYS_RET(_pidslf);
acs[1] = 3; /* Length of arg blk */
acs[2] = (int)argblk; /* Addr of arg blk */
argblk[0] = _MUCRE; /* Function: create new PID */
argblk[1] = _FHSLF; /* for this process */
if (jsys(MUTIL, acs) <= 0 /* Get PID! */
|| jsys(GJINF, acs) <= 0) /* and job # */
USYS_RET(-1);
_pidslf = (argblk[2] & ~0777777) | (acs[3] & 0777);
USYS_RET(_pidslf);
#elif SYS_10X
int cnt, ablock[5];
struct fork_map *sup, *fmp, *count();
struct fork_map fma[MAP_SIZE];
USYS_BEG(); /* Disable interrupts */
if (_pidslf) /* Check now that ints are off */
USYS_RET(_pidslf);
fmp = fma;
ablock[1] = _FHTOP;
ablock[2] = (int)fmp;
if (jsys(GFRKS, ablock) <= 0 /* Get fork tree info */
|| jsys(GJINF, ablock) <= 0) /* Get job info */
USYS_RET(-1);
while (fmp->supp != 0) /* find superior */
fmp = (struct fork_map *) fmp->supp;
sup = fmp; /* save ptr to superior */
cnt = 0; /* initialize count */
if (count(fmp, &cnt) == sup) /* didn't find _FHSLF */
USYS_RET(-1);
/* Return job # and node cnt */
_pidslf = (cnt << 18) | (ablock[3] & 0777);
USYS_RET(_pidslf);
#else
#error getpid() not implemented for this system.
#endif
}
#if SYS_10X
/*
* Count fork map in preorder
*/
static struct fork_map *
count(ptr, cnt)
struct fork_map *ptr;
int *cnt;
{
struct fork_map *sptr = 0;
(*cnt)++; /* count fork */
if (ptr->handle == _FHSLF)
return ptr;
if (ptr->infp != 0) /* does inferior exist (left) */
sptr = count((struct fork_map *)(ptr->infp), cnt);
if (sptr == 0 && ptr->parap != 0) /* check for parallel */
sptr = count((struct fork_map *)(ptr->parap), cnt);
return sptr;
}
#endif /* 10X */