summaryrefslogtreecommitdiffstats
path: root/lib/mqueue.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/mqueue.c')
-rw-r--r--lib/mqueue.c93
1 files changed, 65 insertions, 28 deletions
diff --git a/lib/mqueue.c b/lib/mqueue.c
index a6dca32f..8b557dfe 100644
--- a/lib/mqueue.c
+++ b/lib/mqueue.c
@@ -129,9 +129,67 @@
*/
/*==============================================================================
- * Initialisation etc. for Message Queues.
+ * Message Block allocation statics
+ *
+ * Once a message block is allocated it is not deallocated, but kept ready
+ * for future use.
+ *
+ * Keeps a count of free message blocks. (Could at some later date reduce the
+ * number of free message blocks if it is known that some burst of messages has
+ * now passed.)
+ */
+
+static pthread_mutex_t mqb_mutex ; /* for allocation of mqueue blocks */
+
+static mqueue_block mqb_free_list = NULL ;
+static unsigned mqb_free_count = 0 ;
+
+/*==============================================================================
+ * Initialise and shut down Message Queue and Message Block handling
+ */
+
+/*------------------------------------------------------------------------------
+ * Initialise Message Queue handling.
+ *
+ * Must be called before any qpt_threads are started.
+ *
+ * Freezes qpthreads_enabled.
+ */
+extern void
+mqueue_initialise(void)
+{
+ if (qpthreads_enabled_freeze)
+ qpt_mutex_init_new(&mqb_mutex, qpt_mutex_quagga) ;
+} ;
+
+/*------------------------------------------------------------------------------
+ * Shut down Message Queue handling.
+ *
+ * Release all resources used.
+ *
+ * NB: all pthreads must have stopped -- mutex must be free and no further
+ * uses may be made.
+ */
+extern void
+mqueue_finish(void)
+{
+ mqueue_block mqb ;
+
+ while ((mqb = mqb_free_list) != NULL)
+ {
+ assert(mqb_free_count != 0) ;
+ mqb_free_list = mqb->next ;
+ XFREE(MTYPE_MQUEUE_BLOCK, mqb) ;
+ } ;
+
+ assert(mqb_free_count == 0) ;
+
+ qpt_mutex_destroy_keep(&mqb_mutex) ;
+} ;
+
+/*==============================================================================
+ * Initialisation etc. for Message Queue
*
- * TODO: how to shut down a message queue... for reset/exit ?
*/
/*------------------------------------------------------------------------------
@@ -328,11 +386,6 @@ mqueue_set_timeout_interval(mqueue_queue mq, qtime_t interval)
* mqueue_initialise MUST be called before the first message block is allocated.
*/
-static pthread_mutex_t mqb_mutex ;
-
-static mqueue_block mqb_free_list = NULL ;
-static unsigned mqb_free_count = 0 ;
-
inline static size_t mqb_argv_size(mqb_index_t alloc)
{
return alloc * sizeof(mqb_arg_t) ;
@@ -476,7 +529,7 @@ static void mqueue_dequeue_signal(mqueue_queue mq, mqueue_thread_signal mtsig) ;
* NB: this works perfectly well if !qpthreads enabled. Of course, there can
* never be any waiters... so no kicking is ever done.
*/
-void
+extern void
mqueue_enqueue(mqueue_queue mq, mqueue_block mqb, int priority)
{
qpt_mutex_lock(&mq->mutex) ;
@@ -582,7 +635,7 @@ mqueue_enqueue(mqueue_queue mq, mqueue_block mqb, int priority)
*
* Returns a message block if one is available. (And not otherwise.)
*/
-mqueue_block
+extern mqueue_block
mqueue_dequeue(mqueue_queue mq, int wait, void* arg)
{
mqueue_block mqb ;
@@ -750,7 +803,7 @@ mqueue_revoke(mqueue_queue mq, void* arg0)
*
* (Signal will never be kicked if !qpthreads_enabled.)
*/
-int
+extern int
mqueue_done_waiting(mqueue_queue mq, mqueue_thread_signal mtsig)
{
int kicked ;
@@ -834,7 +887,7 @@ mqueue_local_dequeue(mqueue_local_queue lmq)
*
* Returns address of the structure.
*/
-mqueue_thread_signal
+extern mqueue_thread_signal
mqueue_thread_signal_init(mqueue_thread_signal mqt, qpt_thread_t thread,
int signum)
{
@@ -860,7 +913,7 @@ mqueue_thread_signal_init(mqueue_thread_signal mqt, qpt_thread_t thread,
* Frees the structure if required, and returns NULL.
* Otherwise zeroises the structure, and returns address of same.
*/
-mqueue_thread_signal
+extern mqueue_thread_signal
mqueue_thread_signal_reset(mqueue_thread_signal mqt, int free_structure)
{
passert(mqt->prev == NULL) ;
@@ -1248,19 +1301,3 @@ mqb_argv_extend(mqueue_block mqb, mqb_index_t iv)
mqb->argv_alloc = need ;
} ;
-
-/*==============================================================================
- * Initialise Message Queue handling
- *
- * Must be called before any qpt_threads are started.
- *
- * Freezes qpthreads_enabled.
- *
- * TODO: how do we shut down message queue handling ?
- */
-void
-mqueue_initialise(void)
-{
- if (qpthreads_enabled_freeze)
- qpt_mutex_init_new(&mqb_mutex, qpt_mutex_quagga) ;
-} ;