Blob
1 #include <u.h>2 #include <libc.h>3 #include "9proc.h"5 static Lock uproclock;6 static Uproc *phash[PIDHASH];8 Uproc*9 _p9uproc(void)10 {11 /* for now, assume getpid is fast or cached */12 int pid;13 Uproc *up;15 pid = getpid();16 again:17 if(0)print("find %d\n", pid);18 lock(&uproclock);19 for(up=phash[pid%PIDHASH]; up; up=up->next){20 if(up->pid == pid){21 if(0)print("found %d\n", pid);22 unlock(&uproclock);23 return up;24 }25 }27 up = mallocz(sizeof(Uproc), 1);28 if(up == nil){29 if(0)print("again %d\n", pid);30 unlock(&uproclock);31 sleep(1000);32 goto again;33 }35 againpipe:36 if(pipe(up->pipe) < 0){37 if(0)print("againpipe %d\n", pid);38 sleep(1000);39 goto againpipe;40 }42 up->pid = pid;43 up->next = phash[pid%PIDHASH];44 phash[pid%PIDHASH] = up;45 if(0)print("link %d\n", pid);46 unlock(&uproclock);47 return up;48 }50 void51 _p9uprocdie(void)52 {53 Uproc **l, *up;54 int pid;56 pid = getpid();57 if(0)print("die %d\n", pid);58 lock(&uproclock);59 for(l=&phash[pid%33]; *l; l=&(*l)->next){60 if((*l)->pid == pid){61 up = *l;62 *l = up->next;63 if(0)print("died %d\n", pid);64 unlock(&uproclock);65 close(up->pipe[0]);66 close(up->pipe[1]);67 free(up);68 return;69 }70 }71 if(0)print("not started %d\n", pid);72 unlock(&uproclock);73 }