summaryrefslogtreecommitdiff
path: root/core/src/xmake/thread
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
parentcd6a9a33613a0a8449c026dd4e4bd77934e29e90 (diff)
improve thread context
Diffstat (limited to 'core/src/xmake/thread')
-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
5 files changed, 79 insertions, 20 deletions
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;
}