diff --git a/lualib/skynet.lua b/lualib/skynet.lua index 3252f2ae..47d13398 100644 --- a/lualib/skynet.lua +++ b/lualib/skynet.lua @@ -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 diff --git a/test/testtimer.lua b/test/testtimer.lua index 776aa0de..2ca2cbe0 100644 --- a/test/testtimer.lua +++ b/test/testtimer.lua @@ -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())