summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorruki <[email protected]>2025-05-07 00:49:24 +0800
committerruki <[email protected]>2025-08-28 11:35:53 +0800
commitf20b216bd906d1a5c6235f5c9520f4d69cddb2af (patch)
tree15844a811cefd9317386d5d1ea0d376be090a405
parentf2984b3ba5cc2b9c52891ffb44600be3dec23b52 (diff)
impl engine pool
-rw-r--r--core/src/xmake/engine_pool.c36
-rw-r--r--core/src/xmake/engine_pool.h19
2 files changed, 46 insertions, 9 deletions
diff --git a/core/src/xmake/engine_pool.c b/core/src/xmake/engine_pool.c
index 0a2102ee1..bd2502829 100644
--- a/core/src/xmake/engine_pool.c
+++ b/core/src/xmake/engine_pool.c
@@ -33,16 +33,38 @@
#include "engine_pool.h"
/* //////////////////////////////////////////////////////////////////////////////////////
- * types
+ * macros
*/
-
-// the engine pool type
-typedef struct __xm_engine_pool_t
-{
-
-}xm_engine_pool_t;
+#define XM_ENGINE_POOL_MAXN (128)
/* //////////////////////////////////////////////////////////////////////////////////////
* implementation
*/
+xm_engine_pool_ref_t xm_engine_pool_init()
+{
+ return tb_single_list_init(0, tb_element_ptr(tb_null, tb_null));
+}
+
+tb_void_t xm_engine_pool_exit(xm_engine_pool_ref_t engine_pool)
+{
+ tb_single_list_exit(engine_pool);
+}
+
+xm_engine_ref_t xm_engine_pool_alloc(xm_engine_pool_ref_t engine_pool)
+{
+ xm_engine_ref_t engine = tb_null;
+ if (tb_single_list_size(engine_pool) > 0)
+ {
+ engine = (xm_engine_ref_t)tb_single_list_head(engine_pool);
+ tb_single_list_remove_head(engine_pool);
+ }
+ return engine;
+}
+
+tb_void_t xm_engine_pool_free(xm_engine_pool_ref_t engine_pool, xm_engine_ref_t engine)
+{
+ if (tb_single_list_size(engine_pool) < XM_ENGINE_POOL_MAXN)
+ tb_single_list_insert_tail(engine_pool, engine);
+ else xm_engine_exit(engine);
+}
diff --git a/core/src/xmake/engine_pool.h b/core/src/xmake/engine_pool.h
index cc8cf8faf..47744f99a 100644
--- a/core/src/xmake/engine_pool.h
+++ b/core/src/xmake/engine_pool.h
@@ -36,7 +36,7 @@ __tb_extern_c_enter__
*/
/// the xmake engine pool type
-typedef struct {tb_int_t dummy;} const* xm_engine_pool_ref_t;
+typedef tb_single_list_ref_t xm_engine_pool_ref_t;
/* //////////////////////////////////////////////////////////////////////////////////////
* interfaces
@@ -46,7 +46,7 @@ typedef struct {tb_int_t dummy;} const* xm_engine_pool_ref_t;
*
* @return the engine pool
*/
-xm_engine_pool_ref_t xm_engine_pool_init(tb_noargs_t);
+xm_engine_pool_ref_t xm_engine_pool_init(tb_void_t);
/*! exit the engine_pool
*
@@ -54,6 +54,21 @@ xm_engine_pool_ref_t xm_engine_pool_init(tb_noargs_t);
*/
tb_void_t xm_engine_pool_exit(xm_engine_pool_ref_t engine_pool);
+/*! alloc a engine from the engine_pool
+ *
+ * @param engine_pool the engine_pool
+ *
+ * @return the engine
+ */
+xm_engine_ref_t xm_engine_pool_alloc(xm_engine_pool_ref_t engine_pool);
+
+/*! free a engine to the engine_pool
+ *
+ * @param engine_pool the engine_pool
+ * @param engine the engine
+ */
+tb_void_t xm_engine_pool_free(xm_engine_pool_ref_t engine_pool, xm_engine_ref_t engine);
+
/* //////////////////////////////////////////////////////////////////////////////////////
* extern
*/