Blame


1 cf4f3eaf 2004-11-08 devnull /*
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).
5 cf4f3eaf 2004-11-08 devnull *
6 cf4f3eaf 2004-11-08 devnull * To be included from other files (e.g., Linux-clone.c).
7 cf4f3eaf 2004-11-08 devnull */
8 cf4f3eaf 2004-11-08 devnull
9 cf4f3eaf 2004-11-08 devnull #define T ((void*)-1)
10 cf4f3eaf 2004-11-08 devnull
11 cf4f3eaf 2004-11-08 devnull enum
12 cf4f3eaf 2004-11-08 devnull {
13 cf4f3eaf 2004-11-08 devnull PTABHASH = 1031,
14 cf4f3eaf 2004-11-08 devnull };
15 cf4f3eaf 2004-11-08 devnull
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;
20 cf4f3eaf 2004-11-08 devnull
21 cf4f3eaf 2004-11-08 devnull void
22 cf4f3eaf 2004-11-08 devnull _threadmultiproc(void)
23 cf4f3eaf 2004-11-08 devnull {
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);
27 cf4f3eaf 2004-11-08 devnull }
28 cf4f3eaf 2004-11-08 devnull }
29 cf4f3eaf 2004-11-08 devnull
30 cf4f3eaf 2004-11-08 devnull void
31 cf4f3eaf 2004-11-08 devnull _threadsetproc(Proc *p)
32 cf4f3eaf 2004-11-08 devnull {
33 cf4f3eaf 2004-11-08 devnull int i, h;
34 cf4f3eaf 2004-11-08 devnull Proc **t;
35 cf4f3eaf 2004-11-08 devnull
36 cf4f3eaf 2004-11-08 devnull if(!multi){
37 cf4f3eaf 2004-11-08 devnull theproc = p;
38 cf4f3eaf 2004-11-08 devnull return;
39 cf4f3eaf 2004-11-08 devnull }
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){
46 cf4f3eaf 2004-11-08 devnull *t = p;
47 cf4f3eaf 2004-11-08 devnull break;
48 cf4f3eaf 2004-11-08 devnull }
49 cf4f3eaf 2004-11-08 devnull }
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");
53 cf4f3eaf 2004-11-08 devnull }
54 cf4f3eaf 2004-11-08 devnull
55 cf4f3eaf 2004-11-08 devnull static Proc**
56 cf4f3eaf 2004-11-08 devnull _threadfindproc(int id)
57 cf4f3eaf 2004-11-08 devnull {
58 cf4f3eaf 2004-11-08 devnull int i, h;
59 cf4f3eaf 2004-11-08 devnull Proc **t;
60 cf4f3eaf 2004-11-08 devnull
61 cf4f3eaf 2004-11-08 devnull if(!multi)
62 cf4f3eaf 2004-11-08 devnull return &theproc;
63 cf4f3eaf 2004-11-08 devnull
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;
70 cf4f3eaf 2004-11-08 devnull }
71 cf4f3eaf 2004-11-08 devnull }
72 cf4f3eaf 2004-11-08 devnull return nil;
73 cf4f3eaf 2004-11-08 devnull }
74 cf4f3eaf 2004-11-08 devnull
75 cf4f3eaf 2004-11-08 devnull Proc*
76 cf4f3eaf 2004-11-08 devnull _threadgetproc(void)
77 cf4f3eaf 2004-11-08 devnull {
78 cf4f3eaf 2004-11-08 devnull Proc **t;
79 cf4f3eaf 2004-11-08 devnull
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;
84 cf4f3eaf 2004-11-08 devnull }
85 cf4f3eaf 2004-11-08 devnull
86 cf4f3eaf 2004-11-08 devnull Proc*
87 cf4f3eaf 2004-11-08 devnull _threaddelproc(void)
88 cf4f3eaf 2004-11-08 devnull {
89 cf4f3eaf 2004-11-08 devnull Proc **t, *p;
90 cf4f3eaf 2004-11-08 devnull
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;
94 cf4f3eaf 2004-11-08 devnull p = *t;
95 cf4f3eaf 2004-11-08 devnull *t = T;
96 cf4f3eaf 2004-11-08 devnull return p;
97 cf4f3eaf 2004-11-08 devnull }