int killer(void *arg){ USLOSS_Console("start killer\n"); //P1_DumpProcesses(); int *pid = (int *)arg; int status = P1_Kill(*pid, 444); if(status == 0){ USLOSS_Console("kill success\n"); }else{ USLOSS_Console("Kill failed!!\n"); //USLOSS_Halt(1); } //P1_DumpProcesses(); USLOSS_Console("end killer\n"); return -4; }
int P2_Startup(void *notused) { USLOSS_Console("P2_Startup\n"); if (P1_GetPID() != 1) { USLOSS_Console("Fail: id does not equal 1"); } if (P1_GetState(1) != 0) { USLOSS_Console("Fail: state is not running"); } if (P1_GetState(0) != 1) { USLOSS_Console("Fail: state of sentinel should be ready"); } int result = P1_Kill(P1_GetPID()); if (result == -2) { USLOSS_Console("PASS\n"); } USLOSS_Console("P2_Finished\n"); return 0; }
int P2_Startup(void *arg) { USLOSS_IntVec[USLOSS_SYSCALL_INT] = sysHandler; /*Init all mailboxes*/ int i; for(i = 0; i < P2_MAX_MBOX;i++){ mailboxes[i].id = i; mailboxes[i].inUse = 0; mailboxes[i].queue = NULL; mailboxes[i].activeSlots = 0; } for(i = 0; i < P1_MAXPROC;i++){ clockList[i].inUse = 0; } for(i = 0; i < P1_MAXSEM;i++){ userSemList[i].id = i; userSemList[i].inUse = 0; } mBoxSemaphore = P1_SemCreate(1); clockListSemaphore = P1_SemCreate(1); semGuard = P1_SemCreate(1); running = P1_SemCreate(0); int status; int pid; int clockPID; /* * Create clock device driver */ clockPID = P1_Fork("Clock driver", ClockDriver, (void *) running, USLOSS_MIN_STACK, 2); if (clockPID == -1) { USLOSS_Console("Can't create clock driver\n"); } /* * Wait for the clock driver to start. */ P1_P(running); for(i = 0; i < USLOSS_TERM_UNITS;i++){ termPids[i] = P1_Fork("Term driver", TermDriver, (void *) i,USLOSS_MIN_STACK, 2); if (termPids[i] == -1) { USLOSS_Console("Can't create term driver. Unit = %d\n",i); } P1_P(running); } int sector,track,disk; for (i = 0; i < USLOSS_DISK_UNITS;i++) { diskSem[i] = P1_SemCreate(1); P2_DiskSize(i,§or,&track,&disk); DISK_TRACKS[i] = disk; } pid = P2_Spawn("P3_Startup", P3_Startup, NULL, 4 * USLOSS_MIN_STACK, 3); pid = P2_Wait(&status); /* * Kill the device drivers */ P1_Kill(clockPID); /*Let everyone know we are done.*/ done = 1; /*Interrupt all terminals*/ int ctrl = 0; ctrl = USLOSS_TERM_CTRL_XMIT_INT(ctrl); ctrl = USLOSS_TERM_CTRL_RECV_INT(ctrl); for(i = 0 ; i < USLOSS_TERM_UNITS;i++){ P1_Kill(termPids[i]); USLOSS_DeviceOutput(USLOSS_TERM_DEV, i, (void *)ctrl); P2_Wait(&status); } /*Interrupt any disk requests*/ USLOSS_DeviceRequest seekRequest; seekRequest.opr = USLOSS_DISK_SEEK; seekRequest.reg1 = (void *)0; for(i = 0 ; i < USLOSS_DISK_UNITS;i++){ USLOSS_DeviceOutput(USLOSS_DISK_DEV,i,(void *)&seekRequest); P2_Wait(&status); } /*Finally wait for the clock driver to be done*/ P2_Wait(&status); return 0; }