⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 queue.c

📁 这是基于C语言开发的分布式搜索源代码
💻 C
字号:
#include "queue.h"/* Initialize QUEUE */QUEUE *queue_init(){	QUEUE *queue = (QUEUE *)calloc(1, sizeof(QUEUE));	if(queue)	{		queue->push	= queue_push;		queue->pop		= queue_pop;		queue->del		= queue_del;		queue->head	= queue_head;		queue->tail	= queue_tail;		queue->clean	= queue_clean;        	pthread_mutex_init(&(queue->mutex), NULL);			}	return queue;}/* Push QUEUE_ELEM to QUEUE tail */void queue_push(QUEUE *queue, void *data){	if(queue)	{                pthread_mutex_lock(&(queue->mutex));		if(queue->last)		{			queue->last->next = (QUEUE_ELEM *)calloc(1, sizeof(QUEUE_ELEM));			queue->last = queue->last->next;		}			else		{			queue->last = (QUEUE_ELEM *)calloc(1, sizeof(QUEUE_ELEM));			if(queue->first == NULL) queue->first = queue->last;		}		queue->last->data = data;		queue->total++;                pthread_mutex_unlock(&(queue->mutex));	}	}/* Pop QUEUE_ELEM data from QUEUE head and free it */void *queue_pop(QUEUE *queue){	void *p = NULL;	QUEUE_ELEM *elem = NULL;	if(queue)	{                pthread_mutex_lock(&(queue->mutex));		if(queue->total > 0 && (elem = queue->first) )		{			p = elem->data;			if(queue->first == queue->last)			{				queue->first = queue->last = NULL;			}			else			{				queue->first = queue->first->next;			}			free(elem);			queue->total--;		}                pthread_mutex_unlock(&(queue->mutex));	}	return p;}/* Delete QUEUE_ELEM data from QUEUE head and free it */void queue_del(QUEUE *queue){        QUEUE_ELEM *elem = NULL;         if(queue)        {                pthread_mutex_lock(&(queue->mutex));		if(queue->total > 0 && (elem = queue->first) )		{			elem = queue->first;			if(queue->first == queue->last)			{				queue->first = queue->last = NULL;			}			else			{				queue->first = queue->first->next;			}			free(elem);			queue->total--;		}                pthread_mutex_unlock(&(queue->mutex));        }        return ;}/* Get QUEUE head data don't free */void *queue_head(QUEUE *queue){	void *p = NULL;	if(queue && queue->first)	{		 p = queue->first->data;	}	return p;}/* Get QUEUE tail data don't free */void *queue_tail(QUEUE *queue){        void *p = NULL;        if(queue && queue->last)        {                 p = queue->last->data;        }        return p;}/* Clean QUEUE */void queue_clean(QUEUE **queue){	QUEUE_ELEM *elem = NULL, *p = NULL;	if(queue)	{		pthread_mutex_lock(&((*queue)->mutex));		p = elem = (*queue)->first;		while((*queue)->total > 0 && elem)		{			elem = elem->next;			free(p);				p = elem;			(*queue)->total--;		}							pthread_mutex_unlock(&((*queue)->mutex));		pthread_mutex_destroy(&((*queue)->mutex));		free((*queue));		(*queue) = NULL;	}}#ifdef _DEBUG_QUEUEint main(){	void *s = NULL;	int size = 1024;	char buf[size][8];	int n = 0;	int i = 0, j = 0 ;	QUEUE *queue = queue_init();	if(queue)	{		for(i = 0; i < size; i++)		{			n = sprintf(buf[i], "%d", i);						queue->push(queue, buf[i]);			if((i % 5) == 0 )			{				fprintf(stdout, "id:%d => data:%s\n",					 j++, (char *)queue->pop(queue));				fprintf(stdout, "head:%s => tail:%s\n",					(char *) (queue->head(queue)),					(char *) (queue->tail(queue)) );				QUEUE_VIEW(queue);			}		}			QUEUE_VIEW(queue);		queue->clean(&queue);				}}#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -