secgateway/Platform/user/rpc/rpc_queue.c

100 lines
2.2 KiB
C
Executable File

/*
* rpc_queue.c
*
* Created on: 2011-3-22
* Author: yanghu
*/
#include "rpc_queue.h"
#include <pthread.h>
#define FREE_ITEM_LEN 32
struct _rpc_queue {
rpc_queue_item *head;
rpc_queue_item *tail;
pthread_mutex_t mutex;
};
static pthread_mutex_t free_list_locker = PTHREAD_MUTEX_INITIALIZER;
static rpc_queue_item *free_item_list;
rpc_queue_item *rpc_queue_item_new() {
rpc_queue_item *item = NULL;
if (free_item_list != NULL) {
pthread_mutex_lock(&free_list_locker);
if (free_item_list != NULL) {
item = free_item_list;
free_item_list = free_item_list->next;
}
pthread_mutex_unlock(&free_list_locker);
}
if (item == NULL) {
item = rpc_new(rpc_queue_item,FREE_ITEM_LEN);
if (item == NULL)
return NULL;
int i;
for (i = 2; i < FREE_ITEM_LEN; i++) {
item[i - 1].next = item + i;
}
pthread_mutex_lock(&free_list_locker);
item[FREE_ITEM_LEN - 1].next = free_item_list;
free_item_list = item + 1;
pthread_mutex_unlock(&free_list_locker);
}
return item;
}
void rpc_queue_item_free(rpc_queue_item *item) {
pthread_mutex_lock(&free_list_locker);
if (free_item_list != NULL) {
item->next = free_item_list;
} else {
item ->next = NULL;
}
free_item_list = item;
pthread_mutex_unlock(&free_list_locker);
}
rpc_queue *rpc_queue_new() {
rpc_queue *q = rpc_new(rpc_queue,1);
q->head = NULL;
q->tail = NULL;
pthread_mutex_init(&q->mutex, NULL);
return q;
}
void *rpc_queue_pop(rpc_queue *queue) {
rpc_queue_item *item = NULL;
pthread_mutex_lock(&queue->mutex);
item = queue->head;
if (item != NULL) {
queue->head = item->next;
if (item->next == NULL) {
queue->tail = NULL;
}
}
pthread_mutex_unlock(&queue->mutex);
if (item) {
rpc_queue_item_free(item);
return item->data;
} else {
return NULL;
}
}
void rpc_queue_push(rpc_queue *queue, void *data) {
rpc_queue_item *item = rpc_queue_item_new();
item->data = data;
item->next = NULL;
pthread_mutex_lock(&queue->mutex);
if (queue->tail != NULL) {
queue->tail->next = item;
} else {
queue->head = item;
}
queue->tail = item;
pthread_mutex_unlock(&queue->mutex);
}