mirror of
https://github.com/cloudwu/skynet.git
synced 2026-07-22 02:53:09 +00:00
add skynet.trace_timeout(on), see #1098
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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())
|
||||
|
||||
Reference in New Issue
Block a user