add skynet.queryservice

This commit is contained in:
云风
2013-11-25 21:43:43 +08:00
parent dca23999d0
commit 340148c152
2 changed files with 80 additions and 21 deletions

View File

@@ -355,20 +355,25 @@ function skynet.newservice(name, ...)
end end
function skynet.uniqueservice(global, ...) function skynet.uniqueservice(global, ...)
local t = 0 local handle
while true do if global == true then
local handle handle = skynet.call("SERVICE", "lua", "LAUNCH", ...)
if global == true then else
handle = skynet.call("SERVICE", "lua", ...) handle = skynet.call(".service", "lua", "LAUNCH", global, ...)
else
handle = skynet.call(".service", "lua", global, ...)
end
if handle ~= false then
return handle
end
skynet.sleep(t)
t=t+1
end end
assert(handle , "Unique service launch failed")
return handle
end
function skynet.queryservice(global, ...)
local handle
if global == true then
handle = skynet.call("SERVICE", "lua", "QUERY", ...)
else
handle = skynet.call(".service", "lua", "QUERY", global, ...)
end
assert(handle , "Unique service query failed")
return handle
end end
local function group_command(cmd, handle, address) local function group_command(cmd, handle, address)
@@ -656,8 +661,14 @@ function skynet.context_ptr()
return c.context() return c.context()
end end
function skynet.monitor(service) function skynet.monitor(service, query)
local monitor = skynet.uniqueservice(true, service) local monitor
if query then
monitor = skynet.queryservice(true, service)
else
monitor = skynet.uniqueservice(true, service)
end
assert(monitor, "Monitor launch failed")
c.command("MONITOR", string.format(":%08x", monitor)) c.command("MONITOR", string.format(":%08x", monitor))
end end

View File

@@ -1,21 +1,69 @@
local skynet = require "skynet" local skynet = require "skynet"
local cmd = {}
local service = {} local service = {}
local function query(service_name, ...) function cmd.LAUNCH(service_name, ...)
local s = service[service_name] local s = service[service_name]
if type(s) == "number" then
return s
end
if s == nil then if s == nil then
service[service_name] = false s = {}
s = skynet.newservice(service_name, ...) service[service_name] = s
else
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 service[service_name] = s
end 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 return s
end end
skynet.start(function() skynet.start(function()
skynet.dispatch("lua", function(session, address, service_name , ...) skynet.dispatch("lua", function(session, address, command, service_name , ...)
local handle = query(service_name, ...) local f = cmd[command]
skynet.ret(skynet.pack(handle)) 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) end)
skynet.register(".service") skynet.register(".service")
if skynet.getenv "standalone" then if skynet.getenv "standalone" then