Rev 8849 | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 8849 | Rev 12474 | ||
---|---|---|---|
Line 20... | Line 20... | ||
20 | 20 | ||
21 | #define MAX_FORK 1024 |
21 | #define MAX_FORK 1024 |
22 | #define MAX_DELAY 1500 /* At most these seconds of execution */ |
22 | #define MAX_DELAY 1500 /* At most these seconds of execution */ |
23 | 23 | ||
24 | struct { |
24 | struct { |
25 |
|
25 | pid_t pid; |
26 |
|
26 | time_t t; |
27 |
|
27 | int type; |
28 |
|
28 | int pad; |
29 | } forklist[MAX_FORK]; |
29 | } forklist[MAX_FORK]; |
30 | int forkcnt; |
30 | int forkcnt; |
31 | 31 | ||
32 | void addfork(pid_t pid, int type) |
32 | void addfork(pid_t pid, int type) |
33 | { |
33 | { |
34 |
|
34 | if(forkcnt>=MAX_FORK) { |
35 |
|
35 | kill(pid,SIGKILL); return; |
36 |
|
36 | } |
37 |
|
37 | forklist[forkcnt].pid=pid; |
38 |
|
38 | forklist[forkcnt].t=time(NULL); |
39 |
|
39 | forklist[forkcnt].type=type; |
40 |
|
40 | forkcnt++; |
41 | } |
41 | } |
42 | 42 | ||
43 | /* forklist management */ |
43 | /* forklist management */ |
44 | void forkman(int kz) |
44 | void forkman(int kz) |
45 | { |
45 | { |
46 |
|
46 | int delay, i, t, st; |
47 |
|
47 | time_t now; |
48 |
|
48 | delay=MAX_DELAY; |
49 |
|
49 | if(forkcnt>=MAX_FORK/2) delay=delay/5; |
50 |
|
50 | if(forkcnt*4>=MAX_FORK*3) delay=delay/4; |
51 |
|
51 | now=time(NULL); |
52 |
|
52 | for(i=forkcnt-1; i>=0; i--) { |
53 |
|
53 | if(now-forklist[i].t>delay) kill(forklist[i].pid,SIGKILL); |
54 |
|
54 | t=waitpid(forklist[i].pid,&st,WNOHANG); |
55 |
|
55 | if(t==0 || !WIFEXITED(st)) continue; |
56 |
|
56 | memmove(forklist+i,forklist+i+1,forkcnt-1-i); |
57 |
|
57 | forkcnt--; |
58 |
|
58 | } |
59 |
|
59 | if(kz) waitpid(-1,NULL,WNOHANG); /* kill zombies */ |
60 | } |
60 | } |
61 | 61 | ||
62 | void wait_children(void) |
62 | void wait_children(void) |
63 | { |
63 | { |
64 |
|
64 | time_t now; |
65 |
|
65 | int i; |
66 |
|
66 | do { |
67 |
|
67 | now=time(NULL); |
68 |
|
68 | for(i=0; i<forkcnt; i++) { |
69 |
|
69 | if(forklist[i].type && forklist[i].t < now-MAX_DELAY) break; |
70 | } |
- | |
71 | if(i>=forkcnt) return; |
- | |
72 | sleep(1); |
- | |
73 | } |
70 | } |
- | 71 | if(i>=forkcnt) return; |
|
- | 72 | sleep(1); |
|
- | 73 | } |
|
74 |
|
74 | while(1); |
75 | } |
75 | } |
76 | 76 |