summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorruki <[email protected]>2025-04-17 22:46:06 +0800
committerruki <[email protected]>2025-08-28 11:35:53 +0800
commit6eccd1efa540d634e35eb29cf923025e0667aa0c (patch)
treecd33e9f7ff6e0ab31698ce01e53f7eb79ebf1cce
parentcd6a9a33613a0a8449c026dd4e4bd77934e29e90 (diff)
improve thread context
-rw-r--r--core/src/xmake/engine.c9
-rw-r--r--core/src/xmake/engine.h8
-rw-r--r--core/src/xmake/thread/thread_exit.c14
-rw-r--r--core/src/xmake/thread/thread_init.c67
-rw-r--r--core/src/xmake/thread/thread_resume.c6
-rw-r--r--core/src/xmake/thread/thread_suspend.c6
-rw-r--r--core/src/xmake/thread/thread_wait.c6
-rw-r--r--tests/modules/thread/sleep.lua3
8 files changed, 98 insertions, 21 deletions
diff --git a/core/src/xmake/engine.c b/core/src/xmake/engine.c
index 5e5a13693..2f8467899 100644
--- a/core/src/xmake/engine.c
+++ b/core/src/xmake/engine.c
@@ -1650,6 +1650,14 @@ tb_void_t xm_engine_add_embedfiles(xm_engine_ref_t self, tb_byte_t const* data,
engine->embedcount++;
}
#endif
+lua_State* xm_engine_lua(xm_engine_ref_t self)
+{
+ // check
+ xm_engine_t* engine = (xm_engine_t*)self;
+ tb_assert_and_check_return_val(engine, tb_null);
+
+ return engine->lua;
+}
tb_poller_ref_t xm_engine_poller(xm_engine_ref_t self)
{
// check
@@ -1684,7 +1692,6 @@ tb_int_t xm_engine_run(tb_char_t const* name, tb_int_t argc, tb_char_t** argv, t
}
return ok;
}
-
xm_engine_ref_t xm_engine_get(lua_State* lua)
{
tb_assert_and_check_return_val(lua, tb_null);
diff --git a/core/src/xmake/engine.h b/core/src/xmake/engine.h
index a67024360..04ef958d9 100644
--- a/core/src/xmake/engine.h
+++ b/core/src/xmake/engine.h
@@ -87,6 +87,14 @@ tb_void_t xm_engine_register(xm_engine_ref_t engine, tb_char_t
*/
tb_void_t xm_engine_add_embedfiles(xm_engine_ref_t engine, tb_byte_t const* data, tb_size_t size);
+/* get lua state from engine
+ *
+ * @param engine the engine
+ *
+ * @return the lua state
+ */
+lua_State* xm_engine_lua(xm_engine_ref_t engine);
+
/* get poller from engine
*
* @param engine the engine
diff --git a/core/src/xmake/thread/thread_exit.c b/core/src/xmake/thread/thread_exit.c
index 021f2a55c..023d6afa7 100644
--- a/core/src/xmake/thread/thread_exit.c
+++ b/core/src/xmake/thread/thread_exit.c
@@ -43,11 +43,21 @@ tb_int_t xm_thread_exit(lua_State* lua)
return 0;
// get thread
- tb_thread_ref_t thread = (tb_thread_ref_t)xm_lua_topointer(lua, 1);
+ xm_thread_t* thread = (xm_thread_t*)xm_lua_topointer(lua, 1);
tb_check_return_val(thread, 0);
// exit thread
- tb_thread_exit(thread);
+ if (thread)
+ {
+ tb_string_exit(&thread->callback);
+ tb_string_exit(&thread->argv);
+ if (thread->handle)
+ {
+ tb_thread_exit(thread->handle);
+ thread->handle = tb_null;
+ }
+ tb_free(thread);
+ }
lua_pushboolean(lua, tb_true);
return 1;
}
diff --git a/core/src/xmake/thread/thread_init.c b/core/src/xmake/thread/thread_init.c
index b4130b4d9..c33e13702 100644
--- a/core/src/xmake/thread/thread_init.c
+++ b/core/src/xmake/thread/thread_init.c
@@ -42,12 +42,17 @@
static tb_int_t xm_thread_func(tb_cpointer_t priv)
{
+ xm_thread_t* thread = (xm_thread_t*)priv;
+ tb_assert_and_check_return_val(thread, 0);
+
tb_trace_i("thread: start ..");
xm_engine_ref_t engine = xm_engine_init(XM_THREAD_ENGINE_NAME, tb_null);
if (engine)
{
+ tb_char_t* taskargv[] = {"lua", (tb_char_t*)tb_string_cstr(&thread->callback), tb_null};
+
tb_char_t* argv[] = {XM_THREAD_ENGINE_NAME, tb_null};
- xm_engine_main(engine, 1, argv, tb_null);
+ xm_engine_main(engine, 1, argv, taskargv);
xm_engine_exit(engine);
}
tb_trace_i("thread: end");
@@ -62,15 +67,59 @@ tb_int_t xm_thread_init(lua_State* lua)
// check
tb_assert_and_check_return_val(lua, 0);
- // get thread name
- tb_char_t const* name = luaL_checkstring(lua, 1);
+ tb_bool_t ok = tb_false;
+ xm_thread_t* thread = tb_null;
+ do
+ {
+ // get thread name
+ tb_char_t const* name = luaL_checkstring(lua, 1);
+
+ // get callback
+ size_t callback_size = 0;
+ tb_char_t const* callback_data = luaL_checklstring(lua, 2, &callback_size);
+ tb_assert_and_check_break(callback_data && callback_size);
+
+ // get argv
+ size_t argv_size = 0;
+ tb_char_t const* argv_data = luaL_checklstring(lua, 3, &argv_size);
+ tb_assert_and_check_break(argv_data && argv_size);
+
+ // get stack size
+ tb_size_t stacksize = (tb_size_t)luaL_checkinteger(lua, 4);
+
+ // init thread
+ thread = tb_malloc0_type(xm_thread_t);
+ tb_assert_and_check_break(thread);
- // get stack size
- tb_size_t stacksize = (tb_size_t)luaL_checkinteger(lua, 4);
+ tb_string_init(&thread->callback);
+ tb_string_cstrncpy(&thread->callback, callback_data, callback_size);
- // init thread
- tb_thread_ref_t thread = tb_thread_init(name, xm_thread_func, tb_null, stacksize);
- if (thread) xm_lua_pushpointer(lua, (tb_pointer_t)thread);
- else lua_pushnil(lua);
+ tb_string_init(&thread->argv);
+ tb_string_cstrncpy(&thread->argv, argv_data, argv_size);
+
+ // create and start thread
+ thread->handle = tb_thread_init(name, xm_thread_func, thread, stacksize);
+ tb_assert_and_check_break(thread->handle);
+
+ xm_lua_pushpointer(lua, (tb_pointer_t)thread);
+ ok = tb_true;
+
+ } while (0);
+
+ if (!ok)
+ {
+ if (thread)
+ {
+ tb_string_exit(&thread->callback);
+ tb_string_exit(&thread->argv);
+ if (thread->handle)
+ {
+ tb_thread_exit(thread->handle);
+ thread->handle = tb_null;
+ }
+ tb_free(thread);
+ }
+ lua_pushnil(lua);
+ }
return 1;
}
diff --git a/core/src/xmake/thread/thread_resume.c b/core/src/xmake/thread/thread_resume.c
index d611c81e4..25f72a767 100644
--- a/core/src/xmake/thread/thread_resume.c
+++ b/core/src/xmake/thread/thread_resume.c
@@ -43,11 +43,11 @@ tb_int_t xm_thread_resume(lua_State* lua)
return 0;
// get thread
- tb_thread_ref_t thread = (tb_thread_ref_t)xm_lua_topointer(lua, 1);
- tb_check_return_val(thread, 0);
+ xm_thread_t* thread = (xm_thread_t*)xm_lua_topointer(lua, 1);
+ tb_check_return_val(thread && thread->handle, 0);
// resume thread
- lua_pushboolean(lua, tb_thread_resume(thread));
+ lua_pushboolean(lua, tb_thread_resume(thread->handle));
return 1;
}
diff --git a/core/src/xmake/thread/thread_suspend.c b/core/src/xmake/thread/thread_suspend.c
index 825155b5e..7bc4ce11b 100644
--- a/core/src/xmake/thread/thread_suspend.c
+++ b/core/src/xmake/thread/thread_suspend.c
@@ -43,11 +43,11 @@ tb_int_t xm_thread_suspend(lua_State* lua)
return 0;
// get thread
- tb_thread_ref_t thread = (tb_thread_ref_t)xm_lua_topointer(lua, 1);
- tb_check_return_val(thread, 0);
+ xm_thread_t* thread = (xm_thread_t*)xm_lua_topointer(lua, 1);
+ tb_check_return_val(thread && thread->handle, 0);
// suspend thread
- lua_pushboolean(lua, tb_thread_suspend(thread));
+ lua_pushboolean(lua, tb_thread_suspend(thread->handle));
return 1;
}
diff --git a/core/src/xmake/thread/thread_wait.c b/core/src/xmake/thread/thread_wait.c
index 5145a59db..57de3667c 100644
--- a/core/src/xmake/thread/thread_wait.c
+++ b/core/src/xmake/thread/thread_wait.c
@@ -43,15 +43,15 @@ tb_int_t xm_thread_wait(lua_State* lua)
return 0;
// get thread
- tb_thread_ref_t thread = (tb_thread_ref_t)xm_lua_topointer(lua, 1);
- tb_check_return_val(thread, 0);
+ xm_thread_t* thread = (xm_thread_t*)xm_lua_topointer(lua, 1);
+ tb_check_return_val(thread->handle, 0);
// get timeout
tb_size_t timeout = (tb_size_t)luaL_checkinteger(lua, 2);
// wait thread
tb_int_t retval;
- lua_pushinteger(lua, (tb_int_t)tb_thread_wait(thread, timeout, &retval));
+ lua_pushinteger(lua, (tb_int_t)tb_thread_wait(thread->handle, timeout, &retval));
return 1;
}
diff --git a/tests/modules/thread/sleep.lua b/tests/modules/thread/sleep.lua
index 8d4c410f6..9f7bb859c 100644
--- a/tests/modules/thread/sleep.lua
+++ b/tests/modules/thread/sleep.lua
@@ -1,6 +1,8 @@
import("core.thread.thread")
function callback(id)
+ print("hello")
+ --[[
print("%s: %d starting ..", thread.running(), id)
local dt = os.mclock()
for i = 1, 10 do
@@ -9,6 +11,7 @@ function callback(id)
end
dt = os.mclock() - dt
print("%s: %d end, dt: %d ms", thread.running(), id, dt)
+ ]]
end
function main()