blob: 222d8c25d7705c2e9aac168c021023caf04b337b (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
|
#include "threadimpl.h"
/* this will need work */
enum
{
PTABHASH = 257,
};
static Lock ptablock;
Proc *ptab[PTABHASH];
void
_threadsetproc(Proc *p)
{
int h;
lock(&ptablock);
h = ((unsigned)p->pid)%PTABHASH;
p->link = ptab[h];
unlock(&ptablock);
ptab[h] = p;
}
static Proc*
__threadgetproc(int rm)
{
Proc **l, *p;
int h, pid;
Thread *t;
ulong *s;
/* fails on linux, probably because the main stack
* has to be grown a page at a time instead of the big jump?
s = (ulong*)((ulong)&pid & ~(STKSIZE-1));
if(s[0] == STKMAGIC){
t = (Thread*)s[1];
return t->proc;
}
*/
pid = _threadgetpid();
lock(&ptablock);
h = ((unsigned)pid)%PTABHASH;
for(l=&ptab[h]; p=*l; l=&p->link){
if(p->pid == pid){
if(rm)
*l = p->link;
unlock(&ptablock);
return p;
}
}
unlock(&ptablock);
return nil;
}
Proc*
_threadgetproc(void)
{
return __threadgetproc(0);
}
Proc*
_threaddelproc(void)
{
return __threadgetproc(1);
}
|