Skip to content

Commit 340148c

Browse files
committed
add skynet.queryservice
1 parent dca2399 commit 340148c

File tree

2 files changed

+80
-21
lines changed

2 files changed

+80
-21
lines changed

lualib/skynet.lua

Lines changed: 26 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -355,20 +355,25 @@ function skynet.newservice(name, ...)
355355
end
356356

357357
function skynet.uniqueservice(global, ...)
358-
local t = 0
359-
while true do
360-
local handle
361-
if global == true then
362-
handle = skynet.call("SERVICE", "lua", ...)
363-
else
364-
handle = skynet.call(".service", "lua", global, ...)
365-
end
366-
if handle ~= false then
367-
return handle
368-
end
369-
skynet.sleep(t)
370-
t=t+1
358+
local handle
359+
if global == true then
360+
handle = skynet.call("SERVICE", "lua", "LAUNCH", ...)
361+
else
362+
handle = skynet.call(".service", "lua", "LAUNCH", global, ...)
371363
end
364+
assert(handle , "Unique service launch failed")
365+
return handle
366+
end
367+
368+
function skynet.queryservice(global, ...)
369+
local handle
370+
if global == true then
371+
handle = skynet.call("SERVICE", "lua", "QUERY", ...)
372+
else
373+
handle = skynet.call(".service", "lua", "QUERY", global, ...)
374+
end
375+
assert(handle , "Unique service query failed")
376+
return handle
372377
end
373378

374379
local function group_command(cmd, handle, address)
@@ -656,8 +661,14 @@ function skynet.context_ptr()
656661
return c.context()
657662
end
658663

659-
function skynet.monitor(service)
660-
local monitor = skynet.uniqueservice(true, service)
664+
function skynet.monitor(service, query)
665+
local monitor
666+
if query then
667+
monitor = skynet.queryservice(true, service)
668+
else
669+
monitor = skynet.uniqueservice(true, service)
670+
end
671+
assert(monitor, "Monitor launch failed")
661672
c.command("MONITOR", string.format(":%08x", monitor))
662673
end
663674

service/service_mgr.lua

Lines changed: 54 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,69 @@
11
local skynet = require "skynet"
22

3+
local cmd = {}
34
local service = {}
45

5-
local function query(service_name, ...)
6+
function cmd.LAUNCH(service_name, ...)
67
local s = service[service_name]
8+
if type(s) == "number" then
9+
return s
10+
end
11+
12+
if s == nil then
13+
s = {}
14+
service[service_name] = s
15+
else
16+
assert(type(s) == "table")
17+
local co = coroutine.running()
18+
table.insert(s, co)
19+
skynet.wait()
20+
s = service[service_name]
21+
assert(type(s) == "number")
22+
return s
23+
end
24+
25+
local handle = skynet.newservice(service_name, ...)
26+
for _,v in ipairs(s) do
27+
skynet.wakeup(v)
28+
end
29+
30+
service[service_name] = handle
31+
32+
return handle
33+
end
34+
35+
function cmd.QUERY(service_name)
36+
local s = service[service_name]
37+
if type(s) == "number" then
38+
return s
39+
end
740
if s == nil then
8-
service[service_name] = false
9-
s = skynet.newservice(service_name, ...)
41+
s = {}
1042
service[service_name] = s
1143
end
44+
assert(type(s) == "table")
45+
local co = coroutine.running()
46+
table.insert(s, co)
47+
skynet.wait()
48+
s = service[service_name]
49+
assert(type(s) == "number")
1250
return s
1351
end
1452

1553
skynet.start(function()
16-
skynet.dispatch("lua", function(session, address, service_name , ...)
17-
local handle = query(service_name, ...)
18-
skynet.ret(skynet.pack(handle))
54+
skynet.dispatch("lua", function(session, address, command, service_name , ...)
55+
local f = cmd[command]
56+
if f == nil then
57+
skynet.ret(skynet.pack(nil))
58+
return
59+
end
60+
61+
local ok, r = pcall(f, service_name, ...)
62+
if ok then
63+
skynet.ret(skynet.pack(r))
64+
else
65+
skynet.ret(skynet.pack(nil))
66+
end
1967
end)
2068
skynet.register(".service")
2169
if skynet.getenv "standalone" then

0 commit comments

Comments
 (0)