2 cf4f3eaf 2004-11-08 devnull * Proc structure hash table indexed by proctabid() (usually getpid()).
3 cf4f3eaf 2004-11-08 devnull * No lock is necessary for lookups (important when called from signal
4 cf4f3eaf 2004-11-08 devnull * handlers).
6 cf4f3eaf 2004-11-08 devnull * To be included from other files (e.g., Linux-clone.c).
9 cf4f3eaf 2004-11-08 devnull #define T ((void*)-1)
13 cf4f3eaf 2004-11-08 devnull PTABHASH = 1031,
16 cf4f3eaf 2004-11-08 devnull static Lock ptablock;
17 cf4f3eaf 2004-11-08 devnull static Proc *proctab[PTABHASH];
18 cf4f3eaf 2004-11-08 devnull static Proc *theproc;
19 cf4f3eaf 2004-11-08 devnull static int multi;
22 cf4f3eaf 2004-11-08 devnull _threadmultiproc(void)
24 cf4f3eaf 2004-11-08 devnull if(multi == 0){
25 cf4f3eaf 2004-11-08 devnull multi = 1;
26 cf4f3eaf 2004-11-08 devnull _threadsetproc(theproc);
31 cf4f3eaf 2004-11-08 devnull _threadsetproc(Proc *p)
33 cf4f3eaf 2004-11-08 devnull int i, h;
34 cf4f3eaf 2004-11-08 devnull Proc **t;
36 cf4f3eaf 2004-11-08 devnull if(!multi){
37 cf4f3eaf 2004-11-08 devnull theproc = p;
40 cf4f3eaf 2004-11-08 devnull lock(&ptablock);
41 cf4f3eaf 2004-11-08 devnull p->procid = procid();
42 cf4f3eaf 2004-11-08 devnull h = p->procid%PTABHASH;
43 cf4f3eaf 2004-11-08 devnull for(i=0; i<PTABHASH; i++){
44 cf4f3eaf 2004-11-08 devnull t = &proctab[(h+i)%PTABHASH];
45 cf4f3eaf 2004-11-08 devnull if(*t==nil || *t==T){
50 cf4f3eaf 2004-11-08 devnull unlock(&ptablock);
51 cf4f3eaf 2004-11-08 devnull if(i == PTABHASH)
52 cf4f3eaf 2004-11-08 devnull sysfatal("too many procs - proctab is full");
55 cf4f3eaf 2004-11-08 devnull static Proc**
56 cf4f3eaf 2004-11-08 devnull _threadfindproc(int id)
58 cf4f3eaf 2004-11-08 devnull int i, h;
59 cf4f3eaf 2004-11-08 devnull Proc **t;
61 cf4f3eaf 2004-11-08 devnull if(!multi)
62 cf4f3eaf 2004-11-08 devnull return &theproc;
64 cf4f3eaf 2004-11-08 devnull h = id%PTABHASH;
65 cf4f3eaf 2004-11-08 devnull for(i=0; i<PTABHASH; i++){
66 cf4f3eaf 2004-11-08 devnull t = &proctab[(h+i)%PTABHASH];
67 cf4f3eaf 2004-11-08 devnull if(*t != nil && *t != T && (*t)->procid == id){
68 cf4f3eaf 2004-11-08 devnull unlock(&ptablock);
69 cf4f3eaf 2004-11-08 devnull return t;
72 cf4f3eaf 2004-11-08 devnull return nil;
76 cf4f3eaf 2004-11-08 devnull _threadgetproc(void)
78 cf4f3eaf 2004-11-08 devnull Proc **t;
80 cf4f3eaf 2004-11-08 devnull t = _threadfindproc(procid());
81 cf4f3eaf 2004-11-08 devnull if(t == nil)
82 cf4f3eaf 2004-11-08 devnull return nil;
83 cf4f3eaf 2004-11-08 devnull return *t;
87 cf4f3eaf 2004-11-08 devnull _threaddelproc(void)
89 cf4f3eaf 2004-11-08 devnull Proc **t, *p;
91 cf4f3eaf 2004-11-08 devnull t = _threadfindproc(procid());
92 cf4f3eaf 2004-11-08 devnull if(t == nil)
93 cf4f3eaf 2004-11-08 devnull return nil;
96 cf4f3eaf 2004-11-08 devnull return p;