in with the new
This commit is contained in:
parent
c7acb53e03
commit
48bfee4e5b
4 changed files with 29 additions and 231 deletions
|
|
@ -1,5 +0,0 @@
|
||||||
#ifdef __Linux26__
|
|
||||||
#include "_p9proc-pthread.c"
|
|
||||||
#else
|
|
||||||
#include "_p9proc-getpid.c"
|
|
||||||
#endif
|
|
||||||
|
|
@ -1,113 +0,0 @@
|
||||||
/*
|
|
||||||
* 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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,113 +0,0 @@
|
||||||
/*
|
|
||||||
* 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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
29
src/lib9/execl.c
Normal file
29
src/lib9/execl.c
Normal file
|
|
@ -0,0 +1,29 @@
|
||||||
|
#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;
|
||||||
|
}
|
||||||
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue