| #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 = _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); |
| } |