summaryrefslogtreecommitdiff
path: root/core/src/xmake/thread/thread_init.c
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 /core/src/xmake/thread/thread_init.c
parentcd6a9a33613a0a8449c026dd4e4bd77934e29e90 (diff)
improve thread context
Diffstat (limited to 'core/src/xmake/thread/thread_init.c')
-rw-r--r--core/src/xmake/thread/thread_init.c67
1 files changed, 58 insertions, 9 deletions
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;
}