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]) */
#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; \
+5 -1
View File
@@ -6,7 +6,7 @@ SHARED_PTR_DEF(int, int)
#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)
{
@@ -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);
}