From 340148c152898e45d9d935d3ace34ff9d6fe683f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BA=91=E9=A3=8E?= Date: Mon, 25 Nov 2013 21:43:43 +0800 Subject: [PATCH] add skynet.queryservice --- lualib/skynet.lua | 41 +++++++++++++++++----------- service/service_mgr.lua | 60 ++++++++++++++++++++++++++++++++++++----- 2 files changed, 80 insertions(+), 21 deletions(-) diff --git a/lualib/skynet.lua b/lualib/skynet.lua index 6ec24b6b..f663fd90 100644 --- a/lualib/skynet.lua +++ b/lualib/skynet.lua @@ -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 diff --git a/service/service_mgr.lua b/service/service_mgr.lua index 74b799d9..5843a945 100644 --- a/service/service_mgr.lua +++ b/service/service_mgr.lua @@ -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