85 lines
1.8 KiB
Lua
85 lines
1.8 KiB
Lua
-- This is a deprecated module, use skynet.queue instead.
|
|
|
|
local skynet = require "skynet"
|
|
local c = require "skynet.core"
|
|
|
|
local mqueue = {}
|
|
local init_once
|
|
local thread_id
|
|
local message_queue = {}
|
|
|
|
skynet.register_protocol {
|
|
name = "queue",
|
|
-- please read skynet.h for magic number 8
|
|
id = 8,
|
|
pack = skynet.pack,
|
|
unpack = skynet.unpack,
|
|
dispatch = function(session, from, ...)
|
|
table.insert(message_queue, {session = session, addr = from, ... })
|
|
if thread_id then
|
|
skynet.wakeup(thread_id)
|
|
thread_id = nil
|
|
end
|
|
end
|
|
}
|
|
|
|
local function do_func(f, msg)
|
|
return pcall(f, table.unpack(msg))
|
|
end
|
|
|
|
local function message_dispatch(f)
|
|
while true do
|
|
if #message_queue==0 then
|
|
thread_id = coroutine.running()
|
|
skynet.wait()
|
|
else
|
|
local msg = table.remove(message_queue,1)
|
|
local session = msg.session
|
|
if session == 0 then
|
|
local ok, msg = do_func(f, msg)
|
|
if ok then
|
|
if msg then
|
|
skynet.fork(message_dispatch,f)
|
|
error(string.format("[:%x] send a message to [:%x] return something", msg.addr, skynet.self()))
|
|
end
|
|
else
|
|
skynet.fork(message_dispatch,f)
|
|
error(string.format("[:%x] send a message to [:%x] throw an error : %s", msg.addr, skynet.self(),msg))
|
|
end
|
|
else
|
|
local data, size = skynet.pack(do_func(f,msg))
|
|
-- 1 means response
|
|
c.send(msg.addr, 1, session, data, size)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
function mqueue.register(f)
|
|
assert(init_once == nil)
|
|
init_once = true
|
|
skynet.fork(message_dispatch,f)
|
|
end
|
|
|
|
local function catch(succ, ...)
|
|
if succ then
|
|
return ...
|
|
else
|
|
error(...)
|
|
end
|
|
end
|
|
|
|
function mqueue.call(addr, ...)
|
|
return catch(skynet.call(addr, "queue", ...))
|
|
end
|
|
|
|
function mqueue.send(addr, ...)
|
|
return skynet.send(addr, "queue", ...)
|
|
end
|
|
|
|
function mqueue.size()
|
|
return #message_queue
|
|
end
|
|
|
|
return mqueue
|