Improvement of GC for parallel program
@@ -80,7 +80,6 @@ | ||
80 | 80 | |
81 | 81 | int ProcFlag = 0; |
82 | 82 | |
83 | - | |
84 | 83 | int NewProc(Context* cx, Node* goalscar, List* module); |
85 | 84 | int EachProc(Context* cx, Node* goalscar, List* module); |
86 | 85 | int FirstNewProc(Context* cx, Node* goalscar, List* module); |
@@ -94,7 +93,21 @@ | ||
94 | 93 | |
95 | 94 | extern FILE* MksTemp(char* templ); |
96 | 95 | |
96 | +int PROCN = 1; | |
97 | +int setprocn(int n) | |
98 | +{ | |
99 | + if (n < 1) { | |
100 | + n = 1; | |
101 | + } | |
102 | + | |
103 | + if (n > MAXCORE) { | |
104 | + PROCN = MAXCORE; | |
105 | + } else { | |
106 | + PROCN = n; | |
107 | + } | |
108 | +} | |
97 | 109 | |
110 | + | |
98 | 111 | #define MAXPATHLEN 4096 |
99 | 112 | |
100 | 113 | #if !defined(__MINGW32__) |
@@ -228,11 +241,13 @@ | ||
228 | 241 | |
229 | 242 | waitpid(spid, (int*)NULL, 0); |
230 | 243 | |
244 | + setprocn(1); | |
231 | 245 | return 1; |
232 | 246 | } |
233 | 247 | |
234 | 248 | pid_t pid = 1; |
235 | 249 | pid_t pidno=0; |
250 | + setprocn(to_val-init_val+1); | |
236 | 251 | pid_t savepid[to_val-init_val+1]; |
237 | 252 | Node* env = Nil->Cons(Nil); |
238 | 253 | Context *cx2; |
@@ -478,6 +493,8 @@ | ||
478 | 493 | |
479 | 494 | waitpid(spid, (int*)NULL, 0); |
480 | 495 | |
496 | + setprocn(1); | |
497 | + | |
481 | 498 | return 1; |
482 | 499 | } |
483 | 500 |
@@ -485,6 +502,7 @@ | ||
485 | 502 | |
486 | 503 | pid_t pid = 1; |
487 | 504 | pid_t pidno=0; |
505 | + setprocn(ListLength(nlist)); | |
488 | 506 | pid_t savepid[ListLength(nlist)]; |
489 | 507 | for (pidno = 0 ; nlist->kind() != ATOM; ) { |
490 | 508 | if (pid != 0) { |
@@ -766,11 +784,14 @@ | ||
766 | 784 | |
767 | 785 | waitpid(spid, (int*)NULL, 0); |
768 | 786 | |
787 | + setprocn(1); | |
788 | + | |
769 | 789 | return 1; |
770 | 790 | } |
771 | 791 | |
772 | 792 | pid_t pid = 1; |
773 | 793 | pid_t pidno=0; |
794 | + setprocn(to_val-init_val+1); | |
774 | 795 | pid_t savepid[to_val-init_val+1]; |
775 | 796 | Node* env = Nil->Cons(Nil); |
776 | 797 | Context *cx2; |
@@ -1059,11 +1080,14 @@ | ||
1059 | 1080 | |
1060 | 1081 | waitpid(spid, (int*)NULL, 0); |
1061 | 1082 | |
1083 | + setprocn(1); | |
1084 | + | |
1062 | 1085 | return 1; |
1063 | 1086 | } |
1064 | 1087 | |
1065 | 1088 | pid_t pid = 1; |
1066 | 1089 | pid_t pidno=0; |
1090 | + setprocn(ListLength(nlist)); | |
1067 | 1091 | pid_t savepid[ListLength(nlist)]; |
1068 | 1092 | for (pidno = 0 ; nlist->kind() != ATOM; ) { |
1069 | 1093 | int f = 0; |
@@ -139,6 +139,8 @@ | ||
139 | 139 | Node* nd; |
140 | 140 | Node* ndprev; |
141 | 141 | |
142 | + extern int PROCN; | |
143 | + | |
142 | 144 | // return; |
143 | 145 | gettimeofday(&gctv_now, NULL); |
144 | 146 |
@@ -163,12 +165,12 @@ | ||
163 | 165 | int free, active; |
164 | 166 | if (MemInfo(free, active) >= 0) { |
165 | 167 | double MemUseRate = (double)active/(double)free; |
166 | - if (MemUseRate < 0.3) { | |
168 | + if (MemUseRate < 0.3*PROCN) { | |
167 | 169 | return; |
168 | - } else if (MemUseRate > 0.5) { | |
170 | + } else if (MemUseRate > 0.5/PROCN) { | |
169 | 171 | freeVarNode(); |
170 | 172 | freeUndefNode(); |
171 | - if (MemUseRate > 0.6) { | |
173 | + if (MemUseRate > 0.6/PROCN) { | |
172 | 174 | freePredNode(); |
173 | 175 | freeAtomNode(); |
174 | 176 | freeListNode(); |