diff options
| author | ruki <[email protected]> | 2025-04-17 22:46:06 +0800 |
|---|---|---|
| committer | ruki <[email protected]> | 2025-08-28 11:35:53 +0800 |
| commit | 6eccd1efa540d634e35eb29cf923025e0667aa0c (patch) | |
| tree | cd33e9f7ff6e0ab31698ce01e53f7eb79ebf1cce /core/src/xmake/thread/thread_init.c | |
| parent | cd6a9a33613a0a8449c026dd4e4bd77934e29e90 (diff) | |
improve thread context
Diffstat (limited to 'core/src/xmake/thread/thread_init.c')
| -rw-r--r-- | core/src/xmake/thread/thread_init.c | 67 |
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; } |
