diff options
| author | ruki <[email protected]> | 2025-04-18 22:42:48 +0800 |
|---|---|---|
| committer | ruki <[email protected]> | 2025-08-28 11:35:53 +0800 |
| commit | ad77d170e407fc7d346df32a88683aae050bf36b (patch) | |
| tree | e1ae2f06dc31a84ae42b4dd6086cb570ef88b95b | |
| parent | 6eccd1efa540d634e35eb29cf923025e0667aa0c (diff) | |
run thread
| -rw-r--r-- | core/src/xmake/thread/prefix.h | 3 | ||||
| -rw-r--r-- | core/src/xmake/thread/thread_exit.c | 3 | ||||
| -rw-r--r-- | core/src/xmake/thread/thread_init.c | 40 | ||||
| -rw-r--r-- | xmake/core/_xmake_main.lua | 1 | ||||
| -rw-r--r-- | xmake/core/main.lua | 51 | ||||
| -rw-r--r-- | xmake/core/thread/thread.lua | 9 |
6 files changed, 67 insertions, 40 deletions
diff --git a/core/src/xmake/thread/prefix.h b/core/src/xmake/thread/prefix.h index 6ce15073b..061dca962 100644 --- a/core/src/xmake/thread/prefix.h +++ b/core/src/xmake/thread/prefix.h @@ -34,8 +34,7 @@ typedef struct __xm_thread_t { tb_thread_ref_t handle; - tb_string_t callback; - tb_string_t argv; + tb_string_t callinfo; }xm_thread_t; diff --git a/core/src/xmake/thread/thread_exit.c b/core/src/xmake/thread/thread_exit.c index 023d6afa7..881addbd2 100644 --- a/core/src/xmake/thread/thread_exit.c +++ b/core/src/xmake/thread/thread_exit.c @@ -49,8 +49,7 @@ tb_int_t xm_thread_exit(lua_State* lua) // exit thread if (thread) { - tb_string_exit(&thread->callback); - tb_string_exit(&thread->argv); + tb_string_exit(&thread->callinfo); if (thread->handle) { tb_thread_exit(thread->handle); diff --git a/core/src/xmake/thread/thread_init.c b/core/src/xmake/thread/thread_init.c index c33e13702..8ed5cf90a 100644 --- a/core/src/xmake/thread/thread_init.c +++ b/core/src/xmake/thread/thread_init.c @@ -49,10 +49,21 @@ static tb_int_t xm_thread_func(tb_cpointer_t priv) 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}; + // pass callinfo + lua_State* lua = xm_engine_lua(engine); + tb_assert(lua); + tb_char_t const* callinfo_data = tb_string_cstr(&thread->callinfo); + tb_size_t callinfo_size = tb_string_size(&thread->callinfo); + if (callinfo_data && callinfo_size) + { + lua_pushlstring(lua, callinfo_data, callinfo_size); + lua_setglobal(lua, "_THREAD_CALLINFO"); + } + + // start engine tb_char_t* argv[] = {XM_THREAD_ENGINE_NAME, tb_null}; - xm_engine_main(engine, 1, argv, taskargv); + xm_engine_main(engine, 1, argv, tb_null); xm_engine_exit(engine); } tb_trace_i("thread: end"); @@ -74,28 +85,20 @@ tb_int_t xm_thread_init(lua_State* lua) // 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 callinfo + size_t callinfo_size = 0; + tb_char_t const* callinfo_data = luaL_checklstring(lua, 2, &callinfo_size); + tb_assert_and_check_break(callinfo_data && callinfo_size); // get stack size - tb_size_t stacksize = (tb_size_t)luaL_checkinteger(lua, 4); + tb_size_t stacksize = (tb_size_t)luaL_checkinteger(lua, 3); // init thread thread = tb_malloc0_type(xm_thread_t); tb_assert_and_check_break(thread); - tb_string_init(&thread->callback); - tb_string_cstrncpy(&thread->callback, callback_data, callback_size); - - tb_string_init(&thread->argv); - tb_string_cstrncpy(&thread->argv, argv_data, argv_size); + tb_string_init(&thread->callinfo); + tb_string_cstrncpy(&thread->callinfo, callinfo_data, callinfo_size); // create and start thread thread->handle = tb_thread_init(name, xm_thread_func, thread, stacksize); @@ -110,8 +113,7 @@ tb_int_t xm_thread_init(lua_State* lua) { if (thread) { - tb_string_exit(&thread->callback); - tb_string_exit(&thread->argv); + tb_string_exit(&thread->callinfo); if (thread->handle) { tb_thread_exit(thread->handle); diff --git a/xmake/core/_xmake_main.lua b/xmake/core/_xmake_main.lua index 282106806..5d2d8f7a3 100644 --- a/xmake/core/_xmake_main.lua +++ b/xmake/core/_xmake_main.lua @@ -36,6 +36,7 @@ xmake._PROJECT_FILE = "xmake.lua" xmake._WORKING_DIR = os.curdir() xmake._FEATURES = _FEATURES xmake._LUAJIT = _LUAJIT +xmake._THREAD_CALLINFO = _THREAD_CALLINFO -- In order to be compatible with updates from lower versions of engine core -- @see https://github.com/xmake-io/xmake/issues/1694#issuecomment-925507210 diff --git a/xmake/core/main.lua b/xmake/core/main.lua index 87e94c824..95202b04c 100644 --- a/xmake/core/main.lua +++ b/xmake/core/main.lua @@ -258,6 +258,33 @@ function main._limit_root() return not option.get("root") and os.getenv("XMAKE_ROOT") ~= 'y' and os.host() ~= 'haiku' end +-- run task +function main._run_task(taskname) + local taskinst = task.task(taskname) or project.task(taskname) + if not taskinst then + return main._exit(false, string.format("do unknown task(%s)!", taskname)) + end + + scheduler:co_start_named("xmake " .. taskname, function () + local ok, errors = taskinst:run() + if not ok then + os.raise(errors) + end + end) +end + +-- run thread +function main._run_thread(callinfo_str) + local callinfo, errors = string.deserialize(callinfo_str) + if not callinfo then + return main._exit(false, string.format("invalid thread callinfo, %s!", errors or "unknown")) + end + local callback = callinfo.callback + if callback then + callback(callinfo.argv) + end +end + -- the main entry function function main.entry() @@ -314,22 +341,18 @@ Or you can add `--root` option or XMAKE_ROOT=y to allow run as root temporarily. localcache.save("history") end - -- get task instance - local taskname = option.taskname() or "build" - local taskinst = task.task(taskname) or project.task(taskname) - if not taskinst then - return main._exit(false, string.format("do unknown task(%s)!", taskname)) - end - - -- run task + -- enable scheduler scheduler:enable(true) - scheduler:co_start_named("xmake " .. taskname, function () - local ok, errors = taskinst:run() - if not ok then - os.raise(errors) - end - end) + -- run task or thread + local thread_callinfo = xmake._THREAD_CALLINFO + if thread_callinfo then + main._run_thread(thread_callinfo) + else + main._run_task(option.taskname() or "build") + end + + -- start runloop ok, errors = scheduler:runloop() if not ok then return main._exit(ok, errors) diff --git a/xmake/core/thread/thread.lua b/xmake/core/thread/thread.lua index cac5d916d..33ac3dca0 100644 --- a/xmake/core/thread/thread.lua +++ b/xmake/core/thread/thread.lua @@ -91,11 +91,14 @@ function _instance:start() assert(not self:cdata()) -- serialize and pass callback and arguments to this thread - local callback = string.serialize(self._CALLBACK, {strip = true, indent = false}) - local argv = string.serialize(self._ARGV, {strip = true, indent = false}) + local callinfo = { + callback = self._CALLBACK, + argv = self._ARGV + } + callinfo = string.serialize(callinfo, {strip = true, indent = false}) -- init and start thread - local handle, errors = thread.thread_init(self:name(), callback, argv, self._STACKSIZE) + local handle, errors = thread.thread_init(self:name(), callinfo, self._STACKSIZE) if not handle then return nil, errors or string.format("%s: failed to create thread!", self) end |
