From de7d0bd682a08a6c1c3f0afec7f39919d5995630 Mon Sep 17 00:00:00 2001 From: Patrick Pelissier Date: Wed, 15 Mar 2017 00:17:41 +0100 Subject: [PATCH] Add _init_new operation for shared_ptr --- m-shared.h | 29 ++++++++++++++++++++++++++--- tests/test-mshared.c | 6 +++++- 2 files changed, 31 insertions(+), 4 deletions(-) diff --git a/m-shared.h b/m-shared.h index 2f95fa35..1cd52ef4 100644 --- a/m-shared.h +++ b/m-shared.h @@ -43,7 +43,7 @@ USAGE: SHARED_PTR_DEF(name[, oplist]) */ #define SHARED_PTR_DEF(name, ...) \ M_IF_NARGS_EQ1(__VA_ARGS__) \ - (SHAREDI_PTR_DEF2(name, __VA_ARGS__, M_DEFAULT_OPLIST ), \ + (SHAREDI_PTR_DEF2(name, __VA_ARGS__, M_DEFAULT_OPLIST ), \ SHAREDI_PTR_DEF2(name, __VA_ARGS__ )) /********************************** INTERNAL ************************************/ @@ -102,6 +102,29 @@ SHAREDI_CONTRACT(shared); \ } \ \ + static inline void \ + M_C3(shared_, name, _init_new)(M_C3(shared_, name, _t) shared) \ + { \ + struct M_C3(shared_, name, _s) *ptr; \ + ptr = M_MEMORY_ALLOC (struct M_C3(shared_, name, _s)); \ + if (ptr == NULL) { \ + M_MEMORY_FULL(sizeof(struct M_C3(shared_, name, _s))); \ + return; \ + } \ + type *data; \ + data = M_GET_NEW oplist (sizeof (type) ); \ + if (data == NULL) { \ + M_MEMORY_FREE(ptr); \ + M_MEMORY_FULL(sizeof(type)); \ + return; \ + } \ + M_GET_INIT oplist(*data); \ + ptr->cpt = 1; \ + ptr->data = data; \ + *shared = ptr; \ + SHAREDI_CONTRACT(shared); \ + } \ + \ static inline bool \ M_C3(shared_, name, _NULL_p)(const M_C3(shared_, name, _t) shared) \ { \ @@ -127,8 +150,8 @@ SHAREDI_CONTRACT(dest); \ if (*dest != NULL) { \ if (atomic_fetch_sub(&((*dest)->cpt), 1) == 1) { \ - M_GET_CLEAR oplist (*(*dest)->data); \ - M_GET_DEL oplist ((*dest)->data); \ + M_GET_CLEAR oplist (*(*dest)->data); \ + M_GET_DEL oplist ((*dest)->data); \ M_MEMORY_FREE (*dest); \ } \ *dest = NULL; \ diff --git a/tests/test-mshared.c b/tests/test-mshared.c index 4e3caa08..1baba43e 100644 --- a/tests/test-mshared.c +++ b/tests/test-mshared.c @@ -6,7 +6,7 @@ SHARED_PTR_DEF(int, int) #include -SHARED_PTR_DEF(mpz, mpz_t, (CLEAR(mpz_clear))) +SHARED_PTR_DEF(mpz, mpz_t, M_CLASSIC_OPLIST(mpz)) static int f(const shared_int_t p) { @@ -55,5 +55,9 @@ int main(void) assert(shared_int_NULL_p(p1)); shared_int_clear(p1); + shared_int_init_new(p1); + assert(!shared_int_NULL_p(p1)); + shared_int_clear(p1); + exit(0); }