close thread in suspend, See #1261

This commit is contained in:
Cloud Wu
2020-12-04 15:42:35 +08:00
parent 56c70dc7ac
commit 3af6b72aed

View File

@@ -14,20 +14,12 @@ local tunpack = table.unpack
local traceback = debug.traceback local traceback = debug.traceback
local cresume = coroutine.resume local cresume = coroutine.resume
local coroutine_close = coroutine.close
local running_thread = nil local running_thread = nil
local init_thread = nil local init_thread = nil
local function coroutine_ret(co, ok, ...)
if not ok then
coroutine_close(co)
end
return ok, ...
end
local function coroutine_resume(co, ...) local function coroutine_resume(co, ...)
running_thread = co running_thread = co
return coroutine_ret(co, cresume(co, ...)) return cresume(co, ...)
end end
local coroutine_yield = coroutine.yield local coroutine_yield = coroutine.yield
local coroutine_create = coroutine.create local coroutine_create = coroutine.create
@@ -332,12 +324,14 @@ function suspend(co, result, command)
session_coroutine_address[co] = nil session_coroutine_address[co] = nil
session_coroutine_tracetag[co] = nil session_coroutine_tracetag[co] = nil
skynet.fork(function() end) -- trigger command "SUSPEND" skynet.fork(function() end) -- trigger command "SUSPEND"
error(traceback(co,tostring(command))) local tb = traceback(co,tostring(command))
coroutine.close(co)
error(tb)
end end
if command == "SUSPEND" then if command == "SUSPEND" then
return dispatch_wakeup() return dispatch_wakeup()
elseif command == "QUIT" then elseif command == "QUIT" then
coroutine_close(co) coroutine.close(co)
-- service exit -- service exit
return return
elseif command == "USER" then elseif command == "USER" then
@@ -534,7 +528,7 @@ function skynet.exit()
end end
for session, co in pairs(session_id_coroutine) do for session, co in pairs(session_id_coroutine) do
if type(co) == "thread" then if type(co) == "thread" then
coroutine_close(co) coroutine.close(co)
end end
end end
for resp in pairs(unresponse) do for resp in pairs(unresponse) do