Files
skynet/service/service_mgr.lua
2013-12-23 11:13:58 +08:00

73 lines
1.4 KiB
Lua

local skynet = require "skynet"
local cmd = {}
local service = {}
function cmd.LAUNCH(service_name, ...)
local s = service[service_name]
if type(s) == "number" then
return s
end
if s == nil then
s = { launch = true }
service[service_name] = s
elseif s.launch then
assert(type(s) == "table")
local co = coroutine.running()
table.insert(s, co)
skynet.wait()
s = service[service_name]
assert(type(s) == "number")
return s
end
local handle = skynet.newservice(service_name, ...)
for _,v in ipairs(s) do
skynet.wakeup(v)
end
service[service_name] = handle
return handle
end
function cmd.QUERY(service_name)
local s = service[service_name]
if type(s) == "number" then
return s
end
if s == nil then
s = {}
service[service_name] = s
end
assert(type(s) == "table")
local co = coroutine.running()
table.insert(s, co)
skynet.wait()
s = service[service_name]
assert(type(s) == "number")
return s
end
skynet.start(function()
skynet.dispatch("lua", function(session, address, command, service_name , ...)
local f = cmd[command]
if f == nil then
skynet.ret(skynet.pack(nil))
return
end
local ok, r = pcall(f, service_name, ...)
if ok then
skynet.ret(skynet.pack(r))
else
skynet.ret(skynet.pack(nil))
end
end)
skynet.register(".service")
if skynet.getenv "standalone" then
skynet.register("SERVICE")
end
end)