diff options
| author | ruki <[email protected]> | 2025-04-16 22:32:58 +0800 |
|---|---|---|
| committer | ruki <[email protected]> | 2025-08-28 11:35:53 +0800 |
| commit | d985de5de38fb0d041f8e9182c076575603b5b4f (patch) | |
| tree | e3f4d6fa47335e74285ce5888495190717b00383 | |
| parent | d8862afe89a16a9f4ad0a21188bd174b3c81a935 (diff) | |
improve api and tests
| -rw-r--r-- | tests/modules/thread/sleep.lua | 15 | ||||
| -rw-r--r-- | xmake/core/sandbox/modules/import/core/thread/thread.lua | 23 | ||||
| -rw-r--r-- | xmake/core/thread/thread.lua | 60 |
3 files changed, 67 insertions, 31 deletions
diff --git a/tests/modules/thread/sleep.lua b/tests/modules/thread/sleep.lua index 1890278b3..4dc350cd3 100644 --- a/tests/modules/thread/sleep.lua +++ b/tests/modules/thread/sleep.lua @@ -1,17 +1,20 @@ import("core.thread.thread") function callback(id) - print("%s: %d ..", thread.running(), id) + print("%s: %d starting ..", thread.running(), id) local dt = os.mclock() - os.sleep(1000) + for i = 1, 10 do + print("%s: %d", thread.running(), i) + os.sleep(1000) + end dt = os.mclock() - dt print("%s: %d end, dt: %d ms", thread.running(), id, dt) end function main() - for i = 1, 10 do - thread.start_named("thread_" .. i, callback, i) - end - --thread.wait() + local t0 = thread.start_named("thread_0", callback, 0) + local t1 = thread.start_named("thread_1", callback, 1) + thread.wait(t0, -1) + thread.wait(t1, -1) end diff --git a/xmake/core/sandbox/modules/import/core/thread/thread.lua b/xmake/core/sandbox/modules/import/core/thread/thread.lua index 39a808341..57fd10485 100644 --- a/xmake/core/sandbox/modules/import/core/thread/thread.lua +++ b/xmake/core/sandbox/modules/import/core/thread/thread.lua @@ -28,24 +28,11 @@ local raise = require("sandbox/modules/raise") local sandbox_core_thread = sandbox_core_thread or {} local sandbox_core_thread_instance = sandbox_core_thread_instance or {} --- export the thread types -sandbox_core_thread.TCP = thread.TCP -sandbox_core_thread.UDP = thread.UDP -sandbox_core_thread.ICMP = thread.ICMP - --- export the thread families -sandbox_core_thread.IPV4 = thread.IPV4 -sandbox_core_thread.IPV6 = thread.IPV6 - --- export the thread events -sandbox_core_thread.EV_RECV = thread.EV_RECV -sandbox_core_thread.EV_SEND = thread.EV_SEND -sandbox_core_thread.EV_CONN = thread.EV_CONN -sandbox_core_thread.EV_ACPT = thread.EV_ACPT - --- export the thread control code -sandbox_core_thread.CTRL_SET_RECVBUFF = thread.CTRL_SET_RECVBUFF -sandbox_core_thread.CTRL_SET_SENDBUFF = thread.CTRL_SET_SENDBUFF +-- export the thread status +sandbox_core_thread.STATUS_READY = thread.STATUS_READY +sandbox_core_thread.STATUS_RUNNING = thread.STATUS_RUNNING +sandbox_core_thread.STATUS_SUSPENDED = thread.STATUS_SUSPENDED +sandbox_core_thread.STATUS_DEAD = thread.STATUS_DEAD -- wrap thread function _thread_wrap(instance) diff --git a/xmake/core/thread/thread.lua b/xmake/core/thread/thread.lua index ddc96543e..3a3de2705 100644 --- a/xmake/core/thread/thread.lua +++ b/xmake/core/thread/thread.lua @@ -84,27 +84,72 @@ function _instance:is_dead() end -- start thread -function _instance:start(instance) +function _instance:start() if not self:is_ready() then + return nil, string.format("%s: cannot start non-ready thread!", self) end + assert(not self:cdata()) - -- TODO - local handle, errors = thread.thread_create(name, callback, argv, stacksize) + local handle, errors = thread.thread_create(self:name(), self._CALLBACK, self._ARGV, self._STACKSIZE) if not handle then - return nil, errors or string.format("failed to create thread(%s)!", name) + return nil, errors or string.format("%s: failed to create thread!", self) end + + self._HANLDE = handle + self._STATUS = thread.STATUS_RUNNING + return true end -- suspend thread -function _instance:suspend(instance) +function _instance:suspend() + if not self:is_running() then + return nil, string.format("%s: cannot suspend non-running thread!", self) + end + assert(self:cdata()) + + local ok, errors = thread.thread_suspend(self:cdata()) + if not ok then + return nil, errors or string.format("%s: failed to suspend thread!", self) + end + + self._STATUS = thread.STATUS_SUSPENDED + return true end -- resume thread -function _instance:resume(instance) +function _instance:resume() + if not self:is_suspended() then + return nil, string.format("%s: cannot suspend non-suspended thread!", self) + end + assert(self:cdata()) + + local ok, errors = thread.thread_resume(self:cdata()) + if not ok then + return nil, errors or string.format("%s: failed to resume thread!", self) + end + + self._STATUS = thread.STATUS_RUNNING + return true end -- wait thread -function _instance:wait(instance, timeout) +function _instance:wait(timeout) + if self:is_dead() then + return 1 + elseif self:is_ready() then + return -1, string.format("%s: cannot wait ready thread!", self) + end + assert(self:cdata()) + + local ok, errors = thread.thread_wait(self:cdata(), timeout) + if ok < 0 then + return -1, errors or string.format("%s: failed to resume thread!", self) + end + + if ok > 0 then + self._STATUS = thread.STATUS_DEAD + end + return ok end -- tostring(thread) @@ -145,6 +190,7 @@ end -- get the running thread function thread.running() + -- TODO end -- return module |
