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