From 4a80a75fd6196b5ffe30ebb224c335a8f5133e74 Mon Sep 17 00:00:00 2001 From: Cloud Wu Date: Thu, 17 Dec 2015 17:11:54 +0800 Subject: [PATCH] skynet.coroutine.status may return blocked --- lualib/skynet/coroutine.lua | 13 +++++++++++++ test/testcoroutine.lua | 28 +++++++++++++++++++++------- 2 files changed, 34 insertions(+), 7 deletions(-) diff --git a/lualib/skynet/coroutine.lua b/lualib/skynet/coroutine.lua index 69cd3130..1d30ab30 100644 --- a/lualib/skynet/coroutine.lua +++ b/lualib/skynet/coroutine.lua @@ -80,6 +80,19 @@ end end -- end of skynetco.resume +function skynetco.status(co) + local status = coroutine.status(co) + if status == "suspended" then + if skynet_coroutines[co] == false then + return "blocked" + else + return "suspended" + end + else + return status + end +end + function skynetco.yield(...) return coroutine_yield("USER", ...) end diff --git a/test/testcoroutine.lua b/test/testcoroutine.lua index 78a433a6..1bab5d2c 100644 --- a/test/testcoroutine.lua +++ b/test/testcoroutine.lua @@ -2,23 +2,37 @@ local skynet = require "skynet" -- You should use skynet.coroutine instead of origin coroutine in skynet local coroutine = require "skynet.coroutine" +local function status(co) + repeat + local status = coroutine.status(co) + print("STATUS", status) + skynet.sleep(100) + until status == "suspended" + + repeat + local ok, n = assert(coroutine.resume(co)) + print("status thread", n) + until not n + skynet.exit() +end + local function test(n) - print ("begin", coroutine.isskynetcoroutine()) + local co = coroutine.running() + print ("begin", coroutine.isskynetcoroutine(co)) + skynet.fork(status, co) for i=1,n do skynet.sleep(100) coroutine.yield(i) end print "end" - return false end skynet.start(function() - print("Is the main thead a skynet coroutine ?", coroutine.isskynetcoroutine(coroutine.running())) -- always false + print("Is the main thead a skynet coroutine ?", coroutine.isskynetcoroutine()) -- always false print(coroutine.resume(coroutine.running())) -- always return false local f = coroutine.wrap(test) - repeat + for i=1,3 do local n = f(5) - print(n) - until not n - skynet.exit() + print("main thread",n) + end end)