diff options
| author | ruki <[email protected]> | 2025-05-07 00:50:53 +0800 |
|---|---|---|
| committer | ruki <[email protected]> | 2025-08-28 11:35:53 +0800 |
| commit | 1d59427fe0aae9dce1833e5ccee73c583931da7c (patch) | |
| tree | 7704a1f09e2cd2d51362cae028fdec7384ef59f6 | |
| parent | f20b216bd906d1a5c6235f5c9520f4d69cddb2af (diff) | |
add engine pool singleton
| -rw-r--r-- | core/src/xmake/engine_pool.c | 36 | ||||
| -rw-r--r-- | core/src/xmake/engine_pool.h | 3 |
2 files changed, 38 insertions, 1 deletions
diff --git a/core/src/xmake/engine_pool.c b/core/src/xmake/engine_pool.c index bd2502829..659b2f99b 100644 --- a/core/src/xmake/engine_pool.c +++ b/core/src/xmake/engine_pool.c @@ -35,11 +35,37 @@ /* ////////////////////////////////////////////////////////////////////////////////////// * macros */ + +// the max engine pool count #define XM_ENGINE_POOL_MAXN (128) +// the singleton type of engine pool +#define XM_ENGINE_POOL (TB_SINGLETON_TYPE_USER + 4) + +/* ////////////////////////////////////////////////////////////////////////////////////// + * private implementation + */ +static tb_handle_t xm_engine_pool_instance_init(tb_cpointer_t* ppriv) +{ + xm_engine_pool_ref_t engine_pool = xm_engine_pool_init(); + tb_assert_and_check_return_val(engine_pool, tb_null); + + return (tb_handle_t)engine_pool; +} + +static tb_void_t xm_engine_pool_instance_exit(tb_handle_t engine_pool, tb_cpointer_t priv) +{ + if (engine_pool) xm_engine_pool_exit((xm_engine_pool_ref_t)engine_pool); +} + /* ////////////////////////////////////////////////////////////////////////////////////// * implementation */ +xm_engine_pool_ref_t xm_engine_pool() +{ + return (xm_engine_pool_ref_t)tb_singleton_instance(XM_ENGINE_POOL, xm_engine_pool_instance_init, xm_engine_pool_instance_exit, tb_null, tb_null); +} + xm_engine_pool_ref_t xm_engine_pool_init() { return tb_single_list_init(0, tb_element_ptr(tb_null, tb_null)); @@ -47,7 +73,15 @@ xm_engine_pool_ref_t xm_engine_pool_init() tb_void_t xm_engine_pool_exit(xm_engine_pool_ref_t engine_pool) { - tb_single_list_exit(engine_pool); + if (engine_pool) + { + tb_for_all (xm_engine_ref_t, engine, engine_pool) + { + if (engine) + xm_engine_exit(engine); + } + tb_single_list_exit(engine_pool); + } } xm_engine_ref_t xm_engine_pool_alloc(xm_engine_pool_ref_t engine_pool) diff --git a/core/src/xmake/engine_pool.h b/core/src/xmake/engine_pool.h index 47744f99a..b141345cc 100644 --- a/core/src/xmake/engine_pool.h +++ b/core/src/xmake/engine_pool.h @@ -42,6 +42,9 @@ typedef tb_single_list_ref_t xm_engine_pool_ref_t; * interfaces */ +// get the engine pool singleton +xm_engine_pool_ref_t xm_engine_pool(tb_void_t); + /*! init the engine_pool * * @return the engine pool |
