summaryrefslogtreecommitdiff
path: root/sys/src
diff options
context:
space:
mode:
authorcinap_lenrek <cinap_lenrek@centraldogma>2011-12-12 10:08:02 +0100
committercinap_lenrek <cinap_lenrek@centraldogma>2011-12-12 10:08:02 +0100
commit733dab56a1ed746faaf875f61ecf1258331f63d2 (patch)
treee567a2b594e07d55858793646bef6b8adad3d085 /sys/src
parent2524319b4ce7f98d0d61a400ccbcfbd55eaf4098 (diff)
listen1: add process limit option
Diffstat (limited to 'sys/src')
-rw-r--r--sys/src/cmd/aux/listen1.c37
1 files changed, 34 insertions, 3 deletions
diff --git a/sys/src/cmd/aux/listen1.c b/sys/src/cmd/aux/listen1.c
index d38934bd2..cc22bb14a 100644
--- a/sys/src/cmd/aux/listen1.c
+++ b/sys/src/cmd/aux/listen1.c
@@ -2,13 +2,14 @@
#include <libc.h>
#include <auth.h>
+int maxprocs;
int verbose;
int trusted;
void
usage(void)
{
- fprint(2, "usage: listen1 [-tv] address cmd args...\n");
+ fprint(2, "usage: listen1 [-tv] [-p maxprocs] address cmd args...\n");
exits("usage");
}
@@ -51,8 +52,10 @@ remoteaddr(char *dir)
void
main(int argc, char **argv)
{
- char data[60], dir[40], ndir[40];
+ char data[60], dir[40], ndir[40], wbuf[64];
int ctl, nctl, fd;
+ int wfd, nowait, procs;
+ Dir *d;
ARGBEGIN{
default:
@@ -63,6 +66,9 @@ main(int argc, char **argv)
case 'v':
verbose = 1;
break;
+ case 'p':
+ maxprocs = atoi(EARGF(usage()));
+ break;
}ARGEND
if(argc < 2)
@@ -85,12 +91,34 @@ main(int argc, char **argv)
if(ctl < 0)
sysfatal("announce %s: %r", argv[0]);
+ wfd = -1;
+ nowait = RFNOWAIT;
+ if(maxprocs > 0){
+ snprint(wbuf, sizeof(wbuf), "/proc/%d/wait", getpid());
+ if((wfd = open(wbuf, OREAD)) >= 0)
+ nowait = 0;
+ }
+ procs = 0;
for(;;){
+ if(nowait == 0 && (procs >= maxprocs || (procs % 8) == 0))
+ while(procs > 0){
+ if(procs < maxprocs){
+ d = dirfstat(wfd);
+ if(d == nil || d->length == 0){
+ free(d);
+ break;
+ }
+ free(d);
+ }
+ if(read(wfd, wbuf, sizeof(wbuf)) > 0)
+ procs--;
+ }
+
nctl = listen(dir, ndir);
if(nctl < 0)
sysfatal("listen %s: %r", argv[0]);
- switch(rfork(RFFDG|RFPROC|RFNOWAIT|RFENVG|RFNAMEG|RFNOTEG)){
+ switch(rfork(RFFDG|RFPROC|RFMEM|RFENVG|RFNAMEG|RFNOTEG|nowait)){
case -1:
reject(nctl, ndir, "host overloaded");
close(nctl);
@@ -107,6 +135,8 @@ main(int argc, char **argv)
fprint(nctl, "keepalive");
close(ctl);
close(nctl);
+ if(wfd >= 0)
+ close(wfd);
putenv("net", ndir);
snprint(data, sizeof data, "%s/data", ndir);
bind(data, "/dev/cons", MREPL);
@@ -121,6 +151,7 @@ main(int argc, char **argv)
exits(nil);
default:
close(nctl);
+ procs++;
break;
}
}