From cf4f3eafc6016ccdb57773215dcdd5ebac95c07d Mon Sep 17 00:00:00 2001 From: rsc Date: Mon, 8 Nov 2004 16:03:42 +0000 Subject: extra files --- src/libthread/proctab.ch | 97 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 97 insertions(+) create mode 100644 src/libthread/proctab.ch (limited to 'src/libthread/proctab.ch') diff --git a/src/libthread/proctab.ch b/src/libthread/proctab.ch new file mode 100644 index 00000000..d51543f9 --- /dev/null +++ b/src/libthread/proctab.ch @@ -0,0 +1,97 @@ +/* + * Proc structure hash table indexed by proctabid() (usually getpid()). + * No lock is necessary for lookups (important when called from signal + * handlers). + * + * To be included from other files (e.g., Linux-clone.c). + */ + +#define T ((void*)-1) + +enum +{ + PTABHASH = 1031, +}; + +static Lock ptablock; +static Proc *proctab[PTABHASH]; +static Proc *theproc; +static int multi; + +void +_threadmultiproc(void) +{ + if(multi == 0){ + multi = 1; + _threadsetproc(theproc); + } +} + +void +_threadsetproc(Proc *p) +{ + int i, h; + Proc **t; + + if(!multi){ + theproc = p; + return; + } + lock(&ptablock); + p->procid = procid(); + h = p->procid%PTABHASH; + for(i=0; iprocid == id){ + unlock(&ptablock); + return t; + } + } + return nil; +} + +Proc* +_threadgetproc(void) +{ + Proc **t; + + t = _threadfindproc(procid()); + if(t == nil) + return nil; + return *t; +} + +Proc* +_threaddelproc(void) +{ + Proc **t, *p; + + t = _threadfindproc(procid()); + if(t == nil) + return nil; + p = *t; + *t = T; + return p; +} -- cgit v1.2.3