Blame


1 76193d7c 2003-09-30 devnull #include "threadimpl.h"
2 76193d7c 2003-09-30 devnull
3 76193d7c 2003-09-30 devnull /* this will need work */
4 76193d7c 2003-09-30 devnull enum
5 76193d7c 2003-09-30 devnull {
6 76193d7c 2003-09-30 devnull PTABHASH = 257,
7 76193d7c 2003-09-30 devnull };
8 76193d7c 2003-09-30 devnull
9 5a8e63b2 2004-02-29 devnull static int multi;
10 5a8e63b2 2004-02-29 devnull static Proc *theproc;
11 5a8e63b2 2004-02-29 devnull
12 5a8e63b2 2004-02-29 devnull void
13 5a8e63b2 2004-02-29 devnull _threadmultiproc(void)
14 5a8e63b2 2004-02-29 devnull {
15 5a8e63b2 2004-02-29 devnull if(multi == 0){
16 5a8e63b2 2004-02-29 devnull multi = 1;
17 5a8e63b2 2004-02-29 devnull _threadsetproc(theproc);
18 5a8e63b2 2004-02-29 devnull }
19 5a8e63b2 2004-02-29 devnull }
20 5a8e63b2 2004-02-29 devnull
21 76193d7c 2003-09-30 devnull static Lock ptablock;
22 76193d7c 2003-09-30 devnull Proc *ptab[PTABHASH];
23 76193d7c 2003-09-30 devnull
24 76193d7c 2003-09-30 devnull void
25 76193d7c 2003-09-30 devnull _threadsetproc(Proc *p)
26 76193d7c 2003-09-30 devnull {
27 76193d7c 2003-09-30 devnull int h;
28 76193d7c 2003-09-30 devnull
29 5a8e63b2 2004-02-29 devnull if(!multi){
30 5a8e63b2 2004-02-29 devnull theproc = p;
31 5a8e63b2 2004-02-29 devnull return;
32 5a8e63b2 2004-02-29 devnull }
33 76193d7c 2003-09-30 devnull lock(&ptablock);
34 76193d7c 2003-09-30 devnull h = ((unsigned)p->pid)%PTABHASH;
35 76193d7c 2003-09-30 devnull p->link = ptab[h];
36 76193d7c 2003-09-30 devnull unlock(&ptablock);
37 76193d7c 2003-09-30 devnull ptab[h] = p;
38 76193d7c 2003-09-30 devnull }
39 76193d7c 2003-09-30 devnull
40 76193d7c 2003-09-30 devnull static Proc*
41 76193d7c 2003-09-30 devnull __threadgetproc(int rm)
42 76193d7c 2003-09-30 devnull {
43 76193d7c 2003-09-30 devnull Proc **l, *p;
44 76193d7c 2003-09-30 devnull int h, pid;
45 76193d7c 2003-09-30 devnull
46 5a8e63b2 2004-02-29 devnull if(!multi)
47 5a8e63b2 2004-02-29 devnull return theproc;
48 5a8e63b2 2004-02-29 devnull
49 76193d7c 2003-09-30 devnull pid = _threadgetpid();
50 76193d7c 2003-09-30 devnull
51 76193d7c 2003-09-30 devnull lock(&ptablock);
52 76193d7c 2003-09-30 devnull h = ((unsigned)pid)%PTABHASH;
53 76193d7c 2003-09-30 devnull for(l=&ptab[h]; p=*l; l=&p->link){
54 76193d7c 2003-09-30 devnull if(p->pid == pid){
55 76193d7c 2003-09-30 devnull if(rm)
56 76193d7c 2003-09-30 devnull *l = p->link;
57 76193d7c 2003-09-30 devnull unlock(&ptablock);
58 76193d7c 2003-09-30 devnull return p;
59 76193d7c 2003-09-30 devnull }
60 76193d7c 2003-09-30 devnull }
61 76193d7c 2003-09-30 devnull unlock(&ptablock);
62 76193d7c 2003-09-30 devnull return nil;
63 76193d7c 2003-09-30 devnull }
64 76193d7c 2003-09-30 devnull
65 76193d7c 2003-09-30 devnull Proc*
66 76193d7c 2003-09-30 devnull _threadgetproc(void)
67 76193d7c 2003-09-30 devnull {
68 76193d7c 2003-09-30 devnull return __threadgetproc(0);
69 76193d7c 2003-09-30 devnull }
70 76193d7c 2003-09-30 devnull
71 76193d7c 2003-09-30 devnull Proc*
72 76193d7c 2003-09-30 devnull _threaddelproc(void)
73 76193d7c 2003-09-30 devnull {
74 76193d7c 2003-09-30 devnull return __threadgetproc(1);
75 76193d7c 2003-09-30 devnull }