mirror of
https://github.com/cloudwu/skynet.git
synced 2026-07-25 12:43:09 +00:00
skynet reuse coroutine
This commit is contained in:
@@ -28,6 +28,29 @@ local sleep_session = {}
|
|||||||
local trace_handle
|
local trace_handle
|
||||||
local trace_func = function() end
|
local trace_func = function() end
|
||||||
|
|
||||||
|
-- coroutine reuse
|
||||||
|
|
||||||
|
local coroutine_poll = {}
|
||||||
|
local coroutine_yield = coroutine.yield
|
||||||
|
|
||||||
|
local function co_create(f)
|
||||||
|
local co = table.remove(coroutine_poll)
|
||||||
|
if co == nil then
|
||||||
|
co = coroutine.create(function(...)
|
||||||
|
f(...)
|
||||||
|
while true do
|
||||||
|
f = nil
|
||||||
|
coroutine_poll[#coroutine_poll] = co
|
||||||
|
f = coroutine_yield "EXIT"
|
||||||
|
f(coroutine_yield())
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
else
|
||||||
|
coroutine.resume(co, f)
|
||||||
|
end
|
||||||
|
return co
|
||||||
|
end
|
||||||
|
|
||||||
-- suspend is function
|
-- suspend is function
|
||||||
local suspend
|
local suspend
|
||||||
|
|
||||||
@@ -74,7 +97,7 @@ function suspend(co, result, command, param, size)
|
|||||||
end
|
end
|
||||||
c.send(co_address, 1, co_session, param, size)
|
c.send(co_address, 1, co_session, param, size)
|
||||||
return suspend(co, coroutine.resume(co))
|
return suspend(co, coroutine.resume(co))
|
||||||
elseif command == nil then
|
elseif command == "EXIT" then
|
||||||
-- coroutine exit
|
-- coroutine exit
|
||||||
session_coroutine_id[co] = nil
|
session_coroutine_id[co] = nil
|
||||||
session_coroutine_address[co] = nil
|
session_coroutine_address[co] = nil
|
||||||
@@ -90,7 +113,7 @@ function skynet.timeout(ti, func)
|
|||||||
local session = c.command("TIMEOUT",tostring(ti))
|
local session = c.command("TIMEOUT",tostring(ti))
|
||||||
assert(session)
|
assert(session)
|
||||||
session = tonumber(session)
|
session = tonumber(session)
|
||||||
local co = coroutine.create(func)
|
local co = co_create(func)
|
||||||
assert(session_id_coroutine[session] == nil)
|
assert(session_id_coroutine[session] == nil)
|
||||||
session_id_coroutine[session] = co
|
session_id_coroutine[session] = co
|
||||||
end
|
end
|
||||||
@@ -246,7 +269,7 @@ local fork_queue = {}
|
|||||||
|
|
||||||
function skynet.fork(func,...)
|
function skynet.fork(func,...)
|
||||||
local args = { ... }
|
local args = { ... }
|
||||||
local co = coroutine.create(function()
|
local co = co_create(function()
|
||||||
func(unpack(args))
|
func(unpack(args))
|
||||||
end)
|
end)
|
||||||
table.insert(fork_queue, co)
|
table.insert(fork_queue, co)
|
||||||
@@ -270,7 +293,7 @@ local function dispatch_message(prototype, msg, sz, session, source, ...)
|
|||||||
local p = assert(proto[prototype], prototype)
|
local p = assert(proto[prototype], prototype)
|
||||||
local f = p.dispatch
|
local f = p.dispatch
|
||||||
if f then
|
if f then
|
||||||
local co = coroutine.create(f)
|
local co = co_create(f)
|
||||||
session_coroutine_id[co] = session
|
session_coroutine_id[co] = session
|
||||||
session_coroutine_address[co] = source
|
session_coroutine_address[co] = source
|
||||||
suspend(co, coroutine.resume(co, session,source, p.unpack(msg,sz, ...)))
|
suspend(co, coroutine.resume(co, session,source, p.unpack(msg,sz, ...)))
|
||||||
|
|||||||
Reference in New Issue
Block a user