diff options
author | Chris Hall <GMCH@hestia.halldom.com> | 2010-04-06 02:10:30 +0100 |
---|---|---|
committer | Chris Hall <GMCH@hestia.halldom.com> | 2010-04-06 02:10:30 +0100 |
commit | 8fea5ca7104c0d95108947661a4991b61b2ee06e (patch) | |
tree | 7ad44a658a61d4a8dfb43ca5b6122c5626f68ea0 /lib/mqueue.c | |
parent | c933cf7233f51f677ab01689f175ceb3dc5361f6 (diff) | |
download | quagga-8fea5ca7104c0d95108947661a4991b61b2ee06e.tar.bz2 quagga-8fea5ca7104c0d95108947661a4991b61b2ee06e.tar.xz |
First beta release
Various bug fixes and improvements.
Running with a fair amount of debug/assert code, which must be
removed at some date.
Diffstat (limited to 'lib/mqueue.c')
-rw-r--r-- | lib/mqueue.c | 16 |
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 ; |