Add _init_new operation for shared_ptr

This commit is contained in:
Patrick Pelissier committed 2017-03-15 00:17:41 +01:00
1 parent 27d41f9330
commit de7d0bd682
2 files changed
+31 -4

No files matched your search

+26 -3
View File
@@ -43,7 +43,7 @@
USAGE: SHARED_PTR_DEF(name[, oplist]) */ USAGE: SHARED_PTR_DEF(name[, oplist]) */
#define SHARED_PTR_DEF(name, ...) \ #define SHARED_PTR_DEF(name, ...) \
M_IF_NARGS_EQ1(__VA_ARGS__) \ 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__ )) SHAREDI_PTR_DEF2(name, __VA_ARGS__ ))
/********************************** INTERNAL ************************************/ /********************************** INTERNAL ************************************/
@@ -102,6 +102,29 @@
SHAREDI_CONTRACT(shared); \ 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 \ static inline bool \
M_C3(shared_, name, _NULL_p)(const M_C3(shared_, name, _t) shared) \ M_C3(shared_, name, _NULL_p)(const M_C3(shared_, name, _t) shared) \
{ \ { \
@@ -127,8 +150,8 @@
SHAREDI_CONTRACT(dest); \ SHAREDI_CONTRACT(dest); \
if (*dest != NULL) { \ if (*dest != NULL) { \
if (atomic_fetch_sub(&((*dest)->cpt), 1) == 1) { \ if (atomic_fetch_sub(&((*dest)->cpt), 1) == 1) { \
M_GET_CLEAR oplist (*(*dest)->data); \ M_GET_CLEAR oplist (*(*dest)->data); \
M_GET_DEL oplist ((*dest)->data); \ M_GET_DEL oplist ((*dest)->data); \
M_MEMORY_FREE (*dest); \ M_MEMORY_FREE (*dest); \
} \ } \
*dest = NULL; \ *dest = NULL; \
+5 -1
View File
@@ -6,7 +6,7 @@ SHARED_PTR_DEF(int, int)
#include <gmp.h> #include <gmp.h>
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) static int f(const shared_int_t p)
{ {
@@ -55,5 +55,9 @@ int main(void)
assert(shared_int_NULL_p(p1)); assert(shared_int_NULL_p(p1));
shared_int_clear(p1); shared_int_clear(p1);
shared_int_init_new(p1);
assert(!shared_int_NULL_p(p1));
shared_int_clear(p1);
exit(0); exit(0);
} }