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