summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorruki <[email protected]>2025-05-07 00:50:53 +0800
committerruki <[email protected]>2025-08-28 11:35:53 +0800
commit1d59427fe0aae9dce1833e5ccee73c583931da7c (patch)
tree7704a1f09e2cd2d51362cae028fdec7384ef59f6
parentf20b216bd906d1a5c6235f5c9520f4d69cddb2af (diff)
add engine pool singleton
-rw-r--r--core/src/xmake/engine_pool.c36
-rw-r--r--core/src/xmake/engine_pool.h3
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