From afff412f7a1e46c172e3afa8c7d108d3da39f907 Mon Sep 17 00:00:00 2001 From: Patrick Pelissier Date: Thu, 2 Mar 2023 00:39:08 +0100 Subject: [PATCH] Maintenance: continue splitting huge macros into smaller ones. --- m-rbtree.h | 33 ++++++++++++++++++++------------- m-shared.h | 39 ++++++++++++++++++++++++++++----------- m-snapshot.h | 34 +++++++++++++++++++++++++++------- 3 files changed, 75 insertions(+), 31 deletions(-) diff --git a/m-rbtree.h b/m-rbtree.h index 21125e17..f8dab415 100644 --- a/m-rbtree.h +++ b/m-rbtree.h @@ -114,6 +114,7 @@ ,M_IF_METHOD(DEL, oplist)(DEL(M_GET_DEL oplist),) \ ) + /* Max depth of the binary tree It is at worst twice the depth of a perfectly even tree with maximum elements. The maximum number of elements is the max of size_t. @@ -175,6 +176,15 @@ typedef enum { - node_t: alias for the node of an element of the container */ #define M_RBTR33_DEF_P3(name, type, oplist, tree_t, node_t, it_t) \ + M_RBTR33_DEF_TYPE(name, type, oplist, tree_t, node_t, it_t) \ + M_RBTR33_DEF_MEMPOOL(name, type, oplist, tree_t, node_t, it_t) \ + M_CHECK_COMPATIBLE_OPLIST(name, 1, type, oplist) \ + M_RBTR33_DEF_CORE(name, type, oplist, tree_t, node_t, it_t) \ + M_RBTR33_DEF_IO(name, type, oplist, tree_t, node_t, it_t) \ + M_EMPLACE_QUEUE_DEF(name, tree_t, M_C(name, _emplace), oplist, M_EMPLACE_QUEUE_GENE) + +/* Define the types associated to a R/B Tree */ +#define M_RBTR33_DEF_TYPE(name, type, oplist, tree_t, node_t, it_t) \ \ /* Node of Red/Black tree. \ Each node has up to two child, a color (Red or black) \ @@ -205,7 +215,9 @@ typedef enum { typedef type M_C(name, _subtype_ct); \ typedef tree_t M_C(name, _ct); \ typedef it_t M_C(name, _it_ct); \ - \ + +/* Define the mempool encapsulation */ +#define M_RBTR33_DEF_MEMPOOL(name, type, oplist, tree_t, node_t, it_t) \ /* Link with fast memory allocator if requested */ \ M_IF_METHOD(MEMPOOL, oplist)( \ /* Definition of the memory pool of this kind of node */ \ @@ -222,23 +234,17 @@ typedef enum { } \ \ , /* No mempool allocation */ \ - /* Callic allocator function (common case) */ \ + /* Classic Allocator function (common case) */ \ static inline node_t *M_C3(m_rbtr33_,name,_new)(void) { \ return M_CALL_NEW(oplist, node_t); \ } \ - /* Callic deallocator function (common case) */ \ + /* Classic deallocator function (common case) */ \ static inline void M_C3(m_rbtr33_,name,_del)(node_t *ptr) { \ M_CALL_DEL(oplist, ptr); \ } ) \ - \ - /* Check if the given oplist is compatible with the given type */ \ - M_CHECK_COMPATIBLE_OPLIST(name, 1, type, oplist) \ - \ - /* Generate all functions */ \ - M_RBTR33_DEF_P4(name, type, oplist, tree_t, node_t, it_t) - -#define M_RBTR33_DEF_P4(name, type, oplist, tree_t, node_t, it_t) \ +/* Define the core functions */ +#define M_RBTR33_DEF_CORE(name, type, oplist, tree_t, node_t, it_t) \ \ static inline void \ M_C(name, _init)(tree_t tree) \ @@ -1013,7 +1019,9 @@ typedef enum { return M_HASH_FINAL (hash); \ } \ , /* NO HASH METHOD */ ) \ - \ + +/* Define the I/O functions */ +#define M_RBTR33_DEF_IO(name, type, oplist, tree_t, node_t, it_t) \ M_IF_METHOD(GET_STR, oplist)( \ static inline void M_C(name, _get_str)(m_string_t str, \ tree_t const t1, bool append) { \ @@ -1165,7 +1173,6 @@ typedef enum { } \ , /* no in_serial */ ) \ \ - M_EMPLACE_QUEUE_DEF(name, tree_t, M_C(name, _emplace), oplist, M_EMPLACE_QUEUE_GENE) // TODO: specialized _sort shall do nothing, but shall check the requested order. How ? diff --git a/m-shared.h b/m-shared.h index ec3e083b..a882ed15 100644 --- a/m-shared.h +++ b/m-shared.h @@ -31,14 +31,6 @@ M_BEGIN_PROTECTED_CODE -/* Define the oplist of a shared pointer. - USAGE: SHARED_OPLIST(name [, oplist_of_the_type]) */ -#define M_SHARED_PTR_OPLIST(...) \ - M_SHAR3D_PTR_OPLIST_P1(M_IF_NARGS_EQ1(__VA_ARGS__) \ - ((__VA_ARGS__, M_BASIC_OPLIST ), \ - (__VA_ARGS__ ))) - - /* Define shared pointer and its function. USAGE: SHARED_PTR_DEF(name, type, [, oplist]) */ #define M_SHARED_PTR_DEF(name, ...) \ @@ -56,6 +48,14 @@ M_BEGIN_PROTECTED_CODE M_END_PROTECTED_CODE +/* Define the oplist of a shared pointer. + USAGE: SHARED_OPLIST(name [, oplist_of_the_type]) */ +#define M_SHARED_PTR_OPLIST(...) \ + M_SHAR3D_PTR_OPLIST_P1(M_IF_NARGS_EQ1(__VA_ARGS__) \ + ((__VA_ARGS__, M_BASIC_OPLIST ), \ + (__VA_ARGS__ ))) + + /* Define relaxed shared pointer and its function (thread unsafe). USAGE: SHARED_PTR_RELAXED_DEF(name, type, [, oplist]) */ #define M_SHARED_PTR_RELAXED_DEF(name, ...) \ @@ -142,6 +142,8 @@ static inline int m_shar3d_integer_add(int *p, int val) { int r = *p; *p += val static inline int m_shar3d_integer_sub(int *p, int val) { int r = *p; *p -= val; return r; } static inline int m_shar3d_integer_cref(int *p) { return *p; } +/*****************************************************************************/ + /* Contract of a shared pointer */ #define M_SHAR3D_CONTRACT(shared, cpt_oplist) do { \ M_ASSERT(shared != NULL); \ @@ -161,6 +163,12 @@ static inline int m_shar3d_integer_cref(int *p) { return *p; } /* Code generation */ #define M_SHAR3D_PTR_DEF_P3(name, type, oplist, cpt_oplist, shared_t) \ + M_SHAR3D_PTR_DEF_TYPE(name, type, oplist, cpt_oplist, shared_t) \ + M_CHECK_COMPATIBLE_OPLIST(name, 1, type, oplist) \ + M_SHAR3D_PTR_DEF_CORE(name, type, oplist, cpt_oplist, shared_t) \ + +/* Define the types */ +#define M_SHAR3D_PTR_DEF_TYPE(name, type, oplist, cpt_oplist, shared_t) \ \ typedef struct M_C(name, _s){ \ type *data; /* Pointer to the data */ \ @@ -177,8 +185,9 @@ static inline int m_shar3d_integer_cref(int *p) { return *p; } type data; \ struct M_C(name, _s) ptr; \ } M_C(name, combine_ct)[1]; \ - \ - M_CHECK_COMPATIBLE_OPLIST(name, 1, type, oplist) \ + +/* Define the core functions */ +#define M_SHAR3D_PTR_DEF_CORE(name, type, oplist, cpt_oplist, shared_t) \ \ static inline void \ M_C(name, _init)(shared_t shared) \ @@ -373,6 +382,12 @@ static inline int m_shar3d_integer_cref(int *p) { return *p; } M_STATIC_FAILURE(M_LIB_NOT_AN_OPLIST, "(SHARED_RESOURCE_DEF): the given argument is not a valid oplist: " #oplist) #define M_SHAR3D_RESOURCE_DEF_P3(name, type, oplist, shared_t, it_t) \ + M_SHAR3D_RESOURCE_DEF_TYPE(name, type, oplist, shared_t, it_t) \ + M_CHECK_COMPATIBLE_OPLIST(name, 1, type, oplist) \ + M_SHAR3D_RESOURCE_DEF_CORE(name, type, oplist, shared_t, it_t) \ + +/* Define the types */ +#define M_SHAR3D_RESOURCE_DEF_TYPE(name, type, oplist, shared_t, it_t) \ \ /* Create an aligned type to avoid false sharing between threads */ \ typedef struct M_C(name, _atype_s) { \ @@ -393,7 +408,9 @@ static inline int m_shar3d_integer_cref(int *p) { return *p; } \ /* Internal Types for oplist */ \ typedef shared_t M_C(name, _ct); \ - \ + +/* Define the core functions */ +#define M_SHAR3D_RESOURCE_DEF_CORE(name, type, oplist, shared_t, it_t) \ static inline void \ M_C(name, _init)(shared_t s, size_t n) \ { \ diff --git a/m-snapshot.h b/m-snapshot.h index 9ae628c6..bc553035 100644 --- a/m-snapshot.h +++ b/m-snapshot.h @@ -168,6 +168,12 @@ M_BEGIN_PROTECTED_CODE /* Expand the type and the functions of a SPSC snapshot */ #define M_SNAPSH0T_SPSC_DEF_P3(name, type, oplist, snapshot_t) \ + M_SNAPSH0T_SPSC_DEF_TYPE(name, type, oplist, snapshot_t) \ + M_CHECK_COMPATIBLE_OPLIST(name, 1, type, oplist) \ + M_SNAPSH0T_SPSC_DEF_CORE(name, type, oplist, snapshot_t) \ + +/* Define the type */ +#define M_SNAPSH0T_SPSC_DEF_TYPE(name, type, oplist, snapshot_t) \ \ /* Create an aligned type to avoid false sharing between threads */ \ typedef struct M_C(name, _aligned_type_s) { \ @@ -185,8 +191,9 @@ M_BEGIN_PROTECTED_CODE /* Define internal types for oplist */ \ typedef snapshot_t M_C(name, _ct); \ typedef type M_C(name, _subtype_ct); \ - \ - M_CHECK_COMPATIBLE_OPLIST(name, 1, type, oplist) \ + +/* Define the core functions */ +#define M_SNAPSH0T_SPSC_DEF_CORE(name, type, oplist, snapshot_t) \ \ static inline void \ M_C(name, _init)(snapshot_t snap) \ @@ -603,6 +610,12 @@ m_snapsh0t_mrsw_read_end(m_snapsh0t_mrsw_ct s, unsigned int idx) /* Expand the type and the functions of a SPMC snapshot */ #define M_SNAPSH0T_SPMC_DEF_P3(name, type, oplist, snapshot_t) \ + M_SNAPSH0T_SPMC_DEF_TYPE(name, type, oplist, snapshot_t) \ + M_CHECK_COMPATIBLE_OPLIST(name, 1, type, oplist) \ + M_SNAPSH0T_SPMC_DEF_CORE(name, type, oplist, snapshot_t) \ + +/* Define the type */ +#define M_SNAPSH0T_SPMC_DEF_TYPE(name, type, oplist, snapshot_t) \ \ /* Create an aligned type to avoid false sharing between threads */ \ typedef struct M_C(name, _aligned_type_s) { \ @@ -618,8 +631,9 @@ m_snapsh0t_mrsw_read_end(m_snapsh0t_mrsw_ct s, unsigned int idx) /* Define internal types for oplist */ \ typedef snapshot_t M_C(name, _ct); \ typedef type M_C(name, _subtype_ct); \ - \ - M_CHECK_COMPATIBLE_OPLIST(name, 1, type, oplist) \ + +/* Define the core functions */ +#define M_SNAPSH0T_SPMC_DEF_CORE(name, type, oplist, snapshot_t) \ \ static inline void \ M_C(name, _init)(snapshot_t snap, size_t nReader) \ @@ -712,8 +726,13 @@ m_snapsh0t_mrsw_read_end(m_snapsh0t_mrsw_ct s, unsigned int idx) /* Expand the type and the functions of a MPMC snapshot */ #define M_SNAPSH0T_MPMC_DEF_P3(name, type, oplist, snapshot_t) \ - \ M_SNAPSH0T_SPMC_DEF_P1((M_C(name, _mrsw), type, oplist, M_C(name, _mrsw_pct))) \ + M_SNAPSH0T_MPMC_DEF_TYPE(name, type, oplist, snapshot_t) \ + M_CHECK_COMPATIBLE_OPLIST(name, 1, type, oplist) \ + M_SNAPSH0T_MPMC_DEF_CORE(name, type, oplist, snapshot_t) \ + +/* Define the types */ +#define M_SNAPSH0T_MPMC_DEF_TYPE(name, type, oplist, snapshot_t) \ \ typedef struct M_C(name, _s) { \ M_C(name, _mrsw_pct) core; \ @@ -722,8 +741,9 @@ m_snapsh0t_mrsw_read_end(m_snapsh0t_mrsw_ct s, unsigned int idx) /* Define internal types for oplist */ \ typedef snapshot_t M_C(name, _ct); \ typedef type M_C(name, _subtype_ct); \ - \ - M_CHECK_COMPATIBLE_OPLIST(name, 1, type, oplist) \ + +/* Define the core functions */ +#define M_SNAPSH0T_MPMC_DEF_CORE(name, type, oplist, snapshot_t) \ \ static inline void \ M_C(name, _init)(snapshot_t snap, size_t nReader, size_t nWriter) \