Various additions and fixes.
This commit is contained in:
parent
74f990ad84
commit
fd04aacee1
57 changed files with 2176 additions and 159 deletions
73
src/lib9/_p9proc.c
Normal file
73
src/lib9/_p9proc.c
Normal file
|
|
@ -0,0 +1,73 @@
|
|||
#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);
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue