use traceback for coroutine

This commit is contained in:
云风
2012-08-15 16:07:53 +08:00
parent 5b72cdd4d6
commit d69d3c9965

View File

@@ -9,14 +9,10 @@ local session_id_coroutine = {}
local session_coroutine_id = {} local session_coroutine_id = {}
local session_coroutine_address = {} local session_coroutine_address = {}
local function create_coroutine(f)
return coroutine.create(function(...)
assert(xpcall(f,debug.traceback,...))
end)
end
local function suspend(co, result, command, param, size) local function suspend(co, result, command, param, size)
assert(result, command) if not result then
error(debug.traceback(co,command))
end
if command == "CALL" or command == "SLEEP" then if command == "CALL" or command == "SLEEP" then
session_id_coroutine[param] = co session_id_coroutine[param] = co
elseif command == "RETURN" then elseif command == "RETURN" then
@@ -28,7 +24,7 @@ local function suspend(co, result, command, param, size)
session_coroutine_id[co] = nil session_coroutine_id[co] = nil
session_coroutine_address[co] = nil session_coroutine_address[co] = nil
else else
error("Unknown command : " .. command) error("Unknown command : " .. command .. "\n" .. debug.traceback(co))
end end
end end
@@ -38,10 +34,10 @@ function skynet.timeout(ti, func, ...)
session = tonumber(session) session = tonumber(session)
local co local co
if select("#",...) == 0 then if select("#",...) == 0 then
co = create_coroutine(func) co = coroutine.create(func)
else else
local args = { ... } local args = { ... }
co = create_coroutine(function() co = coroutine.create(function()
func(unpack(args)) func(unpack(args))
end) end)
end end
@@ -139,7 +135,7 @@ local function default_dispatch(f)
end end
if session <= 0 then if session <= 0 then
session = - session session = - session
co = create_coroutine(f) co = coroutine.create(f)
session_coroutine_id[co] = session session_coroutine_id[co] = session
session_coroutine_address[co] = address session_coroutine_address[co] = address
suspend(co, coroutine.resume(co, msg, sz, session, address)) suspend(co, coroutine.resume(co, msg, sz, session, address))
@@ -165,7 +161,7 @@ end
function skynet.start(f) function skynet.start(f)
local session = c.command("TIMEOUT","0") local session = c.command("TIMEOUT","0")
local co = create_coroutine( local co = coroutine.create(
function(...) function(...)
f(...) f(...)
skynet.send(".launcher",0) skynet.send(".launcher",0)