add function common_blocked_queue_push_ex

pull/37/head
YuQing 2020-03-26 19:04:41 +08:00
parent d3b0c5dfb0
commit 2df796589c
2 changed files with 25 additions and 11 deletions

View File

@ -50,11 +50,11 @@ void common_blocked_queue_destroy(struct common_blocked_queue *queue)
pthread_mutex_destroy(&(queue->lock)); pthread_mutex_destroy(&(queue->lock));
} }
int common_blocked_queue_push(struct common_blocked_queue *queue, void *data) int common_blocked_queue_push_ex(struct common_blocked_queue *queue,
void *data, bool *notify)
{ {
int result; int result;
struct common_blocked_node *node; struct common_blocked_node *node;
bool notify;
if ((result=pthread_mutex_lock(&(queue->lock))) != 0) if ((result=pthread_mutex_lock(&(queue->lock))) != 0)
{ {
@ -75,16 +75,15 @@ int common_blocked_queue_push(struct common_blocked_queue *queue, void *data)
node->data = data; node->data = data;
node->next = NULL; node->next = NULL;
if (queue->tail == NULL) if (queue->tail == NULL)
{ {
queue->head = node; queue->head = node;
notify = true; *notify = true;
} }
else else
{ {
queue->tail->next = node; queue->tail->next = node;
notify = false; *notify = false;
} }
queue->tail = node; queue->tail = node;
@ -96,11 +95,6 @@ int common_blocked_queue_push(struct common_blocked_queue *queue, void *data)
__LINE__, result, STRERROR(result)); __LINE__, result, STRERROR(result));
} }
if (notify)
{
pthread_cond_signal(&(queue->cond));
}
return 0; return 0;
} }

View File

@ -61,7 +61,27 @@ static inline void common_blocked_queue_terminate_all(
} }
} }
int common_blocked_queue_push(struct common_blocked_queue *queue, void *data); //notify by the caller
int common_blocked_queue_push_ex(struct common_blocked_queue *queue,
void *data, bool *notify);
static inline int common_blocked_queue_push(struct common_blocked_queue
*queue, void *data)
{
bool notify;
int result;
if ((result=common_blocked_queue_push_ex(queue, data, &notify)) == 0)
{
if (notify)
{
pthread_cond_signal(&(queue->cond));
}
}
return result;
}
void common_blocked_queue_return_nodes(struct common_blocked_queue *queue, void common_blocked_queue_return_nodes(struct common_blocked_queue *queue,
struct common_blocked_node *node); struct common_blocked_node *node);