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 76193d7c 2003-09-30 devnull static Lock ptablock;
10 76193d7c 2003-09-30 devnull Proc *ptab[PTABHASH];
11 76193d7c 2003-09-30 devnull
12 76193d7c 2003-09-30 devnull void
13 76193d7c 2003-09-30 devnull _threadsetproc(Proc *p)
14 76193d7c 2003-09-30 devnull {
15 76193d7c 2003-09-30 devnull int h;
16 76193d7c 2003-09-30 devnull
17 76193d7c 2003-09-30 devnull lock(&ptablock);
18 76193d7c 2003-09-30 devnull h = ((unsigned)p->pid)%PTABHASH;
19 76193d7c 2003-09-30 devnull p->link = ptab[h];
20 76193d7c 2003-09-30 devnull unlock(&ptablock);
21 76193d7c 2003-09-30 devnull ptab[h] = p;
22 76193d7c 2003-09-30 devnull }
23 76193d7c 2003-09-30 devnull
24 76193d7c 2003-09-30 devnull static Proc*
25 76193d7c 2003-09-30 devnull __threadgetproc(int rm)
26 76193d7c 2003-09-30 devnull {
27 76193d7c 2003-09-30 devnull Proc **l, *p;
28 76193d7c 2003-09-30 devnull int h, pid;
29 76193d7c 2003-09-30 devnull Thread *t;
30 76193d7c 2003-09-30 devnull ulong *s;
31 76193d7c 2003-09-30 devnull
32 76193d7c 2003-09-30 devnull s = (ulong*)((ulong)&pid & ~(STKSIZE-1));
33 76193d7c 2003-09-30 devnull if(s[0] == STKMAGIC){
34 76193d7c 2003-09-30 devnull t = (Thread*)s[1];
35 76193d7c 2003-09-30 devnull return t->proc;
36 76193d7c 2003-09-30 devnull }
37 76193d7c 2003-09-30 devnull
38 76193d7c 2003-09-30 devnull pid = _threadgetpid();
39 76193d7c 2003-09-30 devnull
40 76193d7c 2003-09-30 devnull lock(&ptablock);
41 76193d7c 2003-09-30 devnull h = ((unsigned)pid)%PTABHASH;
42 76193d7c 2003-09-30 devnull for(l=&ptab[h]; p=*l; l=&p->link){
43 76193d7c 2003-09-30 devnull if(p->pid == pid){
44 76193d7c 2003-09-30 devnull if(rm)
45 76193d7c 2003-09-30 devnull *l = p->link;
46 76193d7c 2003-09-30 devnull unlock(&ptablock);
47 76193d7c 2003-09-30 devnull return p;
48 76193d7c 2003-09-30 devnull }
49 76193d7c 2003-09-30 devnull }
50 76193d7c 2003-09-30 devnull unlock(&ptablock);
51 76193d7c 2003-09-30 devnull return nil;
52 76193d7c 2003-09-30 devnull }
53 76193d7c 2003-09-30 devnull
54 76193d7c 2003-09-30 devnull Proc*
55 76193d7c 2003-09-30 devnull _threadgetproc(void)
56 76193d7c 2003-09-30 devnull {
57 76193d7c 2003-09-30 devnull return __threadgetproc(0);
58 76193d7c 2003-09-30 devnull }
59 76193d7c 2003-09-30 devnull
60 76193d7c 2003-09-30 devnull Proc*
61 76193d7c 2003-09-30 devnull _threaddelproc(void)
62 76193d7c 2003-09-30 devnull {
63 76193d7c 2003-09-30 devnull return __threadgetproc(1);
64 76193d7c 2003-09-30 devnull }