void waitThread(){

	ServerAcquire(lock1,1);
	ServerWait(condition1,lock1,1);
	ServerRelease(lock1,0);
	ServerAcquire(lock2,1);
	ServerRelease(lock2,0);
	Exit(0);
}			
int
	main(){
	Print("\nSERVERSIGNAL_SYSCALL TEST\n",sizeof("\nSERVERSIGNAL_SYSCALL TEST\n"),a,0);
	condition1 = CreateServerCondition("Condition1",0);
	lock1 = CreateServerLock("Lock1",1);
	lock2 = CreateServerLock("Lock2",0);

	
	Fork(waitThread);
	Yield();
	ServerAcquire(lock1,1);
	ServerSignal(condition1,lock1,0);
	ServerRelease(lock1,1);
	ServerAcquire(lock2,0);
	ServerRelease(lock2,1);
	Print("\nNow Signalling on Garbage server lock and server condition: this should fail!\n",sizeof("\nNow Signalling on Garbage server lock and server condition: this should fail!\n"),a,0);
	ServerSignal(0xfff,0xfff,1);
		
}
int
main() {

    int a[0];

    Print("\nsimple TEST\n",sizeof("\nsimple TEST\n"),a,0);
    lock1 = CreateServerLock("pie",0);
    cv1 = CreateServerCondition("strudle",0);

    ServerAcquire(lock1,0);
    Exec("../test/simpleNetwork2");
    ServerWait(cv1,lock1,0);
    ServerRelease(lock1,0);
}
int main()
{
	Trace("Creating Lock", 0x9999);
	Trace("\n", 0x9999);
	lock = ServerCreateLock("Lock", sizeof("Lock"), 1);
	Trace("Lock's index: ", lock);
	Trace("\n", 0x9999);
	
	Trace("Creating CV", 0x9999);
	Trace("\n", 0x9999);
	cv = ServerCreateCV("CV", sizeof("CV"), 1);
	Trace("CV's index: ", cv);
	Trace("\n", 0x9999);
	
	Trace("Creating MV\n", 0x9999);
	mv = CreateMV("MV", sizeof("MV"), 1, 10);
	Trace("MV's index: ", mv);
	Trace("\n", 0x9999);
	Trace("MV's value: ", GetMV(mv, 0));
	Trace("\n", 0x9999);
	
	Trace("Acquiring lock\n", 0x9999);
	ServerAcquire(lock, 0);
	
	Trace("Incrementing MV\n", 0x9999);
	SetMV(mv, 0, GetMV(mv, 0)+1);
	
	Trace("Waiting on CV with Lock\n", 0x9999);
	ServerWait(cv, 0, lock, 0);
	Trace("Woken up from wait\n", 0x9999);
	Trace("Now deleteing lock and cv\n", 0x9999);
	ServerRelease(lock, 0);
	
	ServerDestroyLock(lock, 0);
	ServerDestroyCV(cv, 0);
	
	Trace("Final MV value should be 4\n", 0x9999);
	Trace("Final MV value: ", GetMV(mv, 0));
	Trace("\n", 0x9999);
	/* not reached */
	Exit(0);
}
Example #5
0
/* static */ void
AcceptConnection(ServerRef server, CFSocketNativeHandle sock, CFStreamError* error, void* info) {

	if (sock == ((CFSocketNativeHandle)(-1))) {
	
		fprintf(stderr, "AcceptConnection - Received an error (%d, %d)\n", (int)error->domain, (int)error->error);
		
		ServerInvalidate(server);
		ServerRelease(server);
		
		CFRunLoopStop(CFRunLoopGetCurrent());
	}
	else {
	
		EchoContextRef echo = EchoContextCreate(NULL, sock);
		
		if ((echo != NULL) && !EchoContextOpen(echo))
			EchoContextRelease(echo);
	}
}
int main() {
	/* ------------------Local data -------------------------*/
	int myIndex;

	int initIndex = CreateMV("PicIndex", sizeof("PicIndex"), 1, 0x9999);
	int initIndexLock = ServerCreateLock("PicIndexLock", sizeof("PicIndexLock"), 1);

	int mySSN;
	int i;
	int cType = 0;

	enum BOOLEAN loop = true;
	int shutdown = CreateMV("shutdown", sizeof("shutdown"), 1, 0x9999);
	/* -----------------Shared Data------------------------*/

	/* Number of customers/senators in office and thier locks */
	int officeSenator = CreateMV("officeSenator", sizeof("officeSenator"), 1, 0x9999);
	int officeCustomer = CreateMV("officeCustomer", sizeof("officeCustomer"), 1, 0x9999);	
	int senatorLock = ServerCreateLock("senatorLock", sizeof("senatorLock"), 1);
	int customerLock = ServerCreateLock("customerLock", sizeof("customerLock"), 1);

	/*Locks, conditions, and data used for waitinng */
	int clerkWaitLock = ServerCreateLock("clerkWaitLock", sizeof("clerkWaitLock"), 1);
	int clerkWaitCV = ServerCreateCV("clerkWaitCV", sizeof("clerkWaitCV"), 1);
	int numPicWait = CreateMV("numPicWait", sizeof("numPicWait"), 1, 0x9999);

	/* Reg and priv line lengths, line locks, and reg and priv line conditions. */
	int regPCLineLength = CreateMV("regPCLineLength", sizeof("regPCLineLength"), 1, 0x9999);
	int privPCLineLength = CreateMV("privPCLineLength", sizeof("privPCLineLength"), 1, 0x9999);
	int acpcLineLock = ServerCreateLock("acpcLineLock", sizeof("acpcLineLock"), 1);
	int regPCLineCV = ServerCreateCV("regPCLineCV", sizeof("regPCLineCV"), 1);
	int privPCLineCV = ServerCreateCV("privPCLineCV", sizeof("privPCLineCV"), 1);


	/* Individual clerk locks, conditions, data, data booleans, and states */
	int picLock = ServerCreateLock("picLock", sizeof("picLock"), NUM_CLERKS);
	int picCV = ServerCreateCV("picCV", sizeof("picCV"), NUM_CLERKS);
	int picDataBool = CreateMV("picDataBool", sizeof("picDataBool"), NUM_CLERKS, 0x9999);
	int picState = CreateMV("picState", sizeof("picState"), NUM_CLERKS, 0x9999);
	int picData = CreateMV("picData", sizeof("picData"), NUM_CLERKS, 0x9999);

	/* Money data and locks for each clerk type */
	int picMoney = CreateMV("picMoney", sizeof("picMoney"), 1, 0x9999);
	int picMoneyLock = ServerCreateLock("picMoneyLock", sizeof("picMoneyLock"), 1);

	/* Individual customer's file state, type, and its lock */
	int fileLock = ServerCreateLock("fileLock", sizeof("fileLock"), NUM_CUSTOMERS + NUM_SENATORS);
	int fileState = CreateMV("fileState", sizeof("fileState"), NUM_CUSTOMERS + NUM_SENATORS, 0x9999);
	int fileType = CreateMV("fileType", sizeof("fileType"), NUM_CUSTOMERS + NUM_SENATORS, 0x9999);

	traceLock = ServerCreateLock("traceLock", sizeof("traceLock"), 1);
	
	/* initializes myIndex */
	ServerAcquire(initIndexLock, 0);
	myIndex = GetMV(initIndex, 0);
	SetMV(initIndex, 0, GetMV(initIndex, 0) + 1);
	ServerRelease(initIndexLock, 0);
	
	SetMV(picState, myIndex, 1);

	/* --------------------BEGIN PICCLERK STUFF----------------*/
	while(loop == true){
		if (GetMV(shutdown, 0) == 1) {
			ServerAcquire(traceLock, 0);
			ClerkTrace("Pic", myIndex, 0x00, 0, "Shutting down.\n");
			ServerRelease(traceLock, 0);
			Exit(0);
		}
		ServerAcquire(senatorLock, 0);
		ServerAcquire(customerLock, 0);
		if (GetMV(officeSenator, 0) > 0 && GetMV(officeCustomer, 0) > 0) {
			ServerRelease(senatorLock, 0);
			ServerRelease(customerLock, 0);
			
			ServerAcquire(clerkWaitLock, 0);
			ServerWait(clerkWaitCV, 0, clerkWaitLock, 0);
			ServerRelease(clerkWaitLock, 0);
		}
		else{
			ServerRelease(senatorLock, 0);
			ServerRelease(customerLock, 0);
		}

		ServerAcquire(acpcLineLock, 0);

		/* Check for the privileged customer line first
		* If there are privileged customers, do PicClerk tasks, then receive $500
		*/
		if(GetMV(privPCLineLength, 0) > 0){
			SetMV(privPCLineLength, 0, GetMV(privPCLineLength, 0)-1);
			
			ServerAcquire(senatorLock, 0);
			SetMV(numPicWait, 0, GetMV(numPicWait, 0)+1);		/* Shows customer that one clerk is waiting */
			ServerRelease(senatorLock, 0);

			ServerAcquire(picLock, myIndex);
			SetMV(picState, myIndex, 0); /* 0 = AVAILABLE */
			ServerSignal(privPCLineCV, 0, acpcLineLock, 0);
			ServerRelease(acpcLineLock, 0);
			
			ServerWait(picCV, myIndex, picLock, myIndex);	/* Waits for the next customer */

			mySSN = GetMV(picData, myIndex);
			/* check the customer type */
			ServerAcquire(fileLock, mySSN);
			if (GetMV(fileType, mySSN) == 0) { /* 0 = CUSTOMER */
				cType = 0;
			} else {
				cType = 1;	/* 1 = SENATOR */
			}

			if(GetMV(fileState, mySSN) == 0){	/* 0 = NONE */
				SetMV(fileState, mySSN, 1);/* 1 = PICDONE */
				ServerRelease(fileLock, mySSN);
			}
			else if(GetMV(fileState, mySSN) == 2 ){ /* 2 = APPDONE */
				SetMV(fileState, mySSN, 3); /* 3 = APPPICDONE */
				ServerRelease(fileLock, mySSN);
			}
			else{
				ServerAcquire(traceLock, 0);
				ClerkTrace("Pic", myIndex, "Cust", mySSN,
					"ERROR: Customer does not have either an application or no application. What are you doing here?\n");
				ServerRelease(traceLock, 0);
				ServerRelease(fileLock, mySSN);
			}

			ServerAcquire(traceLock, 0);
			if (cType == 0) {
				ClerkTrace("Pic", myIndex, "Cust", mySSN, "Takes picture of Customer.\n");
			} else {
				ClerkTrace("Pic", myIndex, "Sen", mySSN, "Takes picture of Senator.\n");
			}
			ServerRelease(traceLock, 0);

			/* yield to take picture
			* print statement: "Taking picture"
			* picCV->Signal then picCV->Wait to
			* show customer picture
			*/
			while(GetMV(picDataBool, myIndex) == 0){ /* 0 = false */
				for(i = 0; i < 4; i++){
					Yield();
				}
				ServerSignal(picCV, myIndex, picLock, myIndex);	
				ServerWait(picCV, myIndex, picLock, myIndex);	/* Shows the customer the picture */

				if(GetMV(picDataBool, myIndex) == 0){
					ServerAcquire(traceLock, 0);
					if (cType == 0) {
						ClerkTrace("Pic", myIndex, "Cust", mySSN, "Takes picture of Customer again.\n");

					} else {
						ClerkTrace("Pic", myIndex, "Sen", mySSN, "Takes picture of Senator again.\n");
					}
					ServerRelease(traceLock, 0);
				}
			}


			/* file picture using
			* current thread yield
			
			for(i = 0; i < 20; i++){
				Yield();
			}*/
			ServerAcquire(traceLock, 0);
			if (cType == 0) {
				ClerkTrace("Pic", myIndex, "Cust", mySSN, "Informs Customer that the picture has been completed.\n");
			} else {
				ClerkTrace("Pic", myIndex, "Sen", mySSN, "Informs Senator that the picture has been completed.\n");
			}
			ServerRelease(traceLock, 0);

			/* signal customer awake */
			ServerAcquire(picMoneyLock, 0);
			SetMV(picMoney, 0, GetMV(picMoney, 0) + 500);

			ServerAcquire(traceLock, 0);
			if (cType == 0) {
				ClerkTrace("Pic", myIndex, "Cust", mySSN, "Accepts $500 from Customer.\n");
			} else {
				ClerkTrace("Pic", myIndex, "Cust", mySSN, "Accepts $500 from Senator.\n");
			}
			ServerRelease(traceLock, 0);

			ServerRelease(picMoneyLock, 0);

			SetMV(picDataBool, myIndex, 0);
			ServerSignal(picCV, myIndex, picLock, myIndex); /* signal customer awake */
			ServerRelease(picLock, myIndex); /* release clerk lock */
		}
		/* Check for regular customer line next
		* If there are regular customers, do PicClerk tasks
		*/
		else if(GetMV(regPCLineLength,0) > 0){
			SetMV(regPCLineLength, 0, GetMV(regPCLineLength, 0)-1);

			ServerAcquire(senatorLock, 0);
			SetMV(numPicWait, 0, GetMV(numPicWait, 0)+1);	/* shows customer that one clerk is waiting */
			ServerRelease(senatorLock, 0);

			ServerAcquire(picLock, myIndex);
			SetMV(picState, myIndex, 0); /* 0  = AVAILABLE */
			ServerSignal(regPCLineCV, 0, acpcLineLock, 0);
			ServerRelease(acpcLineLock, 0);
			
			ServerWait(picCV, myIndex, picLock, myIndex);	/* Waits for the next customer */

			mySSN = GetMV(picData, myIndex);
			/* check the customer type */
			ServerAcquire(fileLock, mySSN);
			if (GetMV(fileType, mySSN) == 0) {
				cType = 0;
			} else {
				cType = 1;
			}

			if(GetMV(fileState, mySSN) == 0){	/* 0 = NONE */
				SetMV(fileState, mySSN, 1);/* 1 = PICDONE */
				ServerRelease(fileLock, mySSN);
			}
			else if(GetMV(fileState, mySSN) == 2 ){ /* 2 = APPDONE */
				SetMV(fileState, mySSN, 3); /* 3 = APPPICDONE */
				ServerRelease(fileLock, mySSN);
			}
			else{
				ServerAcquire(traceLock, 0);
				ClerkTrace("Pic", myIndex, "Cust", mySSN,
					"ERROR: Customer does not have either an application or no application. What are you doing here?\n");
				ServerRelease(traceLock, 0);
				ServerRelease(fileLock, mySSN);
			}

			ServerAcquire(traceLock, 0);
			if (cType == 0) {
				ClerkTrace("Pic", myIndex, "Cust", mySSN, "Takes picture of Customer.\n");
			} else {
				ClerkTrace("Pic", myIndex, "Sen", mySSN, "Takes picture of Senator.\n");
			}
			ServerRelease(traceLock, 0);
			
				/* yield to take picture
				* print statement: "Taking picture"
				* picCV->Signal then picCV->Wait to
				* show customer picture
				*/
			while(GetMV(picDataBool, myIndex) == 0){
				for(i = 0; i < 4; i++){
					Yield();
				}
				ServerSignal(picCV, myIndex, picLock, myIndex);	
				ServerWait(picCV, myIndex, picLock, myIndex);	/* Shows the customer the picture */

				if(GetMV(picDataBool, myIndex) == 0){
					ServerAcquire(traceLock, 0);
					if (cType == 0) {
						ClerkTrace("Pic", myIndex, "Cust", mySSN, "Takes picture of Customer again.\n");
					} else {
						ClerkTrace("Pic", myIndex, "Sen", mySSN, "Takes picture of Senator again.\n");
					}
					ServerRelease(traceLock, 0);
				}
			}


			/* file picture using
			* current thread yield
			
			for(i = 0; i < 20; i++){
				Yield();
			}*/
			ServerAcquire(traceLock, 0);
			if (cType == 0) {
				ClerkTrace("Pic", myIndex, "Cust", mySSN, "Informs Customer that the picture has been completed.\n");
			} else {
				ClerkTrace("Pic", myIndex, "Sen", mySSN, "Informs Senator that the picture has been completed.\n");
			}
			ServerRelease(traceLock, 0);

			SetMV(picDataBool, myIndex, 0);
			ServerSignal(picCV, myIndex, picLock, myIndex); /* signal customer awake */
			ServerRelease(picLock, myIndex); /* release clerk lock */
		}		
		/* If there are neither privileged or regular customers, go on break */
		else{
			ServerRelease(acpcLineLock, 0);
			ServerAcquire(picLock, myIndex);
			SetMV(picState, myIndex, 2); /* 2 = BREAK */
			
			ServerAcquire(traceLock, 0);
			ClerkTrace("Pic", myIndex, 0x00, 0, "Going on break.\n");
			ServerRelease(traceLock, 0);

			ServerWait(picCV, myIndex, picLock, myIndex);
			
			ServerAcquire(traceLock, 0);
			ClerkTrace("Pic", myIndex, 0x00, 0, "Returning from break.\n");
			ServerRelease(traceLock, 0);
			
			ServerRelease(picLock, myIndex);
		}
	}
}
int main() {
	/* ------------------Local data -------------------------*/
	int myIndex;

	int initIndex = CreateMV("AppIndex", sizeof("AppIndex"), 1, 0x9999);
	int initIndexLock = ServerCreateLock("AppIndexLock", sizeof("AppIndexLock"), 1);

	int mySSN;
	int i;
	int cType = 0;

	enum BOOLEAN loop = true;
	int shutdown = CreateMV("shutdown", sizeof("shutdown"), 1, 0x9999);
	/* -----------------Shared Data------------------------*/

	/* Number of customers/senators in office and thier locks */
	int officeSenator = CreateMV("officeSenator", sizeof("officeSenator"), 1, 0x9999);
	int officeCustomer = CreateMV("officeCustomer", sizeof("officeCustomer"), 1, 0x9999);	
	int senatorLock = ServerCreateLock("senatorLock", sizeof("senatorLock"), 1);
	int customerLock = ServerCreateLock("customerLock", sizeof("customerLock"), 1);

	/*Locks, conditions, and data used for waitinng */
	int clerkWaitLock = ServerCreateLock("clerkWaitLock", sizeof("clerkWaitLock"), 1);
	int clerkWaitCV = ServerCreateCV("clerkWaitCV", sizeof("clerkWaitCV"), 1);
	int numAppWait = CreateMV("numAppWait", sizeof("numAppWait"), 1, 0x9999);

	/* Reg and priv line lengths, line locks, and reg and priv line conditions. */
	int regACLineLength = CreateMV("regACLineLength", sizeof("regACLineLength"), 1, 0x9999);
	int privACLineLength = CreateMV("privACLineLength", sizeof("privACLineLength"), 1, 0x9999);
	int acpcLineLock = ServerCreateLock("acpcLineLock", sizeof("acpcLineLock"), 1);
	int regACLineCV = ServerCreateCV("regACLineCV", sizeof("regACLineCV"), 1);
	int privACLineCV = ServerCreateCV("privACLineCV", sizeof("privACLineCV"), 1);


	/* Individual clerk locks, conditions, data, data booleans, and states */
	int appLock = ServerCreateLock("appLock", sizeof("appLock"), NUM_CLERKS);
	int appCV = ServerCreateCV("appCV", sizeof("appCV"), NUM_CLERKS);

	int appState = CreateMV("appState", sizeof("appState"), NUM_CLERKS, 0x9999);
	int appData = CreateMV("appData", sizeof("appData"), NUM_CLERKS, 0x9999);

	/* Money data and locks for each clerk type */
	int appMoney = CreateMV("appMoney", sizeof("appMoney"), 1, 0x9999);
	int appMoneyLock = ServerCreateLock("appMoneyLock", sizeof("appMoneyLock"), 1);

	/* Individual customer's file state, type, and its lock */
	int fileLock = ServerCreateLock("fileLock", sizeof("fileLock"), NUM_CUSTOMERS + NUM_SENATORS);
	int fileState = CreateMV("fileState", sizeof("fileState"), NUM_CUSTOMERS + NUM_SENATORS, 0x9999);
	int fileType = CreateMV("fileType", sizeof("fileType"), NUM_CUSTOMERS + NUM_SENATORS, 0x9999);

	traceLock = ServerCreateLock("traceLock", sizeof("traceLock"), 1);
	
	/* initializes myIndex */
	ServerAcquire(initIndexLock, 0);
	myIndex = GetMV(initIndex, 0);
	SetMV(initIndex, 0, GetMV(initIndex, 0) + 1);
	ServerRelease(initIndexLock, 0);
	
	SetMV(appState, myIndex, 1);

	/* --------------------BEGIN APPCLERK STUFF----------------*/
	while(loop == true){
		if (GetMV(shutdown, 0) == 1) {
			ServerAcquire(traceLock, 0);
			ClerkTrace("App", myIndex, 0x00, 0, "Shutting down.\n"); 
			ServerRelease(traceLock, 0);
			Exit(0);
		}
		ServerAcquire(senatorLock, 0);
		ServerAcquire(customerLock, 0);
		if(GetMV(officeSenator, 0) > 0 && GetMV(officeCustomer, 0) > 0){
			ServerRelease(senatorLock, 0);
			ServerRelease(customerLock, 0);

			ServerAcquire(clerkWaitLock, 0);
			ServerWait(clerkWaitCV, 0, clerkWaitLock, 0);
			ServerRelease(clerkWaitLock, 0);
		}
		else{
			ServerRelease(senatorLock, 0);
			ServerRelease(customerLock, 0);
		}

		ServerAcquire(acpcLineLock, 0);
		
		/* Check for the privileged customer line first
		*  If there are privileged customers, do AppClerk tasks, then received $500
		*/
		if(GetMV(privACLineLength, 0) > 0){
			/*Trace("Checking privLine\n", 0x9999);*/
			SetMV(privACLineLength, 0, GetMV(privACLineLength, 0)-1);

			ServerAcquire(senatorLock, 0);
			SetMV(numAppWait, 0, GetMV(numAppWait, 0)+1);	/* shows customer that one clerk is waiting */
			ServerRelease(senatorLock, 0);

			ServerAcquire(appLock, myIndex);
			SetMV(appState, myIndex, 0);	/* 0 = AVAILABLE */
			ServerSignal(privACLineCV, 0, acpcLineLock, 0); /* Signals the next customer in priv line */
			ServerRelease(acpcLineLock, 0);
			/*Trace("Waiting privLine\n", 0x9999);*/
			ServerWait(appCV, myIndex, appLock, myIndex); /* Waits for the next customer */

			mySSN = GetMV(appData, myIndex);
			ServerAcquire(fileLock, mySSN);

			/* check the customer type */
			if(GetMV(fileType, mySSN) == 0){ /* 0 = CUSTOMER */
				cType = 0;
			}
			else{
				cType = 1;	/* 1 = SENATOR */
			}

			if(GetMV(fileState, mySSN) == 0){ /* 0 = NONE */
				SetMV(fileState, mySSN, 2); /* 2 = APPDONE */
				ServerRelease(fileLock, mySSN);
			}
			else if(GetMV(fileState, mySSN) == 1){ /* 1 = PICDONE */
				SetMV(fileState, mySSN, 3); /* 3 = APPPICDONE */
				ServerRelease(fileLock, mySSN);
			}
			else{
				ServerAcquire(traceLock, 0);
				ClerkTrace("App", myIndex, "Cust", mySSN,
					"ERROR:Customer doesn't have a picture application or no application. What are you doing here?\n");
				ServerRelease(traceLock, 0);
				ServerRelease(fileLock, mySSN);
			}

			for (i = 0; i < 20; i++){
				Yield();
			}

			ServerAcquire(traceLock, 0);
			if(cType == 0){
				ClerkTrace("App", myIndex, "Cust", mySSN, "Customer's app has been filed.\n");
			}
			else{
				ClerkTrace("App", myIndex, "Sen", mySSN, "Senator's app has been filed.\n");
			}
			ServerRelease(traceLock, 0);

			ServerAcquire(appMoneyLock, 0);
			SetMV(appMoney, 0, GetMV(appMoney, 0) + 500);

			ServerAcquire(traceLock, 0);
			if(cType == 0){
				ClerkTrace("App", myIndex, "Cust", mySSN, "Accepts $500 from Customer.\n");
			}
			else{
				ClerkTrace("App", myIndex, "Sen", mySSN, "Accepts $500 from Senator.\n");
			}
			ServerRelease(traceLock, 0);

			ServerRelease(appMoneyLock, 0);
			ServerSignal(appCV, myIndex, appLock, myIndex); /* signal customer awake */
			ServerRelease(appLock, myIndex);	/* Release clerk lock */

		}	
		/* Check for regular customer line next.
		* If there are regular customers, do AppClerk tasks 
		*/
		else if(GetMV(regACLineLength,0) > 0){
			/*Trace("Checking regLine\n", 0x9999);*/
			SetMV(regACLineLength, 0, GetMV(regACLineLength, 0)-1);

			ServerAcquire(senatorLock, 0);
			SetMV(numAppWait, 0, GetMV(numAppWait, 0)+1);	/* shows customer that one clerk is waiting */
			ServerRelease(senatorLock, 0);

			ServerAcquire(appLock, myIndex);
			SetMV(appState, myIndex, 0); /* 0 = AVAILABLE */
			ServerSignal(regACLineCV, 0, acpcLineLock, 0); /* Signals the next customer in priv line */
			ServerRelease(acpcLineLock, 0);
			/*Trace("Waiting regLine\n", 0x9999);*/
			ServerWait(appCV, myIndex, appLock, myIndex); /* Waits for the next customer */

			mySSN = GetMV(appData, myIndex);
			ServerAcquire(fileLock, mySSN);

			/* check the customer type */
			if(GetMV(fileType, mySSN) == 0){
				cType = 0;
			}
			else{
				cType = 1;
			}

			if(GetMV(fileState, mySSN) == 0){ /* 0 = NONE */
				SetMV(fileState, mySSN, 2); /* 2 = APPDONE */
				ServerRelease(fileLock, mySSN);
			}
			else if(GetMV(fileState, mySSN) == 1){ /* 1 = PICDONE */
				SetMV(fileState, mySSN, 3); /* 3 = APPPICDONE */
				ServerRelease(fileLock, mySSN);
			}
			else{
				ServerAcquire(traceLock, 0);
				ClerkTrace("App", myIndex, "Cust", mySSN,
					"ERROR:Customer doesn't have a picture application or no application. What are you doing here?\n");
				ServerRelease(traceLock, 0);
				ServerRelease(fileLock, mySSN);
			}

			for (i = 0; i < 20; i++){
				Yield();
			}

			ServerAcquire(traceLock, 0);
			if(cType == 0){
				ClerkTrace("App", myIndex, "Cust", mySSN, "Informs Customer their app has been filed.\n");
			}
			else{
				ClerkTrace("App", myIndex, "Sen", mySSN, "Informs Senator their app has been filed.\n");
			}
			ServerRelease(traceLock, 0);

			ServerSignal(appCV, myIndex, appLock, myIndex); /* signal customer awake */
			ServerRelease(appLock, myIndex);	/* Release clerk lock */
		}
		/* If there are neither privileged or regular customers, go on break */
		else{
			/*Trace("Going on break\n", 0x9999);*/
			ServerRelease(acpcLineLock, 0);
			ServerAcquire(appLock, myIndex);
			SetMV(appState, myIndex, 2); /* 2 = BREAK */
			
			ServerAcquire(traceLock, 0);
			ClerkTrace("App", myIndex, 0x00, 0, "Going on break.\n");
			ServerRelease(traceLock, 0);

			ServerWait(appCV, myIndex, appLock, myIndex);
			
			ServerAcquire(traceLock, 0);
			ClerkTrace("App", myIndex, 0x00, 0, "Returning from break.\n");
			ServerRelease(traceLock, 0);
			
			ServerRelease(appLock, myIndex);
		}
	}
}
void CoachAttendant() {
    unsigned int myID;
    int myChef=-1;
    int i = 0;
    int shortestLength;

    int one[1];
    int two[2];
    int three[3];
    int four[4];

    ServerAcquire(IDLock,-1);
    myID = GetMV(coachAttendantID,-1);
    SetMV(coachAttendantID, GetMV(coachAttendantID,-1) + 1,-1);
    ServerRelease(IDLock,-1);

    /*printf("coach attendant%d is alive\n", myID);*/

    while(true) {
        myChef=-1;
        ServerAcquire(coachAttendantLock[myID],-1);
        /*printf("coachAttendant%d acquired a lock on themselves\n", myID);*/
        if(GetMV(coachAttendantFirstLineLength[myID],-1) != 0) {
            ServerAcquire(coachAttendantLineLock[myID],-1);
            /*printf("coachAttendant%d has %d people in FC line\n and is signalling the first to come up\n", myID, coachAttendantFirstLineLength[myID]);*/
            /*I process a fc. passenger in line*/
            ServerSignal(coachAttendantFirstLine[myID], coachAttendantLineLock[myID],-1);
            /*wait for a passenger to hand over their ticket*/
            ServerWait(coachAttendantLine[myID], coachAttendantLineLock[myID],-1);
            ServerAcquire(getSeatLock[myID],-1);
            ServerRelease(coachAttendantLineLock[myID],-1);

            /*find a seat for this passenger*/
            ServerAcquire(globalSeatLock,-1);
            /*side effect---- seat is incremented*/
            SetMV(GetMV(passengerTicketsSeatNumber[myID],-1), GetMV(nextSeat,-1),-1);
            SetMV(nextSeat, GetMV(nextSeat,-1) + 1,-1);
            ServerRelease(globalSeatLock,-1);
            /*I wake up the passenger and wait for them to have a porter*/
            ServerSignal(getSeat[myID], getSeatLock[myID],-1);
            ServerAcquire(CAWaitingForPorterLock[myID],-1);
            ServerRelease(getSeatLock[myID],-1);
            ServerWait(CAWaitingForPorter[myID], CAWaitingForPorterLock[myID],-1);
            /*passenger has signalled me that they have a porter and I can seat them now!*/
            three[0] = myID;
            three[1] = GetMV(GetMV(passengerTicketsSeatNumber[myID],-1),-1);
            three[2] = GetMV(GetMV(passengerTicketsHolder[myID],-1),-1);
            Print("Coach Attendant %d of Train 0 gives seat number %d to Passenger %d\n",sizeof("Coach Attendant %d of Train 0 gives seat number %d to Passenger %d\n"),three,3);
            SetMV(coachAttendantFirstLineLength[myID], GetMV(coachAttendantFirstLineLength[myID],-1) - 1,-1);
            ServerRelease(CAWaitingForPorterLock[myID],-1);
            ServerAcquire(boardingPassengersCountLock,-1);
            SetMV(passengersBoardedAtThisStop[GetMV(currentStop,-1)], GetMV(passengersBoardedAtThisStop[GetMV(currentStop,-1)],-1) + 1,-1);
            ServerRelease(boardingPassengersCountLock,-1);
            if(GetMV(passengersBoardedAtThisStop[GetMV(currentStop,-1)],-1) == GetMV(passengersWaitingToBoard[GetMV(currentStop,-1)],-1)) {
                ServerAcquire(waitingForBoardingCompletionLock,-1);
                /*printf("CA%d finds that all passengers have boarded for this stop and is telling conductor\n",myID);*/
                ServerSignal(waitingForBoardingCompletion, waitingForBoardingCompletionLock,-1);
                ServerRelease(waitingForBoardingCompletionLock,-1);
            }
        }
        else if(GetMV(coachAttendantRegularLineLength[myID],-1) != 0) {
            ServerAcquire(coachAttendantLineLock[myID],-1);
            /*printf("coachAttendant%d has %d people in reg line\n and is signalling the first to come up\n", myID, coachAttendantRegularLineLength[myID]);*/
            /*I process a reg. passenger in line*/
            ServerSignal(coachAttendantRegularLine[myID], coachAttendantLineLock[myID],-1);
            /*wait for a passenger to hand over their ticket*/
            ServerWait(coachAttendantLine[myID], coachAttendantLineLock[myID],-1);
            ServerAcquire(getSeatLock[myID],-1);
            ServerRelease(coachAttendantLineLock[myID],-1);
            /*find a seat for this passenger*/
            ServerAcquire(globalSeatLock,-1);
            SetMV(GetMV(passengerTicketsSeatNumber[myID],-1), GetMV(nextSeat,-1),-1);
            /*side effect seat is incremented after print*/
            three[0] = myID;
            three[1] = GetMV(nextSeat,-1);
            three[2] = GetMV(GetMV(passengerTicketsHolder[myID],-1),-1);
            Print("Coach Attendant %d of Train 0 gives seat number %d to Passenger %d\n",sizeof("Coach Attendant %d of Train 0 gives seat number %d to Passenger %d\n"),three,3);
            SetMV(nextSeat, GetMV(nextSeat,-1) + 1,-1);
            /*/decrement my line length*/
            SetMV(coachAttendantRegularLineLength[myID], GetMV(coachAttendantRegularLineLength[myID],-1) - 1,-1);
            ServerRelease(globalSeatLock,-1);
            ServerSignal(getSeat[myID], getSeatLock[myID],-1);
            ServerRelease(getSeatLock[myID],-1);
            ServerAcquire(boardingPassengersCountLock,-1);
            SetMV(passengersBoardedAtThisStop[GetMV(currentStop,-1)], GetMV(passengersBoardedAtThisStop[GetMV(currentStop,-1)],-1) + 1,-1);
            ServerRelease(boardingPassengersCountLock,-1);
            if(GetMV(passengersBoardedAtThisStop[GetMV(currentStop,-1)],-1) == GetMV(passengersWaitingToBoard[GetMV(currentStop,-1)],-1)) {
                ServerAcquire(waitingForBoardingCompletionLock,-1);
                /*printf("CA%d finds that all passengers have boarded for this stop and is telling conductor\n",myID);*/
                ServerSignal(waitingForBoardingCompletion, waitingForBoardingCompletionLock,-1);
                ServerRelease(waitingForBoardingCompletionLock,-1);
            }

        }
        else if(GetMV(coachAttendantFoodLineLength[myID],-1) != 0) {
            /*do food orders*/
            ServerAcquire(coachAttendantLineLock[myID],-1);
            /*printf("coachAttendant%d has %d people in food line\n and is signalling the first to come up\n", myID, coachAttendantFoodLineLength[myID]);*/
            ServerSignal(coachAttendantFoodLine[myID], coachAttendantLineLock[myID],-1);

            ServerAcquire(coachAttendantGetFoodLock[myID],-1);
            ServerRelease(coachAttendantLineLock[myID],-1);

            /*validate food orders until what they want is in stock*/
            do {
                ServerWait(coachAttendantGetFood[myID], coachAttendantGetFoodLock[myID],-1);
                ServerAcquire(globalFoodLock,-1);

                if(GetMV(foodStock[GetMV(GetMV(coachAttendantOrderFoodOrder[myID],-1),-1)],-1) == 0) {
                    SetMV(GetMV(coachAttendantOrderValidFoodOrder[myID],-1), false,-1);
                }
                else {
                    SetMV(GetMV(coachAttendantOrderValidFoodOrder[myID],-1), true,-1);
                    SetMV(foodStock[GetMV(GetMV(coachAttendantOrderFoodOrder[myID],-1),-1)], GetMV(foodStock[GetMV(GetMV(coachAttendantOrderFoodOrder[myID],-1),-1)],-1) - 1,-1);
                }
                ServerRelease(globalFoodLock,-1);

                ServerSignal(coachAttendantGetFood[myID], coachAttendantGetFoodLock[myID],-1);
            } while (!GetMV(GetMV(coachAttendantOrderValidFoodOrder[myID],-1),-1));
            two[0] = myID;
            two[1] = GetMV(GetMV(coachAttendantOrderHolder[myID],-1),-1);
            Print("Coach Attendant %d of Train 0 takes food order of 1st class Passenger %d\n",sizeof("Coach Attendant %d of Train 0 takes food order of 1st class Passenger %d\n"),two,2);
            for(i = 0; i < CHEFS; i += 1) {
                ServerAcquire(chefLock[i],-1);
                if(GetMV(chefOnBreak[i],-1)) {
                    SetMV(chefOnBreak[i], false,-1);
                    myChef = i;
                    /*my chef was waiting for work, so i come up and signal him*/
                    ServerSignal(chef[myChef], chefLock[myChef],-1);
                    break;
                }
                else {
                    ServerRelease(chefLock[i],-1);
                }
            }
            /*No chef was available, so I have to get in line*/
            if(myChef==-1) {
                myChef = 0;
                ServerAcquire(chefLock[0],-1);
                shortestLength = GetMV(chefFirstClassOrdersLeft[0],-1);
                for(i = 1; i < CHEFS; i += 1) {
                    ServerAcquire(chefLock[i],-1);
                    if(GetMV(chefFirstClassOrdersLeft[i],-1) < shortestLength) {
                        shortestLength = GetMV(chefFirstClassOrdersLeft[i],-1);
                        ServerRelease(chefLock[myChef],-1);
                        myChef = i;
                    }
                    else {
                        ServerRelease(chefLock[i],-1);
                    }
                }
                ServerSignal(chef[myChef], chefLock[myChef],-1); /*QUESTIONABLE*/
            }
            /*now we definitely have a chef that will eventually want to see our order*/
            /*printf("CA%d acquires chef%d's lock\n",myID,myChef);*/
            ServerAcquire(chefOrdersLineLock[myChef],-1);
            SetMV(chefFirstClassOrdersLeft[myChef], GetMV(chefFirstClassOrdersLeft[myChef],-1) + 1,-1);
            ServerRelease(chefLock[myChef],-1);
            /*wait for the chef to cook my food*/
            /*printf("CA%d is waiting on chef%d to cook\n",myID,myChef);*/
            ServerWait(chefFirstClassOrdersLine[myChef], chefOrdersLineLock[myChef],-1);
            ServerRelease(chefOrdersLineLock[myChef],-1);
            three[0] = myID;
            three[1] = myChef;
            three[2] = GetMV(GetMV(coachAttendantOrderHolder[myID],-1),-1);
            Print("Coach Attendant %d of Train 0 takes food prepared by Chef %d to the 1st class Passenger %d\n", sizeof("Coach Attendant %d of Train 0 takes food prepared by Chef %d to the 1st class Passenger %d\n"),three,3);
            /*printf("CA%d has delivered the food from the chef, and is waiting for a tip\n",myID);*/
            /*wait for your tip*/
            ServerWait(coachAttendantGetFood[myID], coachAttendantGetFoodLock[myID],-1);
            /*I got my tip and I'm done with this guy*/
            SetMV(coachAttendantFoodLineLength[myID], GetMV(coachAttendantFoodLineLength[myID],-1) - 1,-1);
            ServerRelease(coachAttendantGetFoodLock[myID],-1);
        }
        else {
            /*printf("coachAttendant%d has nothing requiring his immediate attention\n", myID);*/
            SetMV(coachAttendantAvailable[myID], true,-1);
            ServerWait(coachAttendant[myID], coachAttendantLock[myID],-1);
        }
        /*FOR NOW coachAttendantLock[myID]->ServerRelease();*/
    }
} /*end of CoachAttendant*/
Example #9
0
void Waiter(){
	unsigned int myID;
	int myChef;
	int i = 0;
	int shortestLength;
	
	int one[1];
	int two[2];
	int three[3];
	int four[4];
	
	ServerAcquire(IDLock,-1);
	myID = GetMV(waiterID,-1);
	SetMV(waiterID, GetMV(waiterID,-1) + 1,-1);
	ServerRelease(IDLock,-1);
	
	while(true){
		myChef=-1;
		ServerAcquire(waiterLock[myID],-1);
		ServerAcquire(waiterLineLock[myID],-1);
		if(GetMV(waiterLineLength[myID],-1) != 0){
			ServerAcquire(waiterGetFoodLock[myID],-1);
			ServerRelease(waiterLock[myID],-1);  /*maybe wrong??!*/
			ServerSignal(waiterLine[myID], waiterLineLock[myID],-1);
			ServerRelease(waiterLineLock[myID],-1);
			/*process a waiting passenger*/
			do{
				ServerWait(waiterGetFood[myID], waiterGetFoodLock[myID],-1);
				ServerAcquire(globalFoodLock,-1);

				if(GetMV(foodStock[GetMV(GetMV(passengerFoodFoodOrder[myID],-1),-1)],-1) == 0){
					SetMV(GetMV(passengerFoodValidFoodOrder[myID],-1), false,-1);
				}
				else {
					SetMV(GetMV(passengerFoodValidFoodOrder[myID],-1), true,-1);
					SetMV(foodStock[GetMV(GetMV(passengerFoodFoodOrder[myID],-1),-1)], GetMV(foodStock[GetMV(GetMV(passengerFoodFoodOrder[myID],-1),-1)],-1) - 1,-1);
				}
				ServerRelease(globalFoodLock,-1);

				ServerSignal(waiterGetFood[myID], waiterGetFoodLock[myID],-1);
			} while (!GetMV(GetMV(passengerFoodValidFoodOrder[myID],-1),-1));
			two[0] = myID;
			two[1] = GetMV(GetMV(passengerFoodHolder[myID],-1),-1);
			Print("Waiter %d is serving Passenger %d of Train 0\n",sizeof("Waiter %d is serving Passenger %d of Train 0\n"),two,2);

			for(i = 0; i < CHEFS; i += 1){
				ServerAcquire(chefLock[i],-1);
				if(GetMV(chefOnBreak[i],-1)){
					SetMV(chefOnBreak[i], false,-1);
					myChef = i;
					/*my chef was waiting for work, so i come up and signal him*/
					ServerSignal(chef[myChef], chefLock[myChef],-1);
					break;
				}
				else{
					ServerRelease(chefLock[i],-1);
				}
			}
			/*No Porter was available, so I have to get in line*/
			if(myChef==-1){
				myChef = 0;
				ServerAcquire(chefLock[0],-1);
				shortestLength = GetMV(chefRegularOrdersLeft[0],-1);
				for(i = 1; i < CHEFS; i += 1){
					ServerAcquire(chefLock[i],-1);
					if(GetMV(chefRegularOrdersLeft[i],-1) < shortestLength){
						shortestLength = GetMV(chefRegularOrdersLeft[i],-1);
						ServerRelease(chefLock[myChef],-1);
						myChef = i;
					}
					else{
						ServerRelease(chefLock[i],-1);
					}				
				}
				ServerSignal(chef[myChef], chefLock[myChef],-1); /*QUESTIONABLE*/
			}
			/*now we definitely have a chef that will eventually want to see our order*/
			/*printf("waiter%d acquires chef%d's lock\n",myID,myChef);*/
			ServerAcquire(chefOrdersLineLock[myChef],-1);
			SetMV(chefRegularOrdersLeft[myChef], GetMV(chefRegularOrdersLeft[myChef],-1) + 1,-1);
			ServerRelease(chefLock[myChef],-1);
			/*wait for the chef to cook my food*/
			/*printf("waiter%d is waiting on chef%d to cook\n",myID,myChef);*/
			ServerWait(chefRegularOrdersLine[myChef], chefOrdersLineLock[myChef],-1);
			ServerRelease(chefOrdersLineLock[myChef],-1);
			/*one[0] = myID;*/
			/*Print("waiter%d has the order from the chef\n",sizeof("waiter%d has the order from the chef\n"),one,1);*/
			/*now I give the food to the passenger, and wait for him to eat,*/
			/*Print("waiter%d is waiting for the passenger to eat\n",sizeof("waiter%d is waiting for the passenger to eat\n"),one,1);*/
			
			/*waiterWaitingForEatingPassenger[myID]->ServerWait(waiterGetFoodLock[myID]);*/
			ServerWait(waiterGetFood[myID], waiterGetFoodLock[myID],-1);

			/*passenger is done eating and wating for a bill*/
			/*one[0] = myID;*/
			/*Print("waiter%d is giving passenger the bill\n",sizeof("waiter%d is giving passenger the bill\n"),one,1);*/

			/*passengerWaitingForBill[passengerFood[myID]->holder]->ServerSignal(waiterGetFoodLock[myID]);*/
			/*wait for payment*/
			ServerSignal(waiterGetFood[myID], waiterGetFoodLock[myID],-1);
			
			/*one[0] = myID;*/
			/*Print("waiter%d is waiting for passenger to pay\n",sizeof("waiter%d is waiting for passenger to pay\n"),one,1);*/

			/*waiterWaitingForMoney[myID]->ServerWait(waiterGetFoodLock[myID]);*/
			ServerWait(waiterGetFood[myID], waiterGetFoodLock[myID],-1);

			/*printf("waiter%d was paid by passenger%d!\n",myID, passengerFood[myID]->holder);*/
		
			/*update steward about the dining car safe*/
			ServerAcquire(waiterRevenueLock,-1);
			SetMV(waiterRevenue, GetMV(waiterRevenue,-1) + 2,-1);
			ServerRelease(waiterRevenueLock,-1);

			SetMV(waiterLineLength[myID], GetMV(waiterLineLength[myID],-1) - 1,-1);
			ServerAcquire(diningCarCapacityLock,-1);
			SetMV(diningCarCapacity, GetMV(diningCarCapacity,-1) + 1,-1); 
			ServerRelease(diningCarCapacityLock,-1);
			ServerRelease(waiterGetFoodLock[myID],-1);
		}
		else{
			one[0] = myID;
			Print("Waiter %d of Train 0 is going for a break\n",sizeof("Waiter %d of Train 0 is going for a break\n"),one,1);
			SetMV(waiterOnBreak[myID], true,-1);
			ServerRelease(waiterLineLock[myID],-1);
			ServerWait(waiter[myID], waiterLock[myID],-1);
			one[0] = myID;
			Print("Waiter %d of Train 0 returned from break\n",sizeof("Waiter %d of Train 0 returned from break\n"),one,1);
		}
	}
}/*end of Waiter*/
int main() {
	loop = TRUE;
	/* Handle Creation Stuff */
	
	/* gettin mah Clerk Index */
	initIndex = CreateMV("PaIn", sizeof("PaIn"), 1, 0x9999);
	initIndexLock = ServerCreateLock("PaInLk", sizeof("PaInLk"), 1);
	
	ServerAcquire(initIndexLock, 0);
	myIndex = GetMV(initIndex, 0);
	SetMV(initIndex, 0, myIndex + 1);
	ServerRelease(initIndexLock, 0);
	
	/* Locks */
	passLock = ServerCreateLock("PaLk", sizeof("PaLk"), NUM_CLERKS);
	senatorLock = ServerCreateLock("SeLk", sizeof("SeLk"), 1);
	customerLock = ServerCreateLock("CuLk", sizeof("CuLk"), 1);
	passLineLock = ServerCreateLock("PaLiLk", sizeof("PaLiLk"), 1);
	clerkWaitLock = ServerCreateLock("ClWaLk", sizeof("ClWaLk"), 1);
	fileLock = ServerCreateLock("FiLk", sizeof("FiLk"), NUM_CUSTOMERS + NUM_SENATORS);
	passMoneyLock = ServerCreateLock("PaMnLk", sizeof("PaMnLk"), 1);
	
	/* CVs */
	clerkWaitCV = ServerCreateCV("ClWaCV", sizeof("ClWaCV"), 1);
	passCV = ServerCreateCV("PaCV", sizeof("PaCV"), NUM_CLERKS);
	regPassLineCV = ServerCreateCV("RgPaCV", sizeof("RgPaCV"), 1);
	privPassLineCV = ServerCreateCV("PrPaCV", sizeof("PrPaCV"), 1);
	
	/* MVs */
	shutdownIndex = CreateMV("shut", sizeof("shut"), 1, 0x9999);
	officeSenatorIndex = CreateMV("OfSe", sizeof("OfSe"), 1, 0x9999);
	officeCustomerIndex = CreateMV("OfCu", sizeof("OfCu"), 1, 0x9999);
	regPassLineLengthIndex = CreateMV("RgPaLn", sizeof("RgPaLn"), 1, 0x9999);
	privPassLineLengthIndex = CreateMV("PrPaLn", sizeof("PrPaLn"), 1, 0x9999);
	numPassWaitIndex = CreateMV("NuPaWa", sizeof("NuPaWa"), 1, 0x9999);
	passDataIndex = CreateMV("PaDa", sizeof("PaDa"), NUM_CLERKS, 0x9999);
	passDataBoolIndex = CreateMV("PaDaBo", sizeof("PaDaBo"), NUM_CLERKS, 0x9999);
	passStateIndex = CreateMV("PaSt", sizeof("PaSt"), NUM_CLERKS, 0x9999);
	fileTypeIndex = CreateMV("FiTp", sizeof("FiTp"), NUM_CUSTOMERS + NUM_SENATORS, 0x9999);
	fileStateIndex = CreateMV("FiSt", sizeof("FiSt"), NUM_CUSTOMERS + NUM_SENATORS, 0x9999);
	passMoneyIndex = CreateMV("PaMn", sizeof("PaMn"), 1, 0x9999);
	
	traceLock = ServerCreateLock("trace", sizeof("trace"), 1);
	
	ServerAcquire(passLock, myIndex);
	SetMV(passStateIndex, myIndex, BUSY);
	ServerRelease(passLock, myIndex);
	
	while(loop == TRUE){
		shutdown = GetMV(shutdownIndex, 0);
		if (shutdown == TRUE) {
			ServerAcquire(traceLock, 0);
			ClerkTrace("Pass", myIndex, 0x00, 0, "Shutting down.\n");
			ServerRelease(traceLock, 0);
			Exit(0);
		}
		ServerAcquire(senatorLock, 0);		/* only one ServerLock, so acquire index 0? */
		ServerAcquire(customerLock, 0);
		
		officeSenator = GetMV(officeSenatorIndex, 0);
		officeCustomer = GetMV(officeCustomerIndex, 0);
		
		if(officeSenator > 0 && officeCustomer > 0){
			ServerRelease(senatorLock, 0);
			ServerRelease(customerLock, 0);

			ServerAcquire(clerkWaitLock, 0);
			ServerWait(clerkWaitCV, 0, clerkWaitLock, 0);
			ServerRelease(clerkWaitLock, 0);
		}
		else{
			ServerRelease(senatorLock, 0);
			ServerRelease(customerLock, 0);	
		}
		/* Check for customers in line */
		ServerAcquire(passLineLock, 0);
		
		privPassLineLength = GetMV(privPassLineLengthIndex, 0);
		regPassLineLength = GetMV(regPassLineLengthIndex, 0);
		if(privPassLineLength > 0){
		/* Decrement line length, set state to AVAIL, signal 1st customer and wait for them */
			privPassLineLength--;
			SetMV(privPassLineLengthIndex, 0, privPassLineLength);
			
			ServerAcquire(senatorLock, 0);
			numPassWait = GetMV(numPassWaitIndex, 0);
			numPassWait++;
			SetMV(numPassWaitIndex, 0, numPassWait);
			ServerRelease(senatorLock, 0);
			
			ServerAcquire(passLock, myIndex);
			SetMV(passStateIndex, myIndex, AVAILABLE);
			ServerSignal(privPassLineCV, 0, passLineLock, 0);
			ServerRelease(passLineLock, 0);
			
			/* wait for customer to signal me */
			ServerWait(passCV, myIndex, passLock, myIndex);
			
			/* customer gave me thier SSN index to check thier file */
			mySSN = GetMV(passDataIndex, myIndex);
			ServerAcquire(fileLock, mySSN);
			/* check customer type */
			
			cType = GetMV(fileTypeIndex, mySSN);
			
			fileState = GetMV(fileStateIndex, mySSN);
			if(fileState == APPPICDONE){
				SetMV(passDataBoolIndex, myIndex, TRUE);
				
				doPassport = TRUE;

				ServerAcquire(traceLock, 0);
				if(cType == CUSTOMER){
					ClerkTrace("Pass", myIndex, "Cust", mySSN, "Gives valid certification to Customer.\n");
				}
				else{
					ClerkTrace("Pass", myIndex, "Sen", mySSN, "Gives valid certification to Senator.\n");
				}
				ServerRelease(traceLock, 0);
			} else {
				SetMV(passDataBoolIndex, myIndex, FALSE);
				doPassport = FALSE;
				ServerAcquire(traceLock, 0);
				if(cType == CUSTOMER){
					ClerkTrace("Pass", myIndex, "Cust", mySSN, "Gives invalid certification to Customer.\n");
					ClerkTrace("Pass", myIndex, "Cust", mySSN, "Punishes Customer to wait.\n");		
				}
				else{
					ClerkTrace("Pass", myIndex, "Sen", mySSN, "Gives invalid certification to Senator.\n");
					ClerkTrace("Pass", myIndex, "Sen", mySSN, "Punishes Senator to wait.\n");
				}
				ServerRelease(traceLock, 0);
			}
			ServerRelease(fileLock, mySSN);

			/* add $500 to passClerk money amount for privileged fee */
			ServerAcquire(passMoneyLock, 0);
			passMoney = GetMV(passMoneyIndex, 0);
			passMoney += 500;
			SetMV(passMoneyIndex, 0, passMoney);
			ServerRelease(passMoneyLock, 0);

			ServerAcquire(traceLock, 0);
			if(cType == CUSTOMER){
				ClerkTrace("Pass", myIndex, "Cust", mySSN, "Accepts $500 from Customer.\n");
				ClerkTrace("Pass", myIndex, "Cust", mySSN, "Informs Customer that the procedure has been completed.\n");
			}
			else{
				ClerkTrace("Pass", myIndex, "Sen", mySSN, "Accepts $500 from Senator.\n");
				ClerkTrace("Pass", myIndex, "Sen", mySSN, "Informs Senator that the produre has been completed.\n");
			}
			ServerRelease(traceLock, 0);

			/* signal customer awake */
			ServerSignal(passCV, myIndex, passLock, myIndex);
			ServerRelease(passLock, myIndex);				/* release clerk lock */

			if(doPassport == TRUE){
				for(i = 0; i < 20; i++){
					/*Yield();	*/
				}

				ServerAcquire(fileLock, mySSN);
				SetMV(fileStateIndex, mySSN, PASSDONE);
				ServerRelease(fileLock, mySSN);
				
				ServerAcquire(traceLock, 0);
				if(cType == CUSTOMER){
					ClerkTrace("Pass", myIndex, "Cust", mySSN, "Finished filing Customer's passport.\n");
				}
				else{
					ClerkTrace("Pass", myIndex, "Sen", mySSN, "Finished filing Senator's passport.\n");
				}
				ServerRelease(traceLock, 0);
			}
			
			doPassport = FALSE;
			mySSN = 0;
		}

		else if (regPassLineLength > 0){
		/* Decrement line length, set state to AVAIL, signal 1st customer and wait for them */
			regPassLineLength--;
			SetMV(regPassLineLengthIndex, 0, regPassLineLength);
			
			ServerAcquire(senatorLock, 0);
			numPassWait = GetMV(numPassWaitIndex, 0);
			numPassWait++;
			SetMV(numPassWaitIndex, 0, numPassWait);
			ServerRelease(senatorLock, 0);
			
			ServerAcquire(passLock, myIndex);
			SetMV(passStateIndex,  myIndex, AVAILABLE);
			ServerSignal(regPassLineCV, 0, passLineLock, 0);
			ServerRelease(passLineLock, 0);
			ServerWait(passCV, myIndex, passLock, myIndex); /* wait for customer to signal me */

			/* customer gave me thier SSN index to check thier file */
			mySSN = GetMV(passDataIndex, myIndex);
			ServerAcquire(fileLock, mySSN);
			/* check customer type */
			cType = GetMV(fileTypeIndex, mySSN);
			fileState = GetMV(fileStateIndex, mySSN);
			
			if(fileState == APPPICDONE){
				SetMV(passDataBoolIndex, myIndex, TRUE);
				doPassport = TRUE;

				ServerAcquire(traceLock, 0);
				if(cType == CUSTOMER){
					ClerkTrace("Pass", myIndex, "Cust", mySSN, "Gives valid certification to Customer.\n");
				}
				else{
					ClerkTrace("Pass", myIndex, "Sen", mySSN, "Gives valid certification to Senator.\n");
				}
				ServerRelease(traceLock, 0);
			} else {
				SetMV(passDataBoolIndex, myIndex, FALSE);
				doPassport = FALSE;
				/*Trace("CUSTOMER'S STATE WAS ", fileState);
				Trace("\n", 0x9999);*/
				
				ServerAcquire(traceLock, 0);
				if(cType == CUSTOMER){
					ClerkTrace("Pass", myIndex, "Cust", mySSN, "Gives invalid certification to Customer.\n");
					ClerkTrace("Pass", myIndex, "Cust", mySSN, "Punishes Customer to wait.\n");	
				}
				else{
					ClerkTrace("Pass", myIndex, "Sen", mySSN, "Gives invalid certification to Senator.\n");
					ClerkTrace("Pass", myIndex, "Sen", mySSN, "Punishes Senator to wait.\n");
				}
				ServerRelease(traceLock, 0);
			}
			
			ServerAcquire(traceLock, 0);
			if(cType == CUSTOMER){
				ClerkTrace("Pass", myIndex, "Cust", mySSN, "Informs Customer that the procedure has been completed.\n");
			}
			else{
				ClerkTrace("Pass", myIndex, "Sen", mySSN, "Informs Senator that the procedure has been completed.\n");
			}
			ServerRelease(traceLock, 0);

			ServerRelease(fileLock, mySSN);

			ServerSignal(passCV, myIndex, passLock, myIndex); /* signal customer awake */
			ServerRelease(passLock, myIndex);				/* release clerk lock */

			if(doPassport){
				for(i = 0; i < 20; i++){
					/*Yield();*/
				}

				ServerAcquire(fileLock, mySSN);
				SetMV(fileStateIndex, mySSN, PASSDONE);
				ServerRelease(fileLock, mySSN);
				
				ServerAcquire(traceLock, 0);
				if(cType == CUSTOMER){
					ClerkTrace("Pass", myIndex, "Cust", mySSN, "Finished filing Customer's passport.\n");
				}
				else{
					ClerkTrace("Pass", myIndex, "Sen", mySSN, "Finished filing Senator's passport.\n");
				}
				ServerRelease(traceLock, 0);
			}
			doPassport = FALSE;
			mySSN = 0;
		}
		else{
			/* No one in line...take a break */
			ServerRelease(passLineLock, 0);
			ServerAcquire(passLock, myIndex);
			
			ServerAcquire(traceLock, 0);
			ClerkTrace("Pass", myIndex, 0x00, 0, "Goin on break.\n");
			ServerRelease(traceLock, 0);
			
			SetMV(passStateIndex, myIndex, BREAK);
			ServerWait(passCV, myIndex, passLock, myIndex);
			
			ServerAcquire(traceLock, 0);
			ClerkTrace("Pass", myIndex, 0x00, 0, "Returning from break.\n");
			ServerRelease(traceLock, 0);

			ServerRelease(passLock, myIndex);
		}
	}
}