Sources/aliyun-log-c-sdk/log_queue.c (78 lines of code) (raw):
//
// Created by ZhangCheng on 29/12/2017.
//
#include "log_queue.h"
#include "log_multi_thread.h"
struct _log_queue{
void ** data;
int64_t head;
int64_t tail;
int32_t size;
CRITICALSECTION mutex;
COND notempty;
};
log_queue * log_queue_create(int32_t size)
{
void * buffer = malloc(sizeof(void *) * size + sizeof(log_queue));
memset(buffer, 0, sizeof(void *) * size + sizeof(log_queue));
log_queue * queue = (log_queue *)buffer;
queue->data = (void **)((char*)buffer + sizeof(log_queue));
queue->size = size;
queue->mutex = CreateCriticalSection();
queue->notempty = CreateCond();
return queue;
}
void log_queue_destroy(log_queue * queue)
{
ReleaseCriticalSection(queue->mutex);
DeleteCond(queue->notempty);
free(queue);
}
int32_t log_queue_size(log_queue * queue)
{
CS_ENTER(queue->mutex);
int32_t len = queue->tail - queue->head;
CS_LEAVE(queue->mutex);
return len;
}
int32_t log_queue_isfull(log_queue * queue)
{
CS_ENTER(queue->mutex);
int32_t rst = (int32_t)((queue->tail - queue->head) == queue->size);
CS_LEAVE(queue->mutex);
return rst;
}
int32_t log_queue_push(log_queue * queue, void * data)
{
CS_ENTER(queue->mutex);
if (queue->tail - queue->head == queue->size)
{
CS_LEAVE(queue->mutex);
return -1;
}
queue->data[queue->tail++ % queue->size] = data;
CS_LEAVE(queue->mutex);
COND_SIGNAL(queue->notempty);
return 0;
}
void * log_queue_pop(log_queue * queue, int32_t waitMs) {
CS_ENTER(queue->mutex);
if (queue->tail == queue->head) {
COND_WAIT_TIME(queue->notempty, queue->mutex, waitMs);
}
void * result = NULL;
if (queue->tail > queue->head)
{
result = queue->data[queue->head++ % queue->size];
}
CS_LEAVE(queue->mutex);
return result;
}
void * log_queue_trypop(log_queue * queue)
{
CS_ENTER(queue->mutex);
void * result = NULL;
if (queue->tail > queue->head)
{
result = queue->data[queue->head++ % queue->size];
}
CS_LEAVE(queue->mutex);
return result;
}