int Snd(int dest, void *structure, int size) { dest = Msgget(dest, 0); if (dest == -1) { return -1; } Printf2("Sending special message to %d", dest); return Msgsnd(dest, structure, size, 0); }
int SndCompactMessage(int dest, type_t type, int value, int id) { Printf2("Sending compact message to %d of type %ld", dest, type); dest = Msgget(dest, 0); if (dest == -1) { return -1; } CLEAR(compactMessage); compactMessage.type = type; compactMessage.content.value = value; compactMessage.content.id = (id == -1) ? GetMessageID() : id; return Msgsnd(dest, &compactMessage, sizeof(compactMessage), 0); }
void startCheckInStaff() { #define myAirline Airlines[_myAirline] #define my myAirline._cis[_myIndex] #define passenger Passengers[my._currentPassenger] /* Claim my CIS */ int _myAirline; int _myIndex; /* ID for currentThread */ Acquire(GlobalDataLock); _myIndex = NumActiveCIS % NUM_CIS_PER_AIRLINE; _myAirline = NumActiveCIS / NUM_CIS_PER_AIRLINE; NumActiveCIS++; Release(GlobalDataLock); while (true) { /* Check lines */ Acquire(myAirline._lock); if (my._lineSize == 0 && queue_empty(&myAirline._execQueue)) { /*Printf0("1\n", sizeof("1\n"));*/ my._state = ONBREAK; /* 'Clock Out' for Break */ myAirline._numOnBreakCIS++; /*Printf1("Cis %d going to sleep\n", sizeof("Cis %d going to sleep\n"), _myIndex);*/ Wait(myAirline._lock, my._commCV); /* Wait on Manager */ /* TODO - make sure okay to wait on aiport lock... maybe better? */ /*Printf1("Cis %d woke up by manager\n", sizeof("Cis %d woke up by manager\n"), _myIndex);*/ /* Time to go home! TGIF! */ if (my._done) { Printf1("Airline check-in staff %d of airline %d is closing the counter\n", sizeof("Airline check-in staff %d of airline %d is closing the counter\n"), concat2Num(_myIndex, _myAirline)); /* Acquire(my._lock);*/ Release(myAirline._lock); /* Wait(my._lock, my._commCV); *//* Wait forever, basically */ /* Release(my._lock); *//* Never reaches here, but whatever... */ break; } myAirline._numOnBreakCIS--; } /* Start helping a passenger */ my._state = BUSY; Acquire(myAirline._cisLineLock); Acquire(myAirline._execLineLock); if (queue_size(&myAirline._execQueue) > 0) { my._currentPassenger = queue_pop(&myAirline._execQueue); passenger._cisID = _myIndex; Printf1("Airline check-in staff %d of airline %d serves an executive class passenger and economy line length = %d\n", sizeof("Airline check-in staff %d of airline %d serves an executive class passenger and economy line length = %d\n"), concat3Num(_myIndex, _myAirline, my._lineSize)); Signal(myAirline._execLineLock, myAirline._execLineCV); /* Signal Passenger */ } else if (my._lineSize > 0) { Printf1("Airline check-in staff %d of airline %d serves an economy class passenger and executive class line length = %d\n", sizeof("Airline check-in staff %d of airline %d serves an economy class passenger and executive class line length = %d\n"), concat3Num(_myIndex, _myAirline, queue_size(&myAirline._execQueue))); Signal(myAirline._cisLineLock, my._lineCV); /*Printf1("Cis %d of airline %d wakes up passenger\n", sizeof("Cis %d of airline %d wakes up passenger\n"), _myIndex*1000+_myAirline);*/ } /* Interact with Passenger */ Acquire(my._lock); Release(myAirline._cisLineLock); Release(myAirline._execLineLock); Release(myAirline._lock); if (my._lineSize > 0 || my._currentPassenger != -1) { /*Printf1("Cis %d of airline %d goes to sleep\n", sizeof("Cis %d of airline %d goes to sleep\n"), _myIndex*1000+_myAirline);*/ Wait(my._lock, my._commCV); } /* Otherwise, Manager woke you up for no reason */ if (my._currentPassenger != -1) { int i; /* Assign seat number */ Acquire(myAirline._lock); passenger._ticket._seat = myAirline._numCheckedinPassengers; myAirline._numCheckedinPassengers++; Release(myAirline._lock); /* Deal with baggage */ Acquire(ConveyorLock); for (i = 0; i < passenger._numBaggages; ++i) { /*Printf0("3\n", sizeof("1\n"));*/ /* #define bIndex (passenger._id * 3) + i #define bag Baggages[bIndex]*/ #define bag Baggages[(passenger._id*3)+i] bag._airline = _myAirline; /* Tag the bag */ /* queue_insert(&ConveyorBelt, bIndex);*/ queue_insert(&ConveyorBelt, passenger._id*3+i); Printf1("Airline check-in staff %d of airline %d dropped bags to the conveyor system \n", sizeof("Airline check-in staff %d of airline %d dropped bags to the conveyor system \n"), concat2Num(_myIndex, _myAirline)); /* myAirline._numExpectedBaggages++;*/ my._weightCount += bag._weight; #undef bag /* #undef bIndex*/ } Release(ConveyorLock); /* Direct Passenger to Airline */ if (passenger._ticket._executive) { Printf2("Airline check-in staff %d of airline %d informs executive class passenger %d to board at gate %d\n", sizeof("Airline check-in staff %d of airline %d informs executive class passenger %d to board at gate %d\n"), /* concat3Num(_myAirline, my._currentPassenger, _myAirline), _myIndex);*/ concat3Num(_myIndex, _myAirline, my._currentPassenger), _myAirline); } else { Printf2("Airline check-in staff %d of airline %d informs economy class passenger %d to board at gate %d\n", sizeof("Airline check-in staff %d of airline %d informs economy class passenger %d to board at gate %d\n"), /* concat3Num(_myAirline, my._currentPassenger, _myAirline), _myIndex);*/ concat3Num(_myIndex, _myAirline, my._currentPassenger), _myAirline); } Signal(my._lock, my._commCV); Wait(my._lock, my._commCV); } my._currentPassenger = -1; Release(my._lock); } /* end while */ Exit(0); #undef passenger #undef my #undef myAirline }
/* Start Functions - functions called by Fork() syscall. */ void startPassenger() { #define my Passengers[_myIndex] #define liaison Liaisons[my._liaisonID] /* Claim my Passenger */ int i, j; /* for-loop iterators */ int _myIndex; /* ID for currentThread */ int _minLineSize; Acquire(GlobalDataLock); _myIndex = NumActivePassengers++; Release(GlobalDataLock); /* Liaison Interaction */ Acquire(LiaisonLineLock); _minLineSize = Liaisons[0]._lineSize; /* Find shortest line */ for (i = 1; i < NUM_LIASONS; i++) { if (Liaisons[i]._lineSize < _minLineSize) { _minLineSize = Liaisons[i]._lineSize; my._liaisonID = i; } } Printf1("Passenger %d chose Liaison %d with a line length %d\n", sizeof("Passenger %d chose Liaison %d with a line length %d\n"), concat3Num(_myIndex, my._liaisonID, liaison._lineSize)); /* Get in line? */ if (liaison._state == BUSY) { /* Printf0("Passenger says liaison is BUSY\n", sizeof("Passenger says liaison is BUSY\n")); Printf1("Passenger's liaison id: %d\n", sizeof("Passenger's liaison id: %d\n"), _myIndex);*/ liaison._lineSize++; Wait(LiaisonLineLock, liaison._lineCV); liaison._lineSize--; } Printf1("Passenger %d is moving along...\n", sizeof("Passenger %d is moving along...\n"), _myIndex); /* Go to Liaison */ Acquire(liaison._lock); Release(LiaisonLineLock); /* Give Liaison my Passenger info */ liaison._passCount[my._ticket._airline]++; liaison._bagCount[my._ticket._airline] += my._numBaggages; liaison._currentPassenger = _myIndex; Signal(liaison._lock, liaison._commCV); /* Signal Liaison */ Wait(liaison._lock, liaison._commCV); /* Wait for Liaison */ Printf1("Passenger %d of Airline %d is directed to the check-in counter\n", sizeof("Passenger %d of Airline %d is directed to the check-in counter\n"), concat2Num(_myIndex, my._ticket._airline)); Signal(liaison._lock, liaison._commCV); Release(liaison._lock); #undef liaison /* end Liaison Interaction */ /* Check-in Staff Interaction */ #define myAirline Airlines[my._ticket._airline] #define myCIS myAirline._cis[my._cisID] if (my._ticket._executive) { Acquire(myAirline._execLineLock); queue_insert(&myAirline._execQueue, _myIndex); Printf1("Passenger %d of Airline %d is waiting in the executive class line\n", sizeof("Passenger %d of Airline %d is waiting in the executive class line\n"), concat2Num(_myIndex, my._ticket._airline)); /* Wait(myAirline._execLineLock, myAirline._execLineLock); *//* Wait on CIS */ Wait(myAirline._execLineLock, myAirline._execLineCV); /* Wait on CIS */ } else { /* Economy */ Acquire(myAirline._cisLineLock); /* Find shortest line */ _minLineSize = myAirline._cis[0]._lineSize; /* declare at top of startPassenger */ my._cisID = 0; for (i = 0; i < NUM_CIS_PER_AIRLINE; ++i) { if (myAirline._cis[i]._lineSize < _minLineSize) { _minLineSize = myAirline._cis[i]._lineSize; my._cisID = i; } } Printf2("Passenger %d of Airline %d chose Airline Check-In staff %d with a line length %d\n", sizeof("Passenger %d of Airline %d chose Airline Check-In staff %d with a line length %d\n"), concat3Num(_myIndex, my._ticket._airline, my._cisID), _minLineSize); myCIS._lineSize++; /*Printf1("Passenger %d of Airline %d is going to sleep and should be woken up by cis %d\n", sizeof("Passenger %d of Airline %d is going to sleep and should be woken up by cis %d\n"), concat3Num(_myIndex, my._ticket._airline, my._cisID));*/ Wait(myAirline._cisLineLock, myCIS._lineCV); /*Printf1("Passenger %d of Airline %d is woken up by cis %d\n", sizeof("Passenger %d of Airline %d is woken up by cis %d\n"), concat3Num(_myIndex, my._ticket._airline, my._cisID));*/ } Acquire(myCIS._lock); if (my._ticket._executive) { Release(myAirline._execLineLock); } else { myCIS._lineSize--; Release(myAirline._cisLineLock); } /* Give baggage to CIS */ myCIS._passCount++; myCIS._bagCount += my._numBaggages; myCIS._currentPassenger = _myIndex; Signal(myCIS._lock, myCIS._commCV); /* Signal CIS */ Wait(myCIS._lock, myCIS._commCV); /* Wait on CIS */ Printf1("Passenger %d of Airline %d was informed to board at gate %d\n", sizeof("Passenger %d of Airline %d was informed to board at gate %d\n"), concat3Num(_myIndex, my._ticket._airline, my._ticket._airline)); Signal(myCIS._lock, myCIS._commCV); /* Signal CIS */ Release(myCIS._lock); #undef myCIS #undef myAirline /* end Check-in Staff Interaction */ /* Screening Officer Interaction */ Acquire(OfficersLineLock); queue_insert(&OfficersLine, _myIndex); Wait(OfficersLineLock, OfficersLineCV); Printf1("Passenger %d gives the hand-luggage to screening officer %d\n", sizeof("Passenger %d gives the hand-luggage to screening officer %d\n"), concat2Num(_myIndex, my._officerID)); Acquire(ScreeningOfficers[my._officerID]._lock); Release(OfficersLineLock); Signal(ScreeningOfficers[my._officerID]._lock, ScreeningOfficers[my._officerID]._commCV); Wait(ScreeningOfficers[my._officerID]._lock, ScreeningOfficers[my._officerID]._commCV); /* officer lock is released below! */ /* end Screening Officer Interaction */ /* Security Inspector Interaction */ #define inspector SecurityInspectors[my._inspectorID] Printf1("Passenger %d moves to security inspector %d\n", sizeof("Passenger %d moves to security inspector %d\n"), concat2Num(_myIndex, my._inspectorID)); Acquire(inspector._lock); Release(ScreeningOfficers[my._officerID]._lock); inspector._newPassenger = _myIndex; if (inspector._state == AVAIL) { /* Wake up inspector */ Signal(inspector._lock, inspector._commCV); } Wait(inspector._lock, inspector._newPassCV); /* Wait for security results */ if (my._furtherQuestioning) { Printf1("Passenger %d goes for futher questioning\n", sizeof("Passenger %d goes for futher questioning\n"), _myIndex); Release(inspector._lock); for (i = 0; i < 10; ++i) { Yield(); /* Simulate Further questioning */ } Printf1("Passenger %d comes back to security inspector %d after further examination\n", sizeof("Passenger %d comes back to security inspector %d after further examination\n"), concat2Num(_myIndex, my._inspectorID)); Acquire(inspector._lock); /* inspector._rtnPassenger++;*/ inspector._rtnPassSize++; if (inspector._state == AVAIL) { Signal(inspector._lock, inspector._commCV); } /*Printf0("About to wait\n", sizeof("About to wait\n"));*/ Wait(inspector._lock, inspector._rtnPassCV); /*Printf0("Woken up\n", sizeof("Woken up\n"));*/ inspector._rtnPassenger = _myIndex; Signal(inspector._lock, inspector._rtnPassCV); Wait(inspector._lock, inspector._rtnPassCV); } Release(inspector._lock); #undef inspector /* end Security Inspector Interaction */ /* Reached the Boarding Lounge */ #define myAirline Airlines[my._ticket._airline] Acquire(myAirline._lock); myAirline._numReadyPassengers++; Printf1("Passenger %d of Airline %d reached the gate %d\n", sizeof("Passenger %d of Airline %d reached the gate %d\n"), concat3Num(_myIndex, my._ticket._airline, my._ticket._airline)); Wait(myAirline._lock, myAirline._boardLoungeCV); /* Wait for boarding call by manager */ Printf1("Passenger %d of Airline %d boarded airline %d\n", sizeof("Passenger %d of Airline %d boarded airline %d\n"), concat3Num(_myIndex, my._ticket._airline, my._ticket._airline)); Release(myAirline._lock); #undef myAirline /* End Boarding Lounge */ Exit(0); #undef my }