예제 #1
0
/*Free functions*/
void destroySet(int lines, Cache destroyMe, int assoc){
	if(destroyMe->nextLevel!=NULL){
		/*need to determine kind*/
				if(strcmp(destroyMe->nextLevel->type, "direct")==0){
					destroyDirect(destroyMe->nextLevel->numofSet, destroyMe->nextLevel, destroyMe->nextLevel->assoc);
				}	
				if((strlen(destroyMe->nextLevel->type)>=7)&&(strncmp(destroyMe->nextLevel->type,"assoc:", 5)==0)){
				//	printf("I came here");
					destroySet(destroyMe->nextLevel->numofSet, destroyMe->nextLevel, destroyMe->nextLevel->assoc);
				}
				if((strlen(destroyMe->nextLevel->type)==5)&& (strcmp(destroyMe->nextLevel->type,"assoc")==0)){
					destroySet(destroyMe->nextLevel->numofSet, destroyMe->nextLevel, destroyMe->nextLevel->assoc);
				}
			}

	for (int i=0;i<lines;i++){
		if((strlen(destroyMe->type)>=7)&&(strncmp(destroyMe->type,"assoc:", 5)==0)){
			/*destroy dll for each individual set*/
				if(destroyMe->blocks[i]->LRU!=NULL){
					SLDestroy(destroyMe->blocks[i]->LRU);
					destroyMe->blocks[i]->LRU=NULL;
				}
				else{
					destroyQueue(destroyMe->blocks[i]->FIFO);
					destroyMe->blocks[i]->FIFO=NULL;
				}
			/*destroy queue for each individual set*/
		}
		free(destroyMe->blocks[i]);
	}
	/*destroy FA's fifo or lru*/
	if((strcmp(destroyMe->type,"FA")==0)||((strlen(destroyMe->type)==5)&& (strcmp(destroyMe->type,"assoc")==0))){
		/*only for FA*/
		if(destroyMe->LRU!=NULL){
					SLDestroy(destroyMe->LRU);
					destroyMe->LRU=NULL;
				}
		else{
				destroyQueue(destroyMe->FIFO);
				destroyMe->FIFO=NULL;
			}
	}
	free(destroyMe->blocks);
	free(destroyMe);
	destroyMe=NULL;
	return;

}
예제 #2
0
static void _traverseBFT (BSTNODE* root, void (*process) (PACKAGE* package) )
{
	BSTNODE* currentNode;
	BSTNODE* tempNode;
	QUEUE* queue;

	queue = createQueue();
	if(!queue)
	{
		printf("\nMemory Overflow!\n");
		exit(201);
	}
	currentNode = root;

	while(currentNode != NULL)
	{
		process ( currentNode->ptrPackage );
		if(currentNode->left != NULL)
			enqueue(queue, currentNode->left);
		if(currentNode->right != NULL)
			enqueue(queue, currentNode->right);
		if(!emptyQueue(queue))
		{
			dequeue(queue, (void**)&tempNode);
			currentNode = tempNode;
		}
		else currentNode = NULL;
	}
	queue = destroyQueue(queue);
	return;

}// _traverseBFT
예제 #3
0
int main(void) {
    QueuePtr queue = initQueue();
	char buffer[20];
	char sel = 0;
    while (sel != 'X'&&sel!='x') {
		printf("+++ Queue +++\n");
		printQueue(queue);
		printf("++++++\n");
		printf("1) Enqueue printID\n");
		printf("2) Enqueue printHello\n");
		printf("3) Enqueue printDate\n");
		printf("4) Dequeue and execute\n");
		printf("X) Exit\n");
        sel = getchar();
		while (getchar() != '\n');
		switch (sel) {
		case '1':
			enqueue(queue, printID, "printID");
			break;
		case '2':
			enqueue(queue, printHello, "printHello");
			break;
		case '3':
			enqueue(queue, printDate, "printDate");
			break;
		case '4':
			dequeue(queue, buffer);
            if(buffer[0]!='\0'&&buffer[0]!=NULL){
                printf("Executed: %s\n",buffer);
            }
		}
	}
    destroyQueue(queue);
	return 0;
}
예제 #4
0
int main() {
	
	char *array[] = {"mona", "is", "the", "best", "yes", "and", "that", "is", "the", "total", "truth", "ikram", "a3"};
	queueNode *myQueue;		/*creates a queue*/
	int i;					/*interator to add elements to the queue*/

	myQueue = createQueue(compareTest, copy, destroy);

	for (i = 0; i < 13; i++)
		enqueue(myQueue, array[i]);

	printf("\nafter elements added...\n");
	printQueue(myQueue, printTest);

	dequeue(myQueue);
	dequeue(myQueue);
	dequeue(myQueue);
	dequeue(myQueue);
	dequeue(myQueue);

	printf("\nafter 4 elements deleted...\n");
	printQueue(myQueue, printTest);

	destroyQueue(myQueue);

	return 0;
}
예제 #5
0
파일: part2.c 프로젝트: Juiposa/schoolwork
void destroyQueue( process * list ) {
	if( list == NULL )
		return;
	destroyQueue(list->next);
	free(list->name);
	free(list);
	return;
}
/*
command line args: threads, infile, outfile
*/
int main(int argc, char** argv){

	listSize = 0;
	srand(time(NULL));

	initQueue();

	list = getList(argv[2]);
	numThreads = atoi(argv[1]);
	pthread_t pool[numThreads];
	mailbox = malloc(sizeof(struct qnode) * numThreads);
	lock = malloc(sizeof(pthread_mutex_t) * numThreads);

	pthread_mutex_init(&qlock, NULL);

	int t = 0;
	int *args = malloc(sizeof(int) * numThreads);
	for(; t < numThreads; t++){
		args[t] = t;
		pthread_mutex_init(&lock[t], NULL);
		mailbox[t].start = -1;
		mailbox[t].end = -1;
		pthread_create(&pool[t], NULL, &bootstrap, &args[t]);
	}

	for(t = 0; t < numThreads; t++){
		pthread_join(pool[t], NULL);
		pthread_mutex_destroy(&lock[t]);
	}

	pthread_mutex_destroy(&qlock);

	writeList(argv[3], list);
	free(list);
	free(args);
	free(lock);
	free(mailbox);

	destroyQueue();

	return 0;
}
void levelOrderNonRecur(struct binaryTreeNode *root) {
    struct binaryTreeNode *temp;
    struct Queue *q = createQueue();
    
    if (!root) 
        return;
        
    enQueue(q, root);
    while (!isEmptyQueue(q)) {
        temp = deQueue(q);
        //Process current node
        printf("%d ", temp->data);
        if (temp->left)
            enQueue(q, temp->left);
        if (temp->right)
            enQueue(q, temp->right);
    }
    
    destroyQueue(q);
}
/*
find deepest node in binary tree

Time Complexity: O(n)
Space Complexity: O(n)
*/
struct binaryTreeNode *deepestNodeInBT(struct binaryTreeNode *root) {
    struct binaryTreeNode *temp;
    struct Queue *q;

    if (!root) 
        return NULL;

    q = createQueue();
    enQueue(q, root);
    while (!isEmptyQueue(q)) {
        temp = deQueue(q);
        if (temp->left)
            enQueue(q, temp->left);
        if (temp->right)
            enQueue(q, temp->right);
    }

    destroyQueue(q);
    return temp;
}
예제 #9
0
void lQueueTestMain()
{
	SqQueue<float> Q;
	initQueue(Q);
	for(int i=0;i<18;++i)
		enQueue(Q,3.14f*i);
	queueTraverse(Q);

	float a;
	for(int i=0;i<4;++i)
		deQueue(Q,a);
	queueTraverse(Q);

	cout<<queueLength(Q)<<endl;
	getQueueHead(Q,a);
	cout<<a<<endl;

	clearQueue(Q);
	destroyQueue(Q);
	int aa=100;
}
예제 #10
0
int main()
{

	queue* Q = createQueue();
	int i;

	do
	{
		printf("(1)enQueue (2)deQueue (3)getElement (4)clearQueue (5)traverse (6)length (7)exit : ");
		scanf("%d", &i);

		if (i == 1)
		{
			element ele;
			int temp;
			scanf("%d", &temp);
			ele.val = temp;

			enQueue(Q, ele);
		}
		else if (i == 2)
			printf("%s\n", deQueue(Q) ? "success" : "fail");
		else if (i == 3)
			printf("%d\n", getElement(Q).val);
		else if (i == 4)
			clearQueue(Q);
		else if (i == 5)
		{
			traverseQueue(Q, printElement);
			putchar('\n');
		}
		else if(i == 6)
			printf("%d\n",getLength(Q));

	} while (i != 7);

	destroyQueue(Q);

	return 0;
}
예제 #11
0
void BFSTraverse(graph *g, void (*visitFunc)(char e))
{
    visitFunc = print;
    int v = 0, w = 0;
    for(v = 0; v < g->verNum; v++)
        visited[v] = 0;
    char elem;
    queue *q = NULL;
    q = initQueue(q);
    for(v = 0; v < g->verNum; v++)
    {
        if(!visited[v])
        {
            (*visitFunc)(g->vertex[v]);
            visited[v] = 1;
            enQueue(q, g->vertex[v]);
        }
        while(!queueEmpty(*q))
        {
            deQueue(q, &elem);
            v = findIndex(*g, elem);
            if(v != -1)
            {
                for(w = firstAdjVex(g, v); w >= 0; w = nextAdjVex(g, v, w))
                {
                    if(!visited[w])
                    {
                        visited[w] = 1;
                        (*visitFunc)(g->vertex[w]);
                        enQueue(q, g->vertex[w]);
                    }
                }
            }
        }
    }
    destroyQueue(q);
}
/*
Get the number of full node within binary tree

Time Complexity: O(n)
Space Complexity: O(n)
*/
int fullNodeNumberInBt(struct binaryTreeNode *root) {

    struct binaryTreeNode *temp;
    struct Queue *q;
    int count = 0;

    if (!root)
        return 0;

    q = createQueue();
    enQueue(q, root);
    while(!isEmptyQueue(q)) {
        temp = deQueue(q);
        if (temp->left && temp->right)
            count++;
        if (temp->left)
            enQueue(q, temp->left);
        if (temp->right)
            enQueue(q, temp->right);
    }

    destroyQueue(q);
    return count;
}
예제 #13
0
int main(void)
{	
    Queue *queueOne = NULL, *queueTwo = NULL;
    node *persOne = NULL, *persTwo = NULL, *persThree, *firstPersOut = NULL;
    int i;
    int stationOne = 0, stationTwo = 0, stationThree = 0;
    int totTime = 0;
  
    printf("\nAirport Security Checkpoint Simulator\n");
    printf("=====================================\n\n");

    queueOne = createQueue();
    queueTwo = createQueue();
    
    srand( (unsigned)time(NULL) );
    
    /*  Assign random values to each person in the queue, between 60 and 180 seconds  */
    for (i = 0 ; i < 1000 ; i++)
    {
        int num = 0;
        
        num = rand()%(180-60) + 60;
        enqueue(queueOne, num);
    }
    
    printf("Number of people in line: %d\n", getLength(queueOne));
    
    persOne = dequeue(queueOne); 
    stationOne = persOne->nodeValue;
    enqueue(queueTwo, persOne->nodeValue);

    persTwo = dequeue(queueOne);
    stationTwo = persTwo->nodeValue;
    enqueue(queueTwo, persTwo->nodeValue);
    
    while (getLength(queueOne) != 0)
    {
        stationOne--;
        stationTwo--;
        
        if (stationOne == 0)
        {
            firstPersOut = persOne;
            persOne = dequeue(queueOne);
            stationOne = persOne->nodeValue;
            
            enqueue(queueTwo, firstPersOut->nodeValue);
        }
        else if (stationTwo == 0)
        {
            firstPersOut = persTwo;
            persTwo = dequeue(queueOne);
            stationTwo = persTwo->nodeValue;
            
            enqueue(queueTwo, firstPersOut->nodeValue);
        }      
        
        totTime++;
    }
    
    destroyQueue(queueOne);
    
    printf("Total Time for Two Stations: %.2f virtual minutes\n", (totTime/60.0));
    
    
    /* Test with 3 stations */
    totTime = 0;
    persOne = dequeue(queueTwo); 
    stationOne = persOne->nodeValue;

    persTwo = dequeue(queueTwo);
    stationTwo = persTwo->nodeValue;
    
    persThree = dequeue(queueTwo);
    stationThree = persThree->nodeValue;
    
    while (getLength(queueTwo) != 0)
    {
        stationOne--;
        stationTwo--;
        stationThree--;
        
        if (stationOne == 0)
        {
            firstPersOut = persOne;
            persOne = dequeue(queueTwo);
            stationOne = persOne->nodeValue;
        }
        else if (stationTwo == 0)
        {
            firstPersOut = persTwo;
            persTwo = dequeue(queueTwo);
            stationTwo = persTwo->nodeValue;
        }    
        else if (stationThree == 0)
        {
            firstPersOut = persThree;
            persThree = dequeue(queueTwo);
            stationThree = persThree->nodeValue;
        }   
        
        totTime++;
    }
    
    printf("Total Time for three Stations: %.2f virtual minutes\n", (totTime/60.0));
    destroyQueue(queueTwo);
    
    return (EXIT_SUCCESS);
}
예제 #14
0
파일: part2.c 프로젝트: Juiposa/schoolwork
int main(int argc, char * argv[]) {
	//so many variables :S
	process * waitQueue = NULL; //process waiting to be loaded
	process * memQueue = NULL; //list of processes in memory
	process * endQueue = NULL; //processes that have been laoded three times; if any
	process * workingProc = NULL; //process currently being operated on
	process * tempProc = NULL; //temp variable for swapping
	int i,k; //iterators
	int numLoads = 0; //number of loads completed
	int processes = 0; //number of process currently loaded
	int totalProcesses = 0; //cumulative process loaded across all operations
	int insertIndex = -1; //the index where the process will be put into memory
	int holes = 0; //current number of holes
	int currentHole = 0; //currently selected hole
	int mostSuitedHole = -1; //hole most suited for a process, used only by best/worst fit
	int totalHoles = 0; //total number of holes across all operations
	int memory[128]; //array representing memory
	int memUsage = 0; //amount of memory being used
	int totalMemUsage = 0; //cumulative usage across all operations
	FILE * fp; //file pointer is a file pointer

	for( k = 0; k < 4; k++ ) { //loop once for each memory management method
		//k = 0: first fit; 1: best fit; 2: next fit; 3: worst fit

		for( i = 0; i < 128; i++ ) { //memory initialisation
			memory[i] = 0;
		}
		fp = fopen( argv[1], "r" );
		if( fp == NULL ) { //teriminate if no file was entered on the command line
			printf("No file entered\n");
			return 0;
		}
		waitQueue = readFile(fp);

		if( k == 0 ) { //DEBUG
			print(waitQueue);
			printf("\n");
		} //END DEBUG

		while( waitQueue != NULL && k != 2 ) { //loop until all processes are in memory or have been completed
			workingProc = popFromQueue( &waitQueue ); //pop the next process from the ready queue
			while( insertIndex == -1 ) { //loop until a suitable hole has been found
				if( k == 0 && workingProc->size <= holeSize(memory, currentHole) ) { //first fit, simply if hole fits the process
					insertIndex = currentHole;
				} else if ( k == 1 && workingProc->size <= holeSize(memory, currentHole) ) { //best fit, will rotate throguh all of memory first
					if( mostSuitedHole == -1 ) { //first hole that meets criteria
						mostSuitedHole = currentHole;
					} else if (holeSize(memory, currentHole) < holeSize(memory, mostSuitedHole)) { //curhole is a better fit
						mostSuitedHole = currentHole;
					}
					if( currentHole == nextHole(memory, currentHole)) {
						insertIndex = mostSuitedHole;
					}
				} else if ( k == 3 && workingProc->size <= holeSize(memory, currentHole) ) { //best fit, will rotate throguh all of memory first
					if( mostSuitedHole == -1 ) { //first hole that meets criteria
						mostSuitedHole = currentHole;
					} else if (holeSize(memory, currentHole) > holeSize(memory, mostSuitedHole)) { //curhole is a better fit
						mostSuitedHole = currentHole;
					}
					if( currentHole == nextHole(memory, currentHole)) {
						insertIndex = mostSuitedHole;
					}
				}

				if( k != 2 && currentHole == nextHole(memory, currentHole) && insertIndex == -1 ) { //if no valid hole is found above
					//swap oldest process out
					tempProc = popFromQueue(&memQueue);
					if( tempProc->loaded != 3 ) { //not the third time its been swapped
						waitQueue = addToQueue(waitQueue, tempProc); //send it to the wait list
					} else {
						endQueue = addToQueue(endQueue, tempProc);
					}
					CLEARMEMORY(tempProc->start, tempProc->end); //unset its memory
					processes--;
					memUsage -= tempProc->size;
				}
				if( currentHole == nextHole(memory, currentHole) ) {
					currentHole = 0;
				} else {
					currentHole = nextHole(memory, currentHole);
				}				
			}
			if( k != 2 ) //only if not working under next fit, we reset the chosen hole everytime
				currentHole = 0;
			//a spot has been found
			
			//data tracking
			numLoads++;
			processes++;
			holes = countHoles(memory);
			totalProcesses += processes;
			totalHoles += holes;
			memUsage += workingProc->size;
			totalMemUsage += memUsage;

			//annoucement
			printf("%s loaded, #processes = %d, #holes = %d, %%memusage = %.0f, cumulative %%memusage = %.0f\n", workingProc->name, processes, holes, (float)memUsage / 128.0 * 100, \
				 ((float) totalMemUsage / (float)numLoads) / 128.0 * 100 );


			//inserting process
			workingProc->start = insertIndex;
			workingProc->end = workingProc->start + workingProc->size;
			workingProc->loaded++;
			SETMEMORY(workingProc->start, workingProc->end);
			memQueue = addToQueue( memQueue, workingProc );
			mostSuitedHole = -1;
			insertIndex = -1;
		}

		switch(k) {
			case 0: printf("\nFirst Fit \n"); break;
			case 1: printf("\nBest Fit\n"); break;
			case 2: printf("\nNext Fit - not implemented\n"); break;
			case 3: printf("\nWorst Fit\n"); break;
		}

		printf("Total loads = %d, average #processes = %.1f, average #holes = %.1f, cumulative %%memory = %.0f\n\n", numLoads, (float)totalProcesses / (float)numLoads, \
			(float)totalHoles / (float)numLoads, ((float) totalMemUsage / (float)numLoads / 128.0 * 100) );

		fclose(fp);
		destroyQueue(waitQueue);
		destroyQueue(memQueue);
		destroyQueue(endQueue);

		waitQueue = NULL;
		memQueue = NULL;
		endQueue = NULL;

		numLoads = 0;
		processes = 0;
		totalProcesses = 0; 
		insertIndex = -1; 
		holes = 0;
		currentHole = 0;
		mostSuitedHole = -1; 
		totalHoles = 0;
		memUsage = 0; 
		totalMemUsage = 0;
	}
 
	return 0;
}
예제 #15
0
int main() {

  // create the tree
  struct TreeNode *root = NULL;
  root = (struct TreeNode *)malloc(sizeof(struct TreeNode));
  root->data = 1;

  root->left = (struct TreeNode *)malloc(sizeof(struct TreeNode));
  (root->left)->data = 2;
  (root->left)->right = NULL;

  (root->left)->left = (struct TreeNode *)malloc(sizeof(struct TreeNode));
  ((root->left)->left)->data = 4;
  ((root->left)->left)->left = NULL;
  ((root->left)->left)->right = NULL;

  (root->left)->right = (struct TreeNode *)malloc(sizeof(struct TreeNode));
  ((root->left)->right)->data = 5;
  ((root->left)->right)->left = NULL;
  ((root->left)->right)->right = NULL;

  (root->right) = (struct TreeNode *)malloc(sizeof(struct TreeNode));
  (root->right)->data = 3;
  (root->right)->right = NULL;

  (root->right)->left = (struct TreeNode *)malloc(sizeof(struct TreeNode));
  ((root->right)->left)->data = 6;
  ((root->right)->left)->left = NULL;
  ((root->right)->left)->right = NULL;

  (root->right)->right = (struct TreeNode *)malloc(sizeof(struct TreeNode));
  ((root->right)->right)->data = 7;
  ((root->right)->right)->left = NULL;
  ((root->right)->right)->right = NULL;


  printf("     1   \n");
  printf("   /   \\  \n");
  printf("  2     3   \n");
  printf(" /  \\  / \\ \n");
  printf("4   5  6  7 \n");

  printf("\nPreOrder Traversal\n");
  preOrderTraversal(root);
  printf("\n");

  printf("InOrder Traversal\n");
  inOrderTraversal(root);
  printf("\n");

  printf("PostOrder Traversal\n");
  postOrderTraversal(root);
  printf("\n");

  printf("LevelOrder Traversal\n");
  struct TreeNode *temp = NULL;
  struct Queue *queue = createQueue();
  enqueue(queue, root);

  while(queue->front != NULL) {
    temp = dequeue(queue);
    printf(" %d ", temp->data);

    if(temp->left != NULL) {
      enqueue(queue, temp->left);
    }

    if(temp->right != NULL) {
      enqueue(queue, temp->right);
    }
  }

  printf("\n");
  destroyQueue(&queue);

  return 0;
}
예제 #16
0
파일: search.c 프로젝트: kushpatel/CPSC223
int search(struct position source, struct position target, int (*blocked)(struct position))
{
    struct position current;
    current = source;

    Dict d;
    d = DictCreate();

    PQ* q;
    q = initQueue();

    heapNode hn;
    hn.distFromSource = 0;
    hn.value = abs(current.x - target.x) + abs(current.y - target.y);
    hn.pos = current;
    enqueue(hn,q);
    DictInsert(d,current.x,current.y,hn.distFromSource);

    while(q->size)	//stops when priority queue is empty
    {
        int i;
        hn = dequeue(q);
        current = hn.pos;
        if(foundTarget(current,target))	//hooray! target found!!
        {
            DictDestroy(d);
            destroyQueue(q);
            return hn.distFromSource;
        }
        for(i = 0; i < 4; i++) //for loop explores all the four neighbors defined as 0...3
        {
            struct position neighbor = createNeighbor(current,i);
            int dictSearchDist = DictSearch(d,neighbor.x,neighbor.y);
            if(!blocked(neighbor) && dictSearchDist < 0)	//add the neighbor to PQ
            {
                DictInsert(d,neighbor.x,neighbor.y,hn.distFromSource + 1);
                heapNode node;
                int distToTarget = abs(neighbor.x - target.x) + abs(neighbor.y - target.y);	//manhattan distance
                node.value = (hn.distFromSource + 1) + distToTarget;
                node.pos = neighbor;
                node.distFromSource = hn.distFromSource + 1;
                enqueue(node,q);
            }
            else if(dictSearchDist >= 0)
            {
                if(dictSearchDist > hn.distFromSource + 1)
                {
                    DictInsert(d,neighbor.x,neighbor.y,hn.distFromSource + 1);
                    heapNode node;
                    int distToTarget = abs(neighbor.x - target.x) + abs(neighbor.y - target.y);	//manhattan distance
                    node.value = (hn.distFromSource + 1) + distToTarget;
                    node.pos = neighbor;
                    node.distFromSource = hn.distFromSource + 1;
                    enqueue(node,q);
                }
            }
        }
    }
    DictDestroy(d);
    destroyQueue(q);
    return NO_PATH;
}
예제 #17
0
파일: sync.c 프로젝트: darienurse/columbia
int sthread_sem_destroy(sthread_sem_t *sem)
{
	destroyQueue(sem->sem_queue);
	free ((void *)sem->mutex);
	return 0;
}
예제 #18
0
///////////////////////////////////////////////////////////////////////////////
//
// MAIN
//
///////////////////////////////////////////////////////////////////////////////
int main(int argc, char *argv[]) {
    // Обработка сигнала
    struct sigaction act;
    memset(&act, 0, sizeof(act));
    act.sa_handler = handleSigInt;
    sigaction(SIGINT, &act, 0);

    // Проверка количества аргументов
    if (argc < 4) {
        fprintf(stderr, "Too few arguments\n");
        exit(EXIT_FAILURE);
    }

    // Количество потоков - 1й параметр запуска
    int numberOfWorkers = atoi(argv[1]);

    // Порт - 2й параметр запуска
    char port[4];
    strcpy(port, argv[2]);

    // Путь к файлу с паролями - 3й параметр запуска
    readPasswordsFromFile(argv[3]);

    // Инициализация connections
    memset(connections, 0, sizeof(connections));

    struct addrinfo* addresses = getAvailableAddresses(port);
    if (!addresses) 
        exit(EXIT_FAILURE);

    // Получаем дескриптор сокета
    int _socketfd = getSocket(addresses);
    if (_socketfd == -1) {
        exit(EXIT_FAILURE);
    }

    setSocketFd(_socketfd);

    // Начинаем слушать сокет
    if (listen(socketfd, SOMAXCONN) == -1) {
        perror("listen\n");
        exit(EXIT_FAILURE);
    }

    // Создаём потоки
    pthread_t workers[numberOfWorkers];
    pthread_mutex_t mutex;
    pthread_mutexattr_t mutexattr;
    pthread_mutexattr_init(&mutexattr);
    pthread_mutexattr_settype(&mutexattr, PTHREAD_MUTEX_ERRORCHECK);
    pthread_mutex_init(&mutex, &mutexattr);
    pthread_mutex_init(&connectionsMutex, &mutexattr);
    pthread_cond_t condition;
    pthread_cond_init(&condition, NULL);

    // Создаём отдельный поток для отслеживания таймаута соединений
    pthread_t timeoutWatcher;
    pthread_create(&timeoutWatcher, NULL, watchTimeout, NULL);

    // Создаём очередь
    struct Queue queue;
    initQueue(&queue, sizeof(struct epoll_event));

    struct WorkerArgs workerArgs;
    initWorkerArgs(&workerArgs, &queue, &mutex, &condition);

    for (int i = 0; i < sizeof(workers) / sizeof(pthread_t); i++) {
        pthread_create(&workers[i], NULL, worker, (void *) &workerArgs);
    }

    // Создаём epoll
    int _epollfd = epoll_create1(0);
    if (_epollfd == -1) {
        perror("epoll_create error\n");
        exit(EXIT_FAILURE);
    }

    setEpollFd(_epollfd);

    // Добавляем сокет в epoll
    if (addToEpoll(epollfd, socketfd, EPOLLET | EPOLLIN) == -1)
        exit(EXIT_FAILURE);

    int maxEventNum = numberOfWorkers;
    struct epoll_event events[maxEventNum];

    int timeout = -1;
    printf("Main thread: %d\n", (int)pthread_self());
    while(!done) {
        int eventsNumber = epoll_wait(epollfd, events, maxEventNum, timeout);
        if (!eventsNumber)
            printf("No events\n");
        for (int i = 0; i < eventsNumber; i++) {
            pthread_mutex_lock(&mutex);
            pushQueue(&queue, &events[i]);
            pthread_cond_signal(&condition);
            pthread_mutex_unlock(&mutex);
        }
    }

    // Освобождение ресурсов
    pthread_mutex_destroy(&connectionsMutex);
    pthread_mutex_destroy(&mutex);
    pthread_mutexattr_destroy(&mutexattr);
    free(passPairs);
    destroyQueue(&queue);
    close(socketfd);
    close(epollfd);
    printf("DONE!!!");
    return 0;
}
예제 #19
0
int main( void )
{
	QUEUE *queue;
	QUEUE_NODE *queueNode;
	void* dataInPtr;
	void* dataOutPtr;
	int queue_status;
	int queue_element_count;
	
	queue = createQueue ();

	//a.print queue status, Empty
	printf("Test Case(a) : Print queue status, Empty\n\n");
	queue_status = emptyQueue(queue);
	if(queue_status == 1)
	{
		printf("queue status : Empty\n");
	}
	else
	{
		printf("queue status : not empty\n");
	}
	printf("\n\n");
	
	//b.Dequeue and print data. Should return error
	printf("Test Case(b) : Dequeue and print data\n\n");
	dequeue( queue, &dataOutPtr );
	printf("\n\n");
		
	//c. Enqueue data into queue
	printf("Test Case(c) : Enqueue data into queue : Ann\n\n");
	dataInPtr = (char*)calloc((strlen("Ann")+1), sizeof(char) );
	strcpy(dataInPtr, "Ann");
	enqueue( queue, dataInPtr);
	
	//d. Enqueue data into queue
	printf("Test Case(d) : Enqueue data into queue : Bob\n\n");
	dataInPtr = (char*)calloc(strlen("Bob")+1, sizeof(char) );
	strcpy(dataInPtr, "Bob");
	enqueue( queue, dataInPtr);

	//e.Print queue status, Empty
	printf("Test Case(e) : Print queue status, Empty\n\n");
	queue_status = emptyQueue(queue);
	if(queue_status == 1)
	{
		printf("queue status : Empty\n");
	}
	else
	{
		printf("queue status : not empty\n");
	}
	printf("\n\n");
	
	//f.Print queue status, Full
	printf("Test Case(f) : Print queue status, Full\n\n");
	queue_status = fullQueue( queue );
	if(queue_status == 1)
	{
		printf("queue status : Full\n");
	}
	else
	{
		printf("queue status : not full\n");
	}
	printf("\n\n");
	
	//g. Print data at the front
	printf("Test Case(g) : Print data at the front\n\n");
	queueFront  ( queue, &dataOutPtr );
	printf("Data at the queue front is : %s\n", queue->front->dataPtr);
	printf("\n\n");
	
	//h. Print data at the rear
	printf("Test Case(h) : Print data at the rear\n\n");
	queueRear   ( queue, &dataOutPtr );
	printf("Data at the queue rear is : %s\n", queue->rear->dataPtr);
	printf("\n\n");

	//i. Print entire queue
	printf("Test Case(i) : Print entire queue\n\n");
	printf("The entire queue is : ");
	queueNode = queue->front;
	while(queueNode != NULL)
	{
		printf("%s ", queueNode->dataPtr);
		queueNode = queueNode->link;
	}
	printf("\n\n");

	//j.Print number of element in queue
	printf("Test Case(j) : Print number of element in queue\n\n");
	queue_element_count = queueCount( queue );
	printf("total no of element in queue is %d\n", queue_element_count);
	printf("\n\n");
	
	//k.Dequeue and print data
	printf("Test Case(k) : Dequeue and print data\n\n");
	dequeue( queue, &dataOutPtr );
	printf("after dequeueing we got : %s\n", dataOutPtr);
	free(dataOutPtr);
	printf("\n\n");

	//l.Dequeue and print data
	printf("Test Case(l) : Dequeue and print data\n\n");
	dequeue( queue, &dataOutPtr );
	printf("after dequeueing we got : %s\n", dataOutPtr);
	free(dataOutPtr);
	printf("\n\n");
	
	//m.Dequeue and print data
	printf("Test Case(m) : Dequeue and print data\n\n");
	dequeue( queue, &dataOutPtr );
	printf("\n\n");
	
	//n. Enqueue data into queue
	printf("Test Case(n) : Enqueue and print data : Dan\n\n");
	dataInPtr = (char*)calloc(strlen("Dan")+1, sizeof(char) );
	strcpy(dataInPtr, "Dan");
	enqueue( queue, dataInPtr );
	
	//o. Print data at the front
	printf("Test Case(o) : Print data at the front\n\n");
	queueFront  ( queue, &dataOutPtr );
	printf("Data at the queue front is : %s\n", queue->front->dataPtr);
	printf("\n\n");
	
	//p. Print data at the rear
	printf("Test Case(p) : Print data at the rear\n\n");
	queueRear   ( queue, &dataOutPtr );
	printf("Data at the queue rear is : %s\n", queue->rear->dataPtr);
	printf("\n\n");
	

	//q. Enqueue data into queue
	printf("Test Case(q) : Enqueue data into queue : Tom\n\n");
	dataInPtr = (char*)calloc(strlen("Tom")+1, sizeof(char) );
	strcpy(dataInPtr, "Tom");
	enqueue( queue, dataInPtr );
	
	//r. print data at the front
	printf("Test Case(r) : Print data at the front\n\n");
	queueFront( queue, &dataOutPtr );
	printf("Data at the queue front is : %s\n", queue->front->dataPtr);
	printf("\n\n");
	
	//s. Print data at the rear
	printf("Test Case(s) : Print data at the rear\n\n");
	queueRear   ( queue, &dataOutPtr );
	printf("Data at the queue rear is : %s\n", queue->rear->dataPtr);
	printf("\n\n");

	//t. Destroy queue and quit
	printf("Test Case(t) : Destroy queue and quit\n\n");
	destroyQueue( queue );
	#ifdef _MSC_VER
    printf( _CrtDumpMemoryLeaks() ? "Memory Leak\n" : "No Memory Leak\n");
    #endif    
	system("pause");
    return 0;
}