Add relaxed shared pointer (thread unsafe with non-atomic counter).
This commit is contained in:
1 parent
f5857c8aab
commit
a9aa1e13ee
2 files changed
+19
No files matched your search
+18
@@ -42,6 +42,13 @@
|
|||||||
((name, __VA_ARGS__, M_GLOBAL_OPLIST_OR_DEF(__VA_ARGS__), SHAREDI_ATOMIC_OPLIST ), \
|
((name, __VA_ARGS__, M_GLOBAL_OPLIST_OR_DEF(__VA_ARGS__), SHAREDI_ATOMIC_OPLIST ), \
|
||||||
(name, __VA_ARGS__ , SHAREDI_ATOMIC_OPLIST)))
|
(name, __VA_ARGS__ , SHAREDI_ATOMIC_OPLIST)))
|
||||||
|
|
||||||
|
/* Define relaxed shared pointer and its function (thread unsafe).
|
||||||
|
USAGE: SHARED_PTR_RELAXED_DEF(name[, oplist]) */
|
||||||
|
#define SHARED_PTR_RELAXED_DEF(name, ...) \
|
||||||
|
SHAREDI_PTR_DEF(M_IF_NARGS_EQ1(__VA_ARGS__) \
|
||||||
|
((name, __VA_ARGS__, M_GLOBAL_OPLIST_OR_DEF(__VA_ARGS__), SHAREDI_INTEGER_OPLIST ), \
|
||||||
|
(name, __VA_ARGS__ , SHAREDI_INTEGER_OPLIST)))
|
||||||
|
|
||||||
/********************************** INTERNAL ************************************/
|
/********************************** INTERNAL ************************************/
|
||||||
|
|
||||||
// deferred
|
// deferred
|
||||||
@@ -71,6 +78,17 @@
|
|||||||
SUB(atomic_fetch_sub), \
|
SUB(atomic_fetch_sub), \
|
||||||
IT_CREF(atomic_load))
|
IT_CREF(atomic_load))
|
||||||
|
|
||||||
|
// OPLIST to handle a counter of non-atomic type with its helper functions.
|
||||||
|
#define SHAREDI_INTEGER_OPLIST (TYPE(int), \
|
||||||
|
INIT_SET(sharedi_integer_init_set), \
|
||||||
|
ADD(sharedi_integer_add), \
|
||||||
|
SUB(sharedi_integer_sub), \
|
||||||
|
IT_CREF(sharedi_integer_cref))
|
||||||
|
static inline void sharedi_integer_init_set(int *p, int val) { *p = val; }
|
||||||
|
static inline int sharedi_integer_add(int *p, int val) { int r = *p; *p += val; return r; }
|
||||||
|
static inline int sharedi_integer_sub(int *p, int val) { int r = *p; *p -= val; return r; }
|
||||||
|
static inline int sharedi_integer_cref(int *p) { return *p; }
|
||||||
|
|
||||||
#define SHAREDI_PTR_DEF2(name, type, oplist, cpt_oplist) \
|
#define SHAREDI_PTR_DEF2(name, type, oplist, cpt_oplist) \
|
||||||
\
|
\
|
||||||
typedef struct M_C(name, _s){ \
|
typedef struct M_C(name, _s){ \
|
||||||
|
|||||||
@@ -30,6 +30,7 @@ START_COVERAGE
|
|||||||
SHARED_PTR_DEF(shared_int, int)
|
SHARED_PTR_DEF(shared_int, int)
|
||||||
END_COVERAGE
|
END_COVERAGE
|
||||||
SHARED_PTR_DEF(shared_mpz, mpz_t, M_CLASSIC_OPLIST(mpz))
|
SHARED_PTR_DEF(shared_mpz, mpz_t, M_CLASSIC_OPLIST(mpz))
|
||||||
|
SHARED_PTR_RELAXED_DEF(shared_relaxed_int, int)
|
||||||
|
|
||||||
static int f(const shared_int_t p)
|
static int f(const shared_int_t p)
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in new issue
Block a user