Fix ADD/SUB/MUL/DIV methods of a shared pointer

This commit is contained in:
Patrick Pelissier committed 2024-11-11 22:38:02 +01:00
1 parent 4e851142c2
commit 3f09adc507
1 file changed
+74 -28
+74 -28
View File
@@ -354,6 +354,19 @@ static inline void M_F(name, _write_read_unlock)(shared_t *out, const shared_t
(void) out; \
(void) src; \
} \
static inline void M_F(name, _write_read2_lock)(shared_t *out, const shared_t *src1, const shared_t *src2) \
{ \
(void) out; \
(void) src1; \
(void) src2; \
} \
\
static inline void M_F(name, _write_read2_unlock)(shared_t *out, const shared_t *src1, const shared_t *src2) \
{ \
(void) out; \
(void) src1; \
(void) src2; \
} \
/* Definition of the type with thread safety. */
@@ -521,6 +534,39 @@ static inline void M_F(name, _write_read_unlock)(shared_t *out, const shared_t *
M_F(name, _read_unlock)(src); \
M_F(name, _write_unlock)(out); \
} \
\
static inline void M_F(name, _write_read2_lock)(shared_t *out, const shared_t *src1, const shared_t *src2) \
{ \
/* See above */ \
if (src1 > src2) { \
M_SWAP(const shared_t *, src1, src2); \
} \
/* src1 < src2 */ \
if (out < src1) { \
/* out < src1 < src2 */ \
M_F(name, _write_lock)(out); \
M_F(name, _read_lock)(src1); \
M_F(name, _read_lock)(src2); \
} else if (out < src2) { \
/* src1 < out < src2 */ \
M_F(name, _read_lock)(src1); \
M_F(name, _write_lock)(out); \
M_F(name, _read_lock)(src2); \
} else { \
/* src1 < src2 < out */ \
M_F(name, _read_lock)(src1); \
M_F(name, _read_lock)(src2); \
M_F(name, _write_lock)(out); \
} \
} \
\
static inline void M_F(name, _write_read2_unlock)(shared_t *out, const shared_t *src1, const shared_t *src2) \
{ \
/* NOTE: No need to order the unlock */ \
M_F(name, _read_unlock)(src1); \
M_F(name, _read_unlock)(src2); \
M_F(name, _write_unlock)(out); \
} \
/* Define the basic function of a shared pointer */
@@ -765,54 +811,54 @@ M_IF_METHOD(HASH, oplist)( \
/* Define the arithmetic operators */
#define M_SHAR3D_PTR_DECL_ARITH(name, shared_t, oplist) \
M_IF_METHOD(ADD, oplist)( extern void M_F(name, _add)(shared_t *, const shared_t *); , ) \
M_IF_METHOD(SUB, oplist)( extern void M_F(name, _sub)(shared_t *, const shared_t *); , ) \
M_IF_METHOD(MUL, oplist)( extern void M_F(name, _mul)(shared_t *, const shared_t *); , ) \
M_IF_METHOD(DIV, oplist)( extern void M_F(name, _div)(shared_t *, const shared_t *); , ) \
M_IF_METHOD(ADD, oplist)( extern void M_F(name, _add)(shared_t *, const shared_t *, const shared_t *); , ) \
M_IF_METHOD(SUB, oplist)( extern void M_F(name, _sub)(shared_t *, const shared_t *, const shared_t *); , ) \
M_IF_METHOD(MUL, oplist)( extern void M_F(name, _mul)(shared_t *, const shared_t *, const shared_t *); , ) \
M_IF_METHOD(DIV, oplist)( extern void M_F(name, _div)(shared_t *, const shared_t *, const shared_t *); , ) \
M_IF_METHOD(SPLICE, oplist)( extern void M_F(name, _splice)(shared_t *, shared_t *); , ) \
#define M_SHAR3D_PTR_DEF_ARITH(name, shared_t, type, oplist, fattr) \
M_IF_METHOD(ADD, oplist)( \
fattr void M_F(name, _add)(shared_t *out, const shared_t *src) \
fattr void M_F(name, _add)(shared_t *out, const shared_t *src1, const shared_t *src2) \
{ \
M_ASSERT(out != NULL && src != NULL); \
M_F(name, _write_read_lock)(out, src); \
M_ON_EXCEPTION( M_F(name, _write_read_unlock)(out, src) ) \
M_CALL_ADD(oplist, out->data, src->data); \
M_F(name, _write_read_unlock)(out, src); \
M_ASSERT(out != NULL && src1 != NULL && src2 != NULL); \
M_F(name, _write_read2_lock)(out, src1, src2); \
M_ON_EXCEPTION( M_F(name, _write_read2_unlock)(out, src1, src2) ) \
M_CALL_ADD(oplist, out->data, src1->data, src2->data); \
M_F(name, _write_read2_unlock)(out, src1, src2); \
} \
, ) \
\
M_IF_METHOD(SUB, oplist)( \
fattr void M_F(name, _sub)(shared_t *out, const shared_t *src) \
fattr void M_F(name, _sub)(shared_t *out, const shared_t *src1, const shared_t *src2) \
{ \
M_ASSERT(out != NULL && src != NULL); \
M_F(name, _write_read_lock)(out, src); \
M_ON_EXCEPTION( M_F(name, _write_read_unlock)(out, src) ) \
M_CALL_SUB(oplist, out->data, src->data); \
M_F(name, _write_read_unlock)(out, src); \
M_ASSERT(out != NULL && src1 != NULL && src2 != NULL); \
M_F(name, _write_read2_lock)(out, src1, src2); \
M_ON_EXCEPTION( M_F(name, _write_read2_unlock)(out, src1, src2) ) \
M_CALL_SUB(oplist, out->data, src1->data, src2->data); \
M_F(name, _write_read2_unlock)(out, src1, src2); \
} \
, ) \
\
M_IF_METHOD(MUL, oplist)( \
fattr void M_F(name, _mul)(shared_t *out, const shared_t *src) \
fattr void M_F(name, _mul)(shared_t *out, const shared_t *src1, const shared_t *src2) \
{ \
M_ASSERT(out != NULL && src != NULL); \
M_F(name, _write_read_lock)(out, src); \
M_ON_EXCEPTION( M_F(name, _write_read_unlock)(out, src) ) \
M_CALL_MUL(oplist, out->data, src->data); \
M_F(name, _write_read_unlock)(out, src); \
M_ASSERT(out != NULL && src1 != NULL && src2 != NULL); \
M_F(name, _write_read2_lock)(out, src1, src2); \
M_ON_EXCEPTION( M_F(name, _write_read2_unlock)(out, src1, src2) ) \
M_CALL_MUL(oplist, out->data, src1->data, src2->data); \
M_F(name, _write_read2_unlock)(out, src1, src2); \
} \
, ) \
\
M_IF_METHOD(DIV, oplist)( \
fattr void M_F(name, _div)(shared_t *out, const shared_t *src) \
fattr void M_F(name, _div)(shared_t *out, const shared_t *src1, const shared_t *src2) \
{ \
M_ASSERT(out != NULL && src != NULL); \
M_F(name, _write_read_lock)(out, src); \
M_ON_EXCEPTION( M_F(name, _write_read_unlock)(out, src) ) \
M_CALL_DIV(oplist, out->data, src->data); \
M_F(name, _write_read_unlock)(out, src); \
M_ASSERT(out != NULL && src1 != NULL && src2 != NULL); \
M_F(name, _write_read2_lock)(out, src1, src2); \
M_ON_EXCEPTION( M_F(name, _write_read2_unlock)(out, src1, src2) ) \
M_CALL_DIV(oplist, out->data, src1->data, src2->data); \
M_F(name, _write_read2_unlock)(out, src1, src2); \
} \
, ) \
\