diff --git a/lualib/skynet.lua b/lualib/skynet.lua index 78f5bef9..13843199 100644 --- a/lualib/skynet.lua +++ b/lualib/skynet.lua @@ -143,13 +143,15 @@ end function suspend(co, result, command, param, size) if not result then local session = session_coroutine_id[co] - local addr = session_coroutine_address[co] - if session ~= 0 then - -- only call response error - c.send(addr, skynet.PTYPE_ERROR, session, "") + if session then -- coroutine may fork by others (session is nil) + local addr = session_coroutine_address[co] + if session ~= 0 then + -- only call response error + c.send(addr, skynet.PTYPE_ERROR, session, "") + end + session_coroutine_id[co] = nil + session_coroutine_address[co] = nil end - session_coroutine_id[co] = nil - session_coroutine_address[co] = nil error(debug.traceback(co,tostring(command))) end if command == "CALL" then @@ -696,6 +698,10 @@ function skynet.task(ret) return t end +function skynet.term(service) + return _error_dispatch(0, service) +end + -- Inject internal debug framework local debug = require "skynet.debug" debug(skynet, dispatch_message) diff --git a/lualib/skynet/debug.lua b/lualib/skynet/debug.lua index 5b7b5afa..4105ddcb 100644 --- a/lualib/skynet/debug.lua +++ b/lualib/skynet/debug.lua @@ -54,6 +54,10 @@ function dbgcmd.RUN(source, filename) skynet.ret(skynet.pack(table.concat(output, "\n"))) end +function dbgcmd.TERM(service) + skynet.term(service) +end + local function _debug_dispatch(session, address, cmd, ...) local f = dbgcmd[cmd] assert(f, cmd)