From ce6efc535c3f201c52f5567084f0f65a539d8e14 Mon Sep 17 00:00:00 2001 From: Cloud Wu Date: Thu, 25 Sep 2014 17:36:38 +0800 Subject: [PATCH] bugfix: error in forked coroutine. and add skynet.term() --- lualib/skynet.lua | 18 ++++++++++++------ lualib/skynet/debug.lua | 4 ++++ 2 files changed, 16 insertions(+), 6 deletions(-) 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)