Port m-shared-ptr to new memory model

(use global pool)
This commit is contained in:
Patrick Pelissier committed 2025-05-07 21:02:24 +02:00
1 parent 5d1ebdf5bb
commit 689527c2dc
4 files changed
+40 -5

No files matched your search

+5
View File
@@ -145,6 +145,11 @@ M_VARIANT_DEF2(variant2, (num, int), (name, string_t, M_STRING_POOL_OPLIST) )
M_WORKER_SPAWN_DEF2(worker_int, (in, int) )
M_WORKER_SPAWN_DEF2(worker_str, (str, string_t, M_STRING_POOL_OPLIST) )
#include "m-shared-ptr.h"
M_SHARED_PTR_DEF(shared_int, int)
M_SHARED_PTR_DEF(shared_str, string_t, M_STRING_POOL_OPLIST)
int main(void)
{
return 0;
+1 -1
View File
@@ -446,7 +446,7 @@ M_BEGIN_PROTECTED_CODE
# define M_R_EXPAND_void m_pool
# define M_R(...) (m_pool, __VA_ARGS__)
# define M_ASSERT_POOL() (void) m_pool
# define M_GLOBAL_POOL() M_USE_POOL m_pool = { 0 }
# define M_GLOBAL_POOL() M_USE_POOL m_pool = { 0 }; (void) m_pool
#endif
// M_P: Expand to a prototype of a function that may trigger exception / accept memory context
+33 -3
View File
@@ -613,6 +613,7 @@ extern shared_t *function_name(M_EMPLACE_LIST_TYPE_VAR_ALTER(a, exp_emplace_type
M_IF_METHOD(INIT, oplist)( \
fattr shared_t *M_F(name, _new)(void) \
{ \
M_GLOBAL_POOL(); \
shared_t *out = M_CALL_NEW(oplist, shared_t); \
if (M_UNLIKELY_NOMEM( out == NULL)) { \
M_MEMORY_FULL(shared_t, 1); \
@@ -628,6 +629,7 @@ M_IF_METHOD(INIT_SET, oplist)( \
fattr shared_t *M_F(name, _clone)(const shared_t *src) \
{ \
M_ASSERT(src != NULL); \
M_GLOBAL_POOL(); \
shared_t *out = M_CALL_NEW(oplist, shared_t); \
if (M_UNLIKELY_NOMEM( out == NULL)) { \
M_MEMORY_FULL(shared_t, 1); \
@@ -644,6 +646,7 @@ M_IF_METHOD(INIT_SET, oplist)( \
fattr shared_t *M_F(name, _new_from)(type const src); ) \
fattr shared_t *M_F(name, _new_from)(type const src) \
{ \
M_GLOBAL_POOL(); \
shared_t *out = M_CALL_NEW(oplist, shared_t); \
if (M_UNLIKELY_NOMEM( out == NULL)) { \
M_MEMORY_FULL(shared_t, 1); \
@@ -660,6 +663,7 @@ M_IF_METHOD(SET, oplist)( \
{ \
M_ASSERT(out != NULL); \
M_ASSERT(src != NULL); \
M_GLOBAL_POOL(); \
if (M_UNLIKELY (out == src)) return; \
M_F(name, _write_read_lock)(out, src); \
M_ON_EXCEPTION( M_F(name, _write_read_unlock)(out, src) ) \
@@ -678,6 +682,7 @@ fattr shared_t *M_F(name, _acquire)(shared_t *out) \
\
fattr void M_F(name, _release)(shared_t *out) \
{ \
M_GLOBAL_POOL(); \
if (out != NULL && M_C3(m_shar3d_, name, _dec_owner)(out)) { \
M_CALL_CLEAR(oplist, out->data); \
M_F(name, _clear_lock)(out); \
@@ -701,6 +706,7 @@ M_EMPLACE_QUEUE_DEF( (name, fattr), shared_t, M_F(name, _make), oplist, M_SHAR3D
#define M_SHAR3D_PTR_DEF_BASIC_MAKE(name_attr, shared_t, function_name, oplist, init_func, exp_emplace_type) \
M_PAIR_2 name_attr shared_t *function_name(M_EMPLACE_LIST_TYPE_VAR_ALTER(a, exp_emplace_type)) \
{ \
M_GLOBAL_POOL(); \
shared_t *out = M_CALL_NEW(oplist, shared_t); \
if (M_UNLIKELY_NOMEM( out == NULL)) { \
M_MEMORY_FULL(shared_t, 1); \
@@ -747,6 +753,7 @@ M_IF_METHOD(RESET, oplist)( \
fattr void M_F(name, _reset)(shared_t *out) \
{ \
M_ASSERT(out != NULL); \
M_GLOBAL_POOL(); \
M_F(name, _write_lock)(out); \
/* RESET cannot throw exception */ \
M_CALL_RESET(oplist, out->data); \
@@ -859,6 +866,7 @@ M_IF_METHOD(ADD, oplist)( \
fattr void M_F(name, _add)(shared_t *out, const shared_t *src1, const shared_t *src2) \
{ \
M_ASSERT(out != NULL && src1 != NULL && src2 != NULL); \
M_GLOBAL_POOL(); \
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); \
@@ -870,6 +878,7 @@ M_IF_METHOD(SUB, oplist)( \
fattr void M_F(name, _sub)(shared_t *out, const shared_t *src1, const shared_t *src2) \
{ \
M_ASSERT(out != NULL && src1 != NULL && src2 != NULL); \
M_GLOBAL_POOL(); \
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); \
@@ -881,6 +890,7 @@ M_IF_METHOD(MUL, oplist)( \
fattr void M_F(name, _mul)(shared_t *out, const shared_t *src1, const shared_t *src2) \
{ \
M_ASSERT(out != NULL && src1 != NULL && src2 != NULL); \
M_GLOBAL_POOL(); \
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); \
@@ -892,6 +902,7 @@ M_IF_METHOD(DIV, oplist)( \
fattr void M_F(name, _div)(shared_t *out, const shared_t *src1, const shared_t *src2) \
{ \
M_ASSERT(out != NULL && src1 != NULL && src2 != NULL); \
M_GLOBAL_POOL(); \
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); \
@@ -903,6 +914,7 @@ M_IF_METHOD(SPLICE, oplist)( \
fattr void M_F(name, _splice)(shared_t *out, shared_t *src) \
{ \
M_ASSERT(out != NULL && src != NULL); \
M_GLOBAL_POOL(); \
if (out < src) { \
M_F(name, _write_lock)(out); \
M_F(name, _write_lock)(src); \
@@ -932,6 +944,7 @@ M_IF_METHOD(GET_KEY, oplist)( \
{ \
M_ASSERT (out != NULL); \
M_ASSERT (value != NULL); \
M_GLOBAL_POOL(); \
M_F(name, _read_lock)(out); \
/* No exception */ \
value_type *p = M_CALL_GET_KEY(oplist, out->data, key); \
@@ -948,6 +961,7 @@ M_IF_METHOD(SAFE_GET_KEY, oplist)( \
{ \
M_ASSERT (out != NULL); \
M_ASSERT (value != NULL); \
M_GLOBAL_POOL(); \
M_F(name, _write_lock)(out); \
M_ON_EXCEPTION( M_F(name, _write_unlock)(out) ) { \
value_type *p = M_CALL_SAFE_GET_KEY(oplist, out->data, key); \
@@ -963,6 +977,7 @@ M_IF_METHOD(SET_KEY, oplist)( \
fattr void M_F(name, _set_at)(shared_t *out, key_type const key, value_type const value) \
{ \
M_ASSERT (out != NULL); \
M_GLOBAL_POOL(); \
M_F(name, _write_lock)(out); \
M_ON_EXCEPTION( M_F(name, _write_unlock)(out) ) \
M_CALL_SET_KEY(oplist, out->data, key, value); \
@@ -975,6 +990,7 @@ M_IF_METHOD(ERASE_KEY, oplist)( \
fattr bool M_F(name, _erase)(shared_t *out, key_type const key) \
{ \
M_ASSERT (out != NULL); \
M_GLOBAL_POOL(); \
M_F(name, _write_lock)(out); \
/* No exception */ \
bool r = M_CALL_ERASE_KEY(oplist, out->data, key); \
@@ -1005,6 +1021,7 @@ M_IF_METHOD(PUSH, oplist)( \
fattr void M_F(name, _push)(shared_t *out, sub_type const value) \
{ \
M_ASSERT(out != NULL); \
M_GLOBAL_POOL(); \
M_F(name, _write_lock)(out); \
while (true) { \
if (M_CALL_FULL_P(oplist, out->data) == false) { \
@@ -1021,6 +1038,7 @@ M_IF_METHOD(PUSH, oplist)( \
fattr bool M_F(name, _try_push)(shared_t *out, sub_type const value) \
{ \
M_ASSERT(out != NULL); \
M_GLOBAL_POOL(); \
bool ret = false; \
M_F(name, _write_lock)(out); \
if (M_CALL_FULL_P(oplist, out->data) == false) { \
@@ -1037,6 +1055,7 @@ M_IF_METHOD(PUSH_MOVE, oplist)( \
fattr void M_F(name, _push_move)(shared_t *out, sub_type *value) \
{ \
M_ASSERT(out != NULL); \
M_GLOBAL_POOL(); \
M_F(name, _write_lock)(out); \
while (true) { \
if (M_CALL_FULL_P(oplist, out->data) == false) { \
@@ -1053,6 +1072,7 @@ M_IF_METHOD(PUSH_MOVE, oplist)( \
fattr bool M_F(name, _try_push_move)(shared_t *out, sub_type *value) \
{ \
M_ASSERT(out != NULL); \
M_GLOBAL_POOL(); \
bool ret = false; \
M_F(name, _write_lock)(out); \
if (M_CALL_FULL_P(oplist, out->data) == false) { \
@@ -1074,6 +1094,7 @@ M_IF_METHOD(PUSH_MOVE, oplist)( \
fattr void function_name(shared_t *out M_EMPLACE_LIST_TYPE_VAR(a, exp_emplace_type)) \
{ \
M_ASSERT(out != NULL); \
M_GLOBAL_POOL(); \
M_F(name, _write_lock)(out); \
while (true) { \
if (M_CALL_FULL_P(oplist, out->data) == false) { \
@@ -1096,6 +1117,7 @@ fattr void function_name(shared_t *out M_EMPLACE_LIST_TYPE_VAR(a, exp_emplace_ty
fattr bool function_name(shared_t *out M_EMPLACE_LIST_TYPE_VAR(a, exp_emplace_type)) \
{ \
M_ASSERT(out != NULL); \
M_GLOBAL_POOL(); \
bool ret = false; \
M_F(name, _write_lock)(out); \
if (M_CALL_FULL_P(oplist, out->data) == false) { \
@@ -1124,6 +1146,7 @@ M_IF_METHOD(POP, oplist)( \
fattr void M_F(name, _pop)(sub_type *value, shared_t *out) \
{ \
M_ASSERT(out != NULL); \
M_GLOBAL_POOL(); \
M_F(name, _write_lock)(out); \
while (true) { \
if (M_CALL_EMPTY_P(oplist, out->data) == false) { \
@@ -1140,6 +1163,7 @@ M_IF_METHOD(POP, oplist)( \
fattr bool M_F(name, _try_pop)(sub_type *value, shared_t *out) \
{ \
M_ASSERT(out != NULL); \
M_GLOBAL_POOL(); \
bool ret = false; \
M_F(name, _write_lock)(out); \
if (M_CALL_EMPTY_P(oplist, out->data) == false) { \
@@ -1156,6 +1180,7 @@ M_IF_METHOD(POP_MOVE, oplist)( \
fattr void M_F(name, _pop_move)(sub_type *value, shared_t *out) \
{ \
M_ASSERT(out != NULL); \
M_GLOBAL_POOL(); \
M_F(name, _write_lock)(out); \
while (true) { \
if (M_CALL_EMPTY_P(oplist, out->data) == false) { \
@@ -1172,6 +1197,7 @@ M_IF_METHOD(POP_MOVE, oplist)( \
fattr bool M_F(name, _try_pop_move)(sub_type *value, shared_t *out) \
{ \
M_ASSERT(out != NULL); \
M_GLOBAL_POOL(); \
bool ret = false; \
M_F(name, _write_lock)(out); \
if (M_CALL_EMPTY_P(oplist, out->data) == false) { \
@@ -1300,6 +1326,7 @@ M_IF_METHOD(IN_STR, oplist)( \
fattr bool M_F(name, _in_str)(shared_t *out, FILE *file) \
{ \
M_ASSERT (out != NULL && file != NULL); \
M_GLOBAL_POOL(); \
M_F(name, _write_lock)(out); \
m_volatile bool r = false; \
M_ON_EXCEPTION( M_F(name, _write_unlock)(out) ) \
@@ -1314,9 +1341,10 @@ M_IF_METHOD(GET_STR, oplist)( \
fattr void M_F(name, _get_str)(m_string_t str, const shared_t *out, bool append) \
{ \
M_ASSERT (out != NULL); \
M_GLOBAL_POOL(); \
M_F(name, _read_lock)(out); \
/* No exception */ \
M_CALL_GET_STR(oplist, str, out->data, append); \
M_ON_EXCEPTION( M_F(name, _read_unlock)(out) ) \
M_CALL_GET_STR(oplist, str, out->data, append); \
M_F(name, _read_unlock)(out); \
} \
, ) \
@@ -1324,6 +1352,7 @@ M_IF_METHOD(PARSE_STR, oplist)( \
fattr bool M_F(name, _parse_str)(shared_t *out, const char str[], const char **endp) \
{ \
M_ASSERT (out != NULL); \
M_GLOBAL_POOL(); \
M_F(name, _write_lock)(out); \
m_volatile bool r = false; \
M_ON_EXCEPTION( M_F(name, _write_unlock)(out) ) \
@@ -1339,7 +1368,7 @@ M_IF_METHOD(OUT_SERIAL, oplist)( \
{ \
M_ASSERT (out != NULL); \
M_F(name, _read_lock)(out); \
/* No exception */ \
/* FIXME: No exception. Really? */ \
m_serial_return_code_t r = M_CALL_OUT_SERIAL(oplist, serial, out->data); \
M_F(name, _read_unlock)(out); \
return r; \
@@ -1349,6 +1378,7 @@ M_IF_METHOD(IN_SERIAL, oplist)( \
fattr m_serial_return_code_t M_F(name, _in_serial)(shared_t *out, m_serial_read_t serial) \
{ \
M_ASSERT (out != NULL); \
M_GLOBAL_POOL(); \
M_F(name, _write_lock)(out); \
m_volatile m_serial_return_code_t r = M_SERIAL_FAIL; \
M_ON_EXCEPTION( M_F(name, _write_unlock)(out) ) \
+1 -1
View File
@@ -2188,7 +2188,7 @@ namespace m_lib {
,IT_END_P(m_string_end_p) \
,IT_EQUAL_P(m_string_it_equal_p) \
,IT_NEXT(m_string_next) \
,IT_CREF(m_string_cref), PUSH(m_string_push_u) \
,IT_CREF(m_string_cref), PUSH(API_0P(m_string_push_u)) \
,EMPLACE_TYPE(const char*) \
)