summaryrefslogtreecommitdiffstats
path: root/lib/mqueue.h
diff options
context:
space:
mode:
Diffstat (limited to 'lib/mqueue.h')
-rw-r--r--lib/mqueue.h132
1 files changed, 65 insertions, 67 deletions
diff --git a/lib/mqueue.h b/lib/mqueue.h
index 5d00b726..32ac599e 100644
--- a/lib/mqueue.h
+++ b/lib/mqueue.h
@@ -36,15 +36,25 @@
*
* * action -- function to call when message is dispatched
*
- * * argv -- arguments: each may be pointer or signed/unsigned integer
+ * * arg0 -- always a pointer -- used in specific revoke
*
- * argv[0] (aka arg0) always exists, and is always a pointer
- * argv[1] (aka arg1) always exists
+ * * args -- embedded structure -- to be overlaid by user structure
*
- * May have any number of arguments.
+ * * argv -- pointer to: list/array of pointer/integer/unsigned
*
- * May treat all arguments from some specified point onwards
- * as a "list" which may be pushed onto and iterated along.
+ * NB: the elements of argv are all exactly the same size and alignment.
+ *
+ * So, as well as using the access functions, it is possible to use the
+ * argv array directly, as any of:
+ *
+ * mqb_arg_t* argv = mqb_get_argv(mqb) ;
+ *
+ * void** argv = mqb_get_argv(mqb) ;
+ * char** argv = mqb_get_argv(mqb) ;
+ *
+ * mqb_ptr_t* argv = mqb_get_argv(mqb) ;
+ * mqb_int_t* argv = mqb_get_argv(mqb) ;
+ * mqb_uint_t* argv = mqb_get_argv(mqb) ;
*/
typedef struct mqueue_block* mqueue_block ;
@@ -62,6 +72,12 @@ typedef union
mqb_uint_t u ;
} mqb_arg_t ;
+/* argv is an array of mqb_arg_t, which is the same as an array of.... */
+CONFIRM(sizeof(mqb_arg_t) == sizeof(void*)) ; /* ... pointers */
+CONFIRM(sizeof(mqb_arg_t) == sizeof(mqb_ptr_t)) ; /* ... mqb_ptr_t */
+CONFIRM(sizeof(mqb_arg_t) == sizeof(mqb_int_t)) ; /* ... mqb_int_t */
+CONFIRM(sizeof(mqb_arg_t) == sizeof(mqb_uint_t)) ; /* ... mqb_uint_t */
+ /* ... or any combination */
enum mqb_flag
{
mqb_destroy = 0,
@@ -72,29 +88,37 @@ typedef enum mqb_flag mqb_flag_t ;
typedef void mqueue_action(mqueue_block mqb, mqb_flag_t flag) ;
-enum {
- mqb_argv_static_len = 6 /* max args without extension */
+enum { mqb_args_size_max = 64 } ; /* maximum size of struct args */
+enum { mqb_argv_size_unit = 16 } ; /* allocate argv in these units */
+
+struct args
+{
+ char data[mqb_args_size_max] ; /* empty space */
} ;
struct mqueue_block
{
+ struct args args ; /* user structure */
+
mqueue_block next ; /* single linked list */
mqueue_action* action ; /* for message dispatch */
- mqb_arg_t argv[mqb_argv_static_len] ;
-
- mqb_index_t arg_count ; /* >= 2 (includes any "list") */
- mqb_index_t arg_list_base ; /* start of "list" 0 => none */
- mqb_index_t arg_list_next ; /* iterator */
+ void* arg0 ;
+ mqb_arg_t* argv ; /* argv, if any */
- mqb_index_t arg_have ; /* *total* arguments allocated */
- /* >= mqb_argv_static_len */
-
- mqb_arg_t* argv_extension ; /* extension argv, if any */
+ mqb_index_t argv_count ; /* count of elements in argv */
+ mqb_index_t argv_alloc ; /* count of elements allocated */
+ mqb_index_t argv_next ; /* iterator */
} ;
+/* mqueue_block structures are malloced. That guarantees maximum alignment. */
+/* To guarantee maximum alignment for "struct args", it must be first item ! */
+typedef struct mqueue_block mqueue_block_t ;
+CONFIRM(offsetof(mqueue_block_t, args) == 0) ;
+
/*==============================================================================
+ * The Message Queue itself
*/
typedef struct mqueue_thread_signal* mqueue_thread_signal ;
@@ -170,9 +194,6 @@ mqueue_init_new(mqueue_queue mq, enum mqueue_queue_type type) ;
extern mqueue_local_queue
mqueue_local_init_new(mqueue_local_queue lmq) ;
-extern mqueue_block
-mqb_re_init(mqueue_block mqb, mqueue_action action, void* arg0) ;
-
extern mqueue_local_queue
mqueue_local_reset(mqueue_local_queue lmq, int free_structure) ;
@@ -188,6 +209,9 @@ mqueue_thread_signal_init(mqueue_thread_signal mqt, qpt_thread_t thread,
extern mqueue_block
mqb_init_new(mqueue_block mqb, mqueue_action action, void* arg0) ;
+extern mqueue_block
+mqb_re_init(mqueue_block mqb, mqueue_action action, void* arg0) ;
+
extern void
mqb_free(mqueue_block mqb) ;
@@ -215,39 +239,31 @@ mqueue_local_dequeue(mqueue_local_queue lmq) ;
Inline void mqb_set_action(mqueue_block mqb, mqueue_action action) ;
Inline void mqb_set_arg0(mqueue_block mqb, void* p) ;
-Inline void mqb_set_arg1_p(mqueue_block mqb, mqb_ptr_t p) ;
-Inline void mqb_set_arg1_i(mqueue_block mqb, mqb_int_t i) ;
-Inline void mqb_set_arg1_u(mqueue_block mqb, mqb_uint_t u) ;
+
+extern void mqb_set_argv_size(mqueue_block mqb, unsigned n) ;
extern void mqb_set_argv_p(mqueue_block mqb, mqb_index_t iv, mqb_ptr_t p) ;
extern void mqb_set_argv_i(mqueue_block mqb, mqb_index_t iv, mqb_int_t i) ;
extern void mqb_set_argv_u(mqueue_block mqb, mqb_index_t iv, mqb_uint_t u) ;
-extern void mqb_set_argv_list(mqueue_block mqb, mqb_index_t iv) ;
-
extern void mqb_push_argv_p(mqueue_block mqb, mqb_ptr_t p) ;
extern void mqb_push_argv_i(mqueue_block mqb, mqb_int_t i) ;
extern void mqb_push_argv_u(mqueue_block mqb, mqb_uint_t u) ;
extern void mqb_push_argv_array(mqueue_block mqb, unsigned n, void** array) ;
-
Inline void mqb_dispatch(mqueue_block mqb, mqb_flag_t flag) ;
-Inline mqb_index_t mqb_get_arg_count(mqueue_block mqb) ;
+Inline void* mqb_get_arg0(mqueue_block mqb) ;
+Inline void* mqb_get_args(mqueue_block mqb) ;
+Inline void* mqb_get_argv(mqueue_block mqb) ;
-Inline void* mqb_get_arg0(mqueue_block mqb) ;
-Inline mqb_ptr_t mqb_get_arg1_p(mqueue_block mqb) ;
-Inline mqb_int_t mqb_get_arg1_i(mqueue_block mqb) ;
-Inline mqb_uint_t mqb_get_arg1_u(mqueue_block mqb) ;
+Inline mqb_index_t mqb_get_argv_count(mqueue_block mqb) ;
extern mqb_ptr_t mqb_get_argv_p(mqueue_block mqb, mqb_index_t iv) ;
extern mqb_int_t mqb_get_argv_i(mqueue_block mqb, mqb_index_t iv) ;
extern mqb_uint_t mqb_get_argv_u(mqueue_block mqb, mqb_index_t iv) ;
-extern mqb_index_t mqb_get_argv_list_base(mqueue_block mqb) ;
-extern mqb_index_t mqb_get_argv_list_count(mqueue_block mqb) ;
-
extern mqb_ptr_t mqb_next_argv_p(mqueue_block mqb) ;
extern mqb_int_t mqb_next_argv_i(mqueue_block mqb) ;
extern mqb_uint_t mqb_next_argv_u(mqueue_block mqb) ;
@@ -269,25 +285,7 @@ mqb_set_action(mqueue_block mqb, mqueue_action action)
Inline void
mqb_set_arg0(mqueue_block mqb, void* arg0)
{
- mqb->argv[0].p = arg0 ;
-} ;
-
-Inline void
-mqb_set_arg1_p(mqueue_block mqb, mqb_ptr_t p)
-{
- mqb->argv[1].p = p ;
-} ;
-
-Inline void
-mqb_set_arg1_i(mqueue_block mqb, mqb_int_t i)
-{
- mqb->argv[1].i = i ;
-} ;
-
-Inline void
-mqb_set_arg1_u(mqueue_block mqb, mqb_uint_t u)
-{
- mqb->argv[1].u = u ;
+ mqb->arg0 = arg0 ;
} ;
/* Get operations */
@@ -310,34 +308,34 @@ mqb_dispatch_destroy(mqueue_block mqb)
mqb->action(mqb, mqb_destroy) ;
} ;
-Inline mqb_index_t
-mqb_get_arg_count(mqueue_block mqb)
+Inline void*
+mqb_get_arg0(mqueue_block mqb)
{
- return mqb->arg_count ; /* count includes any "list" portion */
+ return mqb->arg0 ;
} ;
Inline void*
-mqb_get_arg0(mqueue_block mqb)
+mqb_get_args(mqueue_block mqb)
{
- return mqb->argv[0].p ;
+ return &mqb->args ;
} ;
-Inline mqb_ptr_t
-mqb_get_arg1_p(mqueue_block mqb)
+Inline void*
+mqb_get_argv(mqueue_block mqb)
{
- return mqb->argv[1].p ;
+ return mqb->argv ;
} ;
-Inline mqb_int_t
-mqb_get_arg1_i(mqueue_block mqb)
+Inline mqb_index_t
+mqb_get_argv_count(mqueue_block mqb)
{
- return mqb->argv[1].i ;
+ return mqb->argv_count ;
} ;
-Inline mqb_uint_t
-mqb_get_arg1_u(mqueue_block mqb)
+Inline void
+mqb_reset_argv_next(mqueue_block mqb)
{
- return mqb->argv[1].u ;
+ mqb->argv_next = 0 ;
} ;
#endif /* _ZEBRA_MQUEUE_H */