mirror of
https://github.com/cloudwu/skynet.git
synced 2026-07-25 12:43: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
|
||||||
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)
|
function skynet.timeout(ti, func)
|
||||||
local session = c.intcommand("TIMEOUT",ti)
|
local session = c.intcommand("TIMEOUT",ti)
|
||||||
assert(session)
|
assert(session)
|
||||||
local co = co_create(func)
|
local co = co_create_for_timeout(func, ti)
|
||||||
assert(session_id_coroutine[session] == nil)
|
assert(session_id_coroutine[session] == nil)
|
||||||
session_id_coroutine[session] = co
|
session_id_coroutine[session] = co
|
||||||
return co -- for debug
|
return co -- for debug
|
||||||
@@ -774,8 +799,12 @@ function skynet.task(ret)
|
|||||||
local tt = type(ret)
|
local tt = type(ret)
|
||||||
if tt == "table" then
|
if tt == "table" then
|
||||||
for session,co in pairs(session_id_coroutine) do
|
for session,co in pairs(session_id_coroutine) do
|
||||||
|
if timeout_traceback and timeout_traceback[co] then
|
||||||
|
ret[session] = timeout_traceback[co]
|
||||||
|
else
|
||||||
ret[session] = traceback(co)
|
ret[session] = traceback(co)
|
||||||
end
|
end
|
||||||
|
end
|
||||||
return
|
return
|
||||||
elseif tt == "number" then
|
elseif tt == "number" then
|
||||||
local co = session_id_coroutine[ret]
|
local co = session_id_coroutine[ret]
|
||||||
|
|||||||
@@ -13,6 +13,11 @@ end
|
|||||||
|
|
||||||
local function test()
|
local function test()
|
||||||
skynet.timeout(10, function() print("test timeout 10") end)
|
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
|
for i=1,10 do
|
||||||
print("test sleep",i,skynet.now())
|
print("test sleep",i,skynet.now())
|
||||||
skynet.sleep(1)
|
skynet.sleep(1)
|
||||||
@@ -20,6 +25,7 @@ local function test()
|
|||||||
end
|
end
|
||||||
|
|
||||||
skynet.start(function()
|
skynet.start(function()
|
||||||
|
skynet.trace_timeout(true) -- trun on trace for timeout, skynet.task will returns more info.
|
||||||
test()
|
test()
|
||||||
|
|
||||||
skynet.fork(wakeup, coroutine.running())
|
skynet.fork(wakeup, coroutine.running())
|
||||||
|
|||||||
Reference in New Issue
Block a user