summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorruki <[email protected]>2025-04-18 22:42:48 +0800
committerruki <[email protected]>2025-08-28 11:35:53 +0800
commitad77d170e407fc7d346df32a88683aae050bf36b (patch)
treee1ae2f06dc31a84ae42b4dd6086cb570ef88b95b
parent6eccd1efa540d634e35eb29cf923025e0667aa0c (diff)
run thread
-rw-r--r--core/src/xmake/thread/prefix.h3
-rw-r--r--core/src/xmake/thread/thread_exit.c3
-rw-r--r--core/src/xmake/thread/thread_init.c40
-rw-r--r--xmake/core/_xmake_main.lua1
-rw-r--r--xmake/core/main.lua51
-rw-r--r--xmake/core/thread/thread.lua9
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