Beispiel #1
0
void *MaekawaProcess(void* queue) {
	printf("MaekawaProcess Thread created\n");
	wqueue<Packet*>*m_queue=(wqueue<Packet*>*)queue;
	MaekawaAlgorithm *mnode = MaekawaAlgorithm::getInstance();
	sleep(5);
	// Remove 1 item at a time and process it. Blocks if no items are
	// available to process.
	for (int i = 0;; i++) {
		printf("MaekawaProcessing Thread , loop %d - waiting for item...\n", i);
		Packet* item = m_queue->remove();
		//printf("thread  loop %d - got one item\n", i);
		printf("Received: messageType - %d, SEQ number - %ld\n",item->TYPE, item->SEQ);
        
        switch (item->TYPE) {
            case MAKE_REQUEST:
                printf(" ## MAKE_REQUEST received from Node %d and packet type is %d\n",item->ORIGIN,item->TYPE);
                mnode->receiveMakeRequest(*item);
                break;
            case REQUEST:
                printf(" ## REQUEST received from Node %d and packet type is %d\n",item->ORIGIN,item->TYPE);
                mnode->receiveRequest(*item);
                break;
            case INQUIRE:
                printf(" ## INQUIRE received from Node %d and packet type is %d\n",item->ORIGIN,item->TYPE);
                mnode->receiveInquire(*item);
                break;
            case FAILED:
                printf(" ## FAILED received from Node %d and packet type is %d\n",item->ORIGIN,item->TYPE);
                mnode->receiveFailed(*item);
                break;
            case RELEASE:
                printf(" ## RELEASE received from Node %d and packet type is %d\n",item->ORIGIN,item->TYPE);
                mnode->receiveRelease(*item);
                break;
            case RELINQUISH:
                printf(" ## RELINQUISH received from Node %d and packet type is %d\n",item->ORIGIN,item->TYPE);
                mnode->receiveRelinquish(*item);
                break;
            case LOCKED:
                printf(" ## LOCKED received from Node %d and packet type is %d\n",item->ORIGIN,item->TYPE);
                mnode->receiveLocked(*item);
                break;
                
            default:
                break;
        }
        delete item;
	}
	return NULL;
}
Beispiel #2
0
void *MaekawaProcess(void* iqueue) {
	printf("MaekawaProcess Thread created\n");

	long messageCounter = 0;
	long timeCounter = 0;
	//getting time for CS grant
	long utime, seconds, useconds;
	queue<struct timeval> timequeue;
	//struct timeval start1;

	wqueue<Packet*>*m_queue=(wqueue<Packet*>*)iqueue;
	MaekawaAlgorithm *mnode = MaekawaAlgorithm::getInstance();
	sleep(5);

	long s=1;
	long e =0;
	// Remove 1 item at a time and process it. Blocks if no items are
	// available to process.
	for (int i = 0;; i++) {
		printf("MaekawaProcessing Thread , loop %d - waiting for item...\n", i);
		Packet* item = m_queue->remove();
		//printf("thread  loop %d - got one item\n", i);
		
		//uncomment for unreliable
		//if(!randDecision()){
		//	printf("===>Missed a packet from Node %d(Origin: %d) and packet type is %d\n",item->sender,item->ORIGIN,item->TYPE);
		//	continue;
		//}
		printf("Received: messageType - %d, SEQ number - %ld\n",item->TYPE, item->SEQ);

        switch (item->TYPE) {
            case MAKE_REQUEST:
                printf(" ## MAKE_REQUEST received from Node %d and packet type is %d\n",item->ORIGIN,item->TYPE);
                struct timeval start;
                gettimeofday(&start, NULL);
                timequeue.push(start);
                s = start.tv_sec;
                printf("start time: %l\n",s);
                mnode->receiveMakeRequest(*item);

                break;
            case REQUEST:
                printf(" ## REQUEST received from Node %d and packet type is %d\n",item->ORIGIN,item->TYPE);
                mnode->receiveRequest(*item);
                if(item->ORIGIN != mnode->processID)
                	messageCounter++;
                break;
            case INQUIRE:
                printf(" ## INQUIRE received from Node %d and packet type is %d\n",item->ORIGIN,item->TYPE);
                mnode->receiveInquire(*item);
                if(item->ORIGIN != mnode->processID)
                    messageCounter++;
                break;
            case FAILED:
                printf(" ## FAILED received from Node %d and packet type is %d\n",item->ORIGIN,item->TYPE);
                mnode->receiveFailed(*item);
                if(item->ORIGIN != mnode->processID)
                    messageCounter++;
                break;
            case RELEASE:
                printf(" ## RELEASE received from Node %d and packet type is %d\n",item->ORIGIN,item->TYPE);
                mnode->receiveRelease(*item);
                if(item->ORIGIN != mnode->processID)
                    messageCounter++;
                break;
            case RELINQUISH:
                printf(" ## RELINQUISH received from Node %d and packet type is %d\n",item->ORIGIN,item->TYPE);
                mnode->receiveRelinquish(*item);
                if(item->ORIGIN != mnode->processID)
                    messageCounter++;
                break;
            case LOCKED:
                printf(" ## LOCKED received from Node %d and packet type is %d\n",item->ORIGIN,item->TYPE);
                mnode->flagforCS = false;
                struct timeval end;
				gettimeofday(&end, NULL);
				e = end.tv_sec;

				struct timeval start1;
				start1 = timequeue.front();
				seconds  = end.tv_sec  - start1.tv_sec;
				useconds = end.tv_usec - start1.tv_usec;
				utime = ((seconds) * 1000000 + useconds) + 0.5;
				printf("end time:%l, totaltime: %l",e,utime);
                mnode->receiveLocked(*item);
                if(mnode->flagforCS){//node entered CS on this Locked
					//struct timeval end;
					//gettimeofday(&end, NULL);
					//struct timeval start = timequeue.front();
					timequeue.pop();
					//seconds  = end.tv_sec  - start.tv_sec;
					//useconds = end.tv_usec - start.tv_usec;
					//utime = ((seconds) * 1000000 + useconds) + 0.5;
					timeCounter += utime;

				}
				if(item->ORIGIN != mnode->processID)
				messageCounter++;
                break;
            case END_PROCESS:
            	printf("END_PROCESS recieved from Node %d and packet type is %d\n",item->ORIGIN,item->TYPE);
            	delete item;
            	endProcessing(mnode->processID,messageCounter,timeCounter);
            	break;
            default:
                break;
        }
        delete item;
	}
	return NULL;
}