mirror of
https://github.com/cloudwu/skynet.git
synced 2026-07-23 19:43:09 +00:00
add skynet.queryservice
This commit is contained in:
@@ -355,20 +355,25 @@ function skynet.newservice(name, ...)
|
||||
end
|
||||
|
||||
function skynet.uniqueservice(global, ...)
|
||||
local t = 0
|
||||
while true do
|
||||
local handle
|
||||
if global == true then
|
||||
handle = skynet.call("SERVICE", "lua", ...)
|
||||
else
|
||||
handle = skynet.call(".service", "lua", global, ...)
|
||||
end
|
||||
if handle ~= false then
|
||||
return handle
|
||||
end
|
||||
skynet.sleep(t)
|
||||
t=t+1
|
||||
local handle
|
||||
if global == true then
|
||||
handle = skynet.call("SERVICE", "lua", "LAUNCH", ...)
|
||||
else
|
||||
handle = skynet.call(".service", "lua", "LAUNCH", global, ...)
|
||||
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
|
||||
|
||||
local function group_command(cmd, handle, address)
|
||||
@@ -656,8 +661,14 @@ function skynet.context_ptr()
|
||||
return c.context()
|
||||
end
|
||||
|
||||
function skynet.monitor(service)
|
||||
local monitor = skynet.uniqueservice(true, service)
|
||||
function skynet.monitor(service, query)
|
||||
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))
|
||||
end
|
||||
|
||||
|
||||
@@ -1,21 +1,69 @@
|
||||
local skynet = require "skynet"
|
||||
|
||||
local cmd = {}
|
||||
local service = {}
|
||||
|
||||
local function query(service_name, ...)
|
||||
function cmd.LAUNCH(service_name, ...)
|
||||
local s = service[service_name]
|
||||
if type(s) == "number" then
|
||||
return s
|
||||
end
|
||||
|
||||
if s == nil then
|
||||
service[service_name] = false
|
||||
s = skynet.newservice(service_name, ...)
|
||||
s = {}
|
||||
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
|
||||
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, service_name , ...)
|
||||
local handle = query(service_name, ...)
|
||||
skynet.ret(skynet.pack(handle))
|
||||
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
|
||||
|
||||
Reference in New Issue
Block a user