int P2_Startup(void *arg){ USLOSS_Console(" \n---------Starting Test 9 ----------\n"); sem = P1_SemCreate(0); int childpid1, child_status1, exit_childpid1; int childpid2, child_status2, exit_childpid2; childpid1 = P1_Fork("child_p", child_p, NULL, USLOSS_MIN_STACK * 4, 2); USLOSS_Console("Child PID created %d \n", childpid1); childpid2 = P1_Fork("killer", killer, &childpid1, USLOSS_MIN_STACK * 4, 3); USLOSS_Console("Child PID created %d \n", childpid2); exit_childpid1 = P1_Join(&child_status1); exit_childpid2 = P1_Join(&child_status2); USLOSS_Console("end first %d (should be %d) status %d (should be 444)\nend second %d (should be %d) status %d (should be -4)\n", exit_childpid1,childpid1,child_status1,exit_childpid2,childpid2, child_status2); USLOSS_Console(" ---------Ending Test 9 ----------\n"); return 0; }
int P3_Startup(void *notused) { USLOSS_Console("P3_Startup\n"); P1_Fork("P5_Startup", P5_Startup, NULL, 4 * USLOSS_MIN_STACK, 5); int i; for (i = 0; i < 40; i++) { P1_Fork("P4_Startup", P4_Startup, NULL, 4 * USLOSS_MIN_STACK, 5); } P1_DumpProcesses(); int status = 2; int val = P1_Join(&status); printf("P1_Join return value: %d\n", val); P1_DumpProcesses(); P1_Fork("P8_Startup", P8_Startup, NULL, 4 * USLOSS_MIN_STACK, 3); USLOSS_Console("P3_Finished\n"); return 0; }
int TermDriver(void *arg){ int unit = (int) arg; termReaderMB[unit] = P2_MboxCreate(1,INT_SIZE); termLookAhead[unit] = P2_MboxCreate(10,MAX_LINE); termCharToWrite[unit] = P2_MboxCreate(1,INT_SIZE); termWriteSem[unit] = P1_SemCreate(1); termRunningSem[unit] = P1_SemCreate(0); P1_Fork("Term Reader", TermReader, (void *) unit,USLOSS_MIN_STACK, 2); P1_P(termRunningSem[unit]); /*Turn on Terminal interrupts*/ int ctrl = 0; int ctrl2 = 0; ctrl = USLOSS_TERM_CTRL_RECV_INT(ctrl); USLOSS_DeviceOutput(USLOSS_TERM_DEV,unit,(void *)ctrl); P1_V(running); int status = 0; int c = 0; int result; while(1){ result = P1_WaitDevice(USLOSS_TERM_DEV,unit,&status); if(result != 0 || done != 0){ break; } if(USLOSS_TERM_STAT_RECV(status) == USLOSS_DEV_BUSY){ P2_MboxSend(termReaderMB[unit],&status,&INT_SIZE); } if(USLOSS_TERM_STAT_XMIT(status) == USLOSS_DEV_READY){ if(P2_MboxCondReceive(termCharToWrite[unit],&c,&INT_SIZE) != -2){ ctrl2 = 0; ctrl2 = USLOSS_TERM_CTRL_XMIT_INT(ctrl2); ctrl2 = USLOSS_TERM_CTRL_RECV_INT(ctrl2); ctrl2 = USLOSS_TERM_CTRL_CHAR(ctrl2, c); ctrl2 = USLOSS_TERM_CTRL_XMIT_CHAR(ctrl2); USLOSS_DeviceOutput(USLOSS_TERM_DEV, unit, (void *)ctrl2); }else{ ctrl2 = 0; ctrl2 = USLOSS_TERM_CTRL_RECV_INT(ctrl2); USLOSS_DeviceOutput(USLOSS_TERM_DEV, unit, (void *)ctrl2); } } } status = 0; P2_MboxCondSend(termReaderMB[unit],&ctrl,&status); P1_Join(&status); return unit; }
int P2_Wait(int *status){ if (permissionCheck()) { return -1; } return P1_Join(status); }