plan9port/src/libthread/proctab.c
rsc 5a8e63b2f0 Fighting the good fight.
Move libfmt, libutf into subdirectories of lib9.

Add poll-based socket i/o to libthread, so that we can
avoid using multiple procs when possible, thus removing
dependence on crappy pthreads implementations.

Convert samterm, acme to the single-proc libthread.

Bring libcomplete, acme up-to-date w.r.t. Plan 9 distribution.
2004-02-29 22:10:26 +00:00

75 lines
903 B
C

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