listen1: add process limit option
This commit is contained in:
parent
2524319b4c
commit
733dab56a1
2 changed files with 36 additions and 3 deletions
|
@ -18,6 +18,8 @@ listen, listen1, tcp7, tcp9, tcp19, tcp21, tcp22, tcp23, tcp25, tcp53, tcp110, t
|
||||||
[
|
[
|
||||||
.B -tv
|
.B -tv
|
||||||
]
|
]
|
||||||
|
.RB [ -p
|
||||||
|
.IR maxprocs ]
|
||||||
.I addr
|
.I addr
|
||||||
.I cmd
|
.I cmd
|
||||||
[
|
[
|
||||||
|
|
|
@ -2,13 +2,14 @@
|
||||||
#include <libc.h>
|
#include <libc.h>
|
||||||
#include <auth.h>
|
#include <auth.h>
|
||||||
|
|
||||||
|
int maxprocs;
|
||||||
int verbose;
|
int verbose;
|
||||||
int trusted;
|
int trusted;
|
||||||
|
|
||||||
void
|
void
|
||||||
usage(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");
|
exits("usage");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -51,8 +52,10 @@ remoteaddr(char *dir)
|
||||||
void
|
void
|
||||||
main(int argc, char **argv)
|
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 ctl, nctl, fd;
|
||||||
|
int wfd, nowait, procs;
|
||||||
|
Dir *d;
|
||||||
|
|
||||||
ARGBEGIN{
|
ARGBEGIN{
|
||||||
default:
|
default:
|
||||||
|
@ -63,6 +66,9 @@ main(int argc, char **argv)
|
||||||
case 'v':
|
case 'v':
|
||||||
verbose = 1;
|
verbose = 1;
|
||||||
break;
|
break;
|
||||||
|
case 'p':
|
||||||
|
maxprocs = atoi(EARGF(usage()));
|
||||||
|
break;
|
||||||
}ARGEND
|
}ARGEND
|
||||||
|
|
||||||
if(argc < 2)
|
if(argc < 2)
|
||||||
|
@ -85,12 +91,34 @@ main(int argc, char **argv)
|
||||||
if(ctl < 0)
|
if(ctl < 0)
|
||||||
sysfatal("announce %s: %r", argv[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(;;){
|
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);
|
nctl = listen(dir, ndir);
|
||||||
if(nctl < 0)
|
if(nctl < 0)
|
||||||
sysfatal("listen %s: %r", argv[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:
|
case -1:
|
||||||
reject(nctl, ndir, "host overloaded");
|
reject(nctl, ndir, "host overloaded");
|
||||||
close(nctl);
|
close(nctl);
|
||||||
|
@ -107,6 +135,8 @@ main(int argc, char **argv)
|
||||||
fprint(nctl, "keepalive");
|
fprint(nctl, "keepalive");
|
||||||
close(ctl);
|
close(ctl);
|
||||||
close(nctl);
|
close(nctl);
|
||||||
|
if(wfd >= 0)
|
||||||
|
close(wfd);
|
||||||
putenv("net", ndir);
|
putenv("net", ndir);
|
||||||
snprint(data, sizeof data, "%s/data", ndir);
|
snprint(data, sizeof data, "%s/data", ndir);
|
||||||
bind(data, "/dev/cons", MREPL);
|
bind(data, "/dev/cons", MREPL);
|
||||||
|
@ -121,6 +151,7 @@ main(int argc, char **argv)
|
||||||
exits(nil);
|
exits(nil);
|
||||||
default:
|
default:
|
||||||
close(nctl);
|
close(nctl);
|
||||||
|
procs++;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue