add skynet.trace_timeout(on), see #1098

This commit is contained in:
Cloud Wu
2019-10-22 16:10:57 +08:00
parent 82ed7efb1b
commit 41c66d1b20
2 changed files with 37 additions and 2 deletions

View File

@@ -200,10 +200,35 @@ function suspend(co, result, command)
end
end
local co_create_for_timeout
local timeout_traceback
function skynet.trace_timeout(on)
local function trace_coroutine(func, ti)
local co
co = co_create(function()
timeout_traceback[co] = nil
func()
end)
local info = string.format("TIMER %d+%d : ", skynet.now(), ti)
timeout_traceback[co] = traceback(info, 3)
return co
end
if on then
timeout_traceback = timeout_traceback or {}
co_create_for_timeout = trace_coroutine
else
timeout_traceback = nil
co_create_for_timeout = co_create
end
end
skynet.trace_timeout(false) -- turn off by default
function skynet.timeout(ti, func)
local session = c.intcommand("TIMEOUT",ti)
assert(session)
local co = co_create(func)
local co = co_create_for_timeout(func, ti)
assert(session_id_coroutine[session] == nil)
session_id_coroutine[session] = co
return co -- for debug
@@ -774,7 +799,11 @@ function skynet.task(ret)
local tt = type(ret)
if tt == "table" then
for session,co in pairs(session_id_coroutine) do
ret[session] = traceback(co)
if timeout_traceback and timeout_traceback[co] then
ret[session] = timeout_traceback[co]
else
ret[session] = traceback(co)
end
end
return
elseif tt == "number" then

View File

@@ -13,6 +13,11 @@ end
local function test()
skynet.timeout(10, function() print("test timeout 10") end)
local taskinfo = {}
skynet.task(taskinfo)
for session, info in pairs(taskinfo) do
print("session = ", session, "trace = ", info)
end
for i=1,10 do
print("test sleep",i,skynet.now())
skynet.sleep(1)
@@ -20,6 +25,7 @@ local function test()
end
skynet.start(function()
skynet.trace_timeout(true) -- trun on trace for timeout, skynet.task will returns more info.
test()
skynet.fork(wakeup, coroutine.running())