commit - c7acb53e0384f6b091fdfea3c74c4034d9f4cf1b
commit + 48bfee4e5b72db021da3538c97ef68ce2308f12b
blob - 902a957908f1c6c20f3d2dcd80d22952b1677d7a (mode 644)
blob + /dev/null
--- src/lib9/_p9proc-Linux.c
+++ /dev/null
-#ifdef __Linux26__
-#include "_p9proc-pthread.c"
-#else
-#include "_p9proc-getpid.c"
-#endif
blob - 9543bf2407c586755e85d19e9a8ae300e789d8ad (mode 644)
blob + /dev/null
--- src/lib9/_p9proc-getpid.c
+++ /dev/null
-/*
- * This needs to be callable from a signal handler, so it has been
- * written to avoid locks. The only lock is the one used to acquire
- * an entry in the table, and we make sure that acquiring is done
- * when not in a handler. Lookup and delete do not need locks.
- * It's a scan-forward hash table. To avoid breaking chains,
- * T ((void*)-1) is used as a non-breaking nil.
- */
-
-#include <u.h>
-#include <libc.h>
-#include "9proc.h"
-
-enum { PIDHASH = 1021 };
-
-#define T ((void*)-1)
-static Uproc *alluproc[PIDHASH];
-static int allupid[PIDHASH];
-static Lock uproclock;
-
-void
-_clearuproc(void)
-{
- int i;
-
- /* called right after fork - no locking needed */
- for(i=0; i<PIDHASH; i++)
- if(alluproc[i] != T && alluproc[i] != 0)
- free(alluproc[i]);
- memset(alluproc, 0, sizeof alluproc);
- memset(allupid, 0, sizeof allupid);
-}
-
-Uproc*
-_p9uproc(int inhandler)
-{
- int i, h, pid;
- Uproc *up;
-
- /* for now, assume getpid is fast or cached */
- pid = getpid();
-
- /*
- * this part - the lookup - needs to run without locks
- * so that it can safely be called from within the notify handler.
- * notify calls _p9uproc, and fork and rfork call _p9uproc
- * in both parent and child, so if we're in a signal handler,
- * we should find something in the table.
- */
- h = pid%PIDHASH;
- for(i=0; i<PIDHASH; i++){
- up = alluproc[h];
- if(up == nil)
- break;
- if(allupid[h] == pid)
- return up;
- if(++h == PIDHASH)
- h = 0;
- }
-
- if(inhandler){
- fprint(2, "%s: did not find uproc for pid %d in signal handler\n", argv0, pid);
- abort();
- }
-
- /* need to allocate */
- while((up = mallocz(sizeof(Uproc), 1)) == nil)
- sleep(1000);
-
- /* fprint(2, "alloc uproc for pid %d\n", pid); */
- up->pid = pid;
- lock(&uproclock);
- h = pid%PIDHASH;
- for(i=0; i<PIDHASH; i++){
- if(alluproc[h]==T || alluproc[h]==nil){
- alluproc[h] = up;
- allupid[h] = pid;
- unlock(&uproclock);
- return up;
- }
- if(++h == PIDHASH)
- h = 0;
- }
- unlock(&uproclock);
-
- /* out of pids! */
- sysfatal("too many processes in uproc table");
- return nil;
-}
-
-void
-_p9uprocdie(void)
-{
- Uproc *up;
- int pid, i, h;
-
- pid = getpid();
- /* fprint(2, "reap uproc for pid %d\n", pid); */
- h = pid%PIDHASH;
- for(i=0; i<PIDHASH; i++){
- up = alluproc[h];
- if(up == nil)
- break;
- if(up == T)
- continue;
- if(allupid[h] == pid){
- up = alluproc[h];
- alluproc[h] = T;
- free(up);
- allupid[h] = 0;
- }
- }
-}
blob - 9543bf2407c586755e85d19e9a8ae300e789d8ad (mode 644)
blob + /dev/null
--- src/lib9/_p9proc.c
+++ /dev/null
-/*
- * This needs to be callable from a signal handler, so it has been
- * written to avoid locks. The only lock is the one used to acquire
- * an entry in the table, and we make sure that acquiring is done
- * when not in a handler. Lookup and delete do not need locks.
- * It's a scan-forward hash table. To avoid breaking chains,
- * T ((void*)-1) is used as a non-breaking nil.
- */
-
-#include <u.h>
-#include <libc.h>
-#include "9proc.h"
-
-enum { PIDHASH = 1021 };
-
-#define T ((void*)-1)
-static Uproc *alluproc[PIDHASH];
-static int allupid[PIDHASH];
-static Lock uproclock;
-
-void
-_clearuproc(void)
-{
- int i;
-
- /* called right after fork - no locking needed */
- for(i=0; i<PIDHASH; i++)
- if(alluproc[i] != T && alluproc[i] != 0)
- free(alluproc[i]);
- memset(alluproc, 0, sizeof alluproc);
- memset(allupid, 0, sizeof allupid);
-}
-
-Uproc*
-_p9uproc(int inhandler)
-{
- int i, h, pid;
- Uproc *up;
-
- /* for now, assume getpid is fast or cached */
- pid = getpid();
-
- /*
- * this part - the lookup - needs to run without locks
- * so that it can safely be called from within the notify handler.
- * notify calls _p9uproc, and fork and rfork call _p9uproc
- * in both parent and child, so if we're in a signal handler,
- * we should find something in the table.
- */
- h = pid%PIDHASH;
- for(i=0; i<PIDHASH; i++){
- up = alluproc[h];
- if(up == nil)
- break;
- if(allupid[h] == pid)
- return up;
- if(++h == PIDHASH)
- h = 0;
- }
-
- if(inhandler){
- fprint(2, "%s: did not find uproc for pid %d in signal handler\n", argv0, pid);
- abort();
- }
-
- /* need to allocate */
- while((up = mallocz(sizeof(Uproc), 1)) == nil)
- sleep(1000);
-
- /* fprint(2, "alloc uproc for pid %d\n", pid); */
- up->pid = pid;
- lock(&uproclock);
- h = pid%PIDHASH;
- for(i=0; i<PIDHASH; i++){
- if(alluproc[h]==T || alluproc[h]==nil){
- alluproc[h] = up;
- allupid[h] = pid;
- unlock(&uproclock);
- return up;
- }
- if(++h == PIDHASH)
- h = 0;
- }
- unlock(&uproclock);
-
- /* out of pids! */
- sysfatal("too many processes in uproc table");
- return nil;
-}
-
-void
-_p9uprocdie(void)
-{
- Uproc *up;
- int pid, i, h;
-
- pid = getpid();
- /* fprint(2, "reap uproc for pid %d\n", pid); */
- h = pid%PIDHASH;
- for(i=0; i<PIDHASH; i++){
- up = alluproc[h];
- if(up == nil)
- break;
- if(up == T)
- continue;
- if(allupid[h] == pid){
- up = alluproc[h];
- alluproc[h] = T;
- free(up);
- allupid[h] = 0;
- }
- }
-}
blob - /dev/null
blob + 988d207238600f42cef5b74f0857d76a8e7c658e (mode 644)
--- /dev/null
+++ src/lib9/execl.c
+#include <u.h>
+#include <libc.h>
+
+int
+execl(char *prog, ...)
+{
+ int i;
+ va_list arg;
+ char **argv;
+
+ va_start(arg, prog);
+ for(i=0; va_arg(arg, char*) != nil; i++)
+ ;
+ va_end(arg);
+
+ argv = malloc((i+1)*sizeof(char*));
+ if(argv == nil)
+ return -1;
+
+ va_start(arg, prog);
+ for(i=0; (argv[i] = va_arg(arg, char*)) != nil; i++)
+ ;
+ va_end(arg);
+
+ exec(prog, argv);
+ free(argv);
+ return -1;
+}
+