Add _init_new operation for shared_ptr
This commit is contained in:
1 parent
27d41f9330
commit
de7d0bd682
2 files changed
+31
-4
No files matched your search
+26
-3
@@ -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; \
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
Reference in new issue
Block a user