diff --git a/example/ex11-use-pool.c b/example/ex11-use-pool.c index 4b2b34b6..81a93c27 100644 --- a/example/ex11-use-pool.c +++ b/example/ex11-use-pool.c @@ -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; diff --git a/m-core.h b/m-core.h index 5fdecb70..105c4355 100644 --- a/m-core.h +++ b/m-core.h @@ -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 diff --git a/m-shared-ptr.h b/m-shared-ptr.h index a68f0f64..064e1e23 100644 --- a/m-shared-ptr.h +++ b/m-shared-ptr.h @@ -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) ) \ diff --git a/m-string.h b/m-string.h index b4d12237..10e24a15 100644 --- a/m-string.h +++ b/m-string.h @@ -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*) \ )