mirror of
https://github.com/9fans/plan9port.git
synced 2025-01-15 11:20:03 +00:00
74 lines
1.2 KiB
C
74 lines
1.2 KiB
C
|
#include <u.h>
|
||
|
#include <libc.h>
|
||
|
#include "9proc.h"
|
||
|
|
||
|
static Lock uproclock;
|
||
|
static Uproc *phash[PIDHASH];
|
||
|
|
||
|
Uproc*
|
||
|
_p9uproc(void)
|
||
|
{
|
||
|
/* for now, assume getpid is fast or cached */
|
||
|
int pid;
|
||
|
Uproc *up;
|
||
|
|
||
|
pid = getpid();
|
||
|
again:
|
||
|
if(0)print("find %d\n", pid);
|
||
|
lock(&uproclock);
|
||
|
for(up=phash[pid%PIDHASH]; up; up=up->next){
|
||
|
if(up->pid == pid){
|
||
|
if(0)print("found %d\n", pid);
|
||
|
unlock(&uproclock);
|
||
|
return up;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
up = mallocz(sizeof(Uproc), 1);
|
||
|
if(up == nil){
|
||
|
if(0)print("again %d\n", pid);
|
||
|
unlock(&uproclock);
|
||
|
sleep(1000);
|
||
|
goto again;
|
||
|
}
|
||
|
|
||
|
againpipe:
|
||
|
if(pipe(up->pipe) < 0){
|
||
|
if(0)print("againpipe %d\n", pid);
|
||
|
sleep(1000);
|
||
|
goto againpipe;
|
||
|
}
|
||
|
|
||
|
up->pid = pid;
|
||
|
up->next = phash[pid%PIDHASH];
|
||
|
phash[pid%PIDHASH] = up;
|
||
|
if(0)print("link %d\n", pid);
|
||
|
unlock(&uproclock);
|
||
|
return up;
|
||
|
}
|
||
|
|
||
|
void
|
||
|
_p9uprocdie(void)
|
||
|
{
|
||
|
Uproc **l, *up;
|
||
|
int pid;
|
||
|
|
||
|
pid = getpid();
|
||
|
if(0)print("die %d\n", pid);
|
||
|
lock(&uproclock);
|
||
|
for(l=&phash[pid%33]; *l; l=&(*l)->next){
|
||
|
if((*l)->pid == pid){
|
||
|
up = *l;
|
||
|
*l = up->next;
|
||
|
if(0)print("died %d\n", pid);
|
||
|
unlock(&uproclock);
|
||
|
close(up->pipe[0]);
|
||
|
close(up->pipe[1]);
|
||
|
free(up);
|
||
|
return;
|
||
|
}
|
||
|
}
|
||
|
if(0)print("not started %d\n", pid);
|
||
|
unlock(&uproclock);
|
||
|
}
|