summaryrefslogtreecommitdiffstats
path: root/lib/mqueue.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/mqueue.c')
-rw-r--r--lib/mqueue.c16
1 files changed, 16 insertions, 0 deletions
diff --git a/lib/mqueue.c b/lib/mqueue.c
index 8b557dfe..90e1616c 100644
--- a/lib/mqueue.c
+++ b/lib/mqueue.c
@@ -178,6 +178,7 @@ mqueue_finish(void)
while ((mqb = mqb_free_list) != NULL)
{
assert(mqb_free_count != 0) ;
+ mqb_free_count-- ;
mqb_free_list = mqb->next ;
XFREE(MTYPE_MQUEUE_BLOCK, mqb) ;
} ;
@@ -526,12 +527,17 @@ static void mqueue_dequeue_signal(mqueue_queue mq, mqueue_thread_signal mtsig) ;
* for a signal type message queue, each message that arrives will kick one
* waiter.
*
+ * If mq is NULL, the message is not queued but is immediately destroyed.
+ *
* NB: this works perfectly well if !qpthreads enabled. Of course, there can
* never be any waiters... so no kicking is ever done.
*/
extern void
mqueue_enqueue(mqueue_queue mq, mqueue_block mqb, int priority)
{
+ if (mq == NULL)
+ return mqb_dispatch_destroy(mqb) ;
+
qpt_mutex_lock(&mq->mutex) ;
if (mq->head == NULL)
@@ -634,6 +640,8 @@ mqueue_enqueue(mqueue_queue mq, mqueue_block mqb, int priority)
* NB: the argument is ignored if !wait or !qpthreads_enabled, so may be NULL.
*
* Returns a message block if one is available. (And not otherwise.)
+ *
+ * NB: if mq is NULL, returns NULL -- nothing available
*/
extern mqueue_block
mqueue_dequeue(mqueue_queue mq, int wait, void* arg)
@@ -644,6 +652,9 @@ mqueue_dequeue(mqueue_queue mq, int wait, void* arg)
mqueue_thread_signal mtsig ;
qtime_mono_t timeout_time ;
+ if (mq == NULL)
+ return NULL ;
+
qpt_mutex_lock(&mq->mutex) ; /*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
while (1)
@@ -748,6 +759,8 @@ done:
* operations may be performed. Enqueued items may promptly be revoked, except
* for priority items if the revoke operation has already moved past the last
* priority item.
+ *
+ * If mq is NULL, does nothing.
*/
extern void
mqueue_revoke(mqueue_queue mq, void* arg0)
@@ -755,6 +768,9 @@ mqueue_revoke(mqueue_queue mq, void* arg0)
mqueue_block mqb ;
mqueue_block prev ;
+ if (mq == NULL)
+ return ;
+
qpt_mutex_lock(&mq->mutex) ; /*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
prev = NULL ;