#include "threadimpl.h" | |
/* this will need work */ | |
enum | |
{ | |
PTABHASH = 257, | |
}; | |
static int multi; | |
static Proc *theproc; | |
void | |
_threadmultiproc(void) | |
{ | |
if(multi == 0){ | |
multi = 1; | |
_threadsetproc(theproc); | |
} | |
} | |
static Lock ptablock; | |
Proc *ptab[PTABHASH]; | |
void | |
_threadsetproc(Proc *p) | |
{ | |
int h; | |
if(!multi){ | |
theproc = p; | |
return; | |
} | |
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; | |
if(!multi) | |
return theproc; | |
pid = getpid(); | |
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); | |
} |