static void makeprocs(void) { int i, status, failcount; pid_t pids[NJOBS]; printf("Job size approximately %lu bytes\n", (unsigned long) JOBSIZE); printf("Forking %d jobs; total load %luk\n", NJOBS, (unsigned long) (NJOBS * JOBSIZE)/1024); for (i=0; i<NJOBS; i++) { pids[i] = fork(); if (pids[i]<0) { warn("fork"); } if (pids[i]==0) { /* child */ go(i); } } failcount=0; for (i=0; i<NJOBS; i++) { if (pids[i]<0) { failcount++; } else { if (waitpid(pids[i], &status, 0)<0) { err(1, "waitpid"); } if (status_is_failure(status)) { failcount++; } } } if (failcount>0) { printf("%d subprocesses failed\n", failcount); exit(1); } printf("Test complete\n"); }
static void makeprocs(bool dowait) { int i, status, failcount; struct usem s1, s2; pid_t pids[NJOBS]; if (dowait) { semcreate("1", &s1); semcreate("2", &s2); } tprintf("Job size approximately %lu bytes\n", (unsigned long) JOBSIZE); tprintf("Forking %d jobs; total load %luk\n", NJOBS, (unsigned long) (NJOBS * JOBSIZE)/1024); for (i=0; i<NJOBS; i++) { pids[i] = fork(); if (pids[i]<0) { warn("fork"); } if (pids[i]==0) { /* child */ if (dowait) { //tsay("Process %d forked\n", i); semopen(&s1); semopen(&s2); semV(&s1, 1); semP(&s2, 1); semclose(&s1); semclose(&s2); } go(i); } } if (dowait) { semopen(&s1); semopen(&s2); //tsay("Waiting for fork...\n"); semP(&s1, NJOBS); //tsay("Starting computation.\n"); semV(&s2, NJOBS); } failcount=0; for (i=0; i<NJOBS; i++) { if (pids[i]<0) { failcount++; } else { if (waitpid(pids[i], &status, 0)<0) { err(1, "waitpid"); } if (status_is_failure(status)) { failcount++; } } } if (failcount>0) { printf("%d subprocesses failed\n", failcount); exit(1); } nprintf("\n"); tprintf("Test complete\n"); success(TEST161_SUCCESS, SECRET, "/testbin/parallelvm"); semclose(&s1); semclose(&s2); semdestroy(&s1); semdestroy(&s2); }