From a4a21bd7931d68c9eb10183e65c8398f896b8673 Mon Sep 17 00:00:00 2001 From: Cloud Wu Date: Tue, 29 Apr 2014 17:05:27 +0800 Subject: [PATCH] move lualib/snax_* to lualib/snax/ --- lualib/skynet.lua | 85 ++---------------- lualib/skynet/debug.lua | 49 ++++++++++ lualib/snax.lua | 2 +- lualib/{snax_hotfix.lua => snax/hotfix.lua} | 2 +- .../interface.lua} | 0 service/launcher.lua | 89 ++++++++++++------- service/snaxd.lua | 16 ++-- 7 files changed, 124 insertions(+), 119 deletions(-) create mode 100644 lualib/skynet/debug.lua rename lualib/{snax_hotfix.lua => snax/hotfix.lua} (98%) rename lualib/{snax_interface.lua => snax/interface.lua} (100%) diff --git a/lualib/skynet.lua b/lualib/skynet.lua index 433cfa93..6fcbb66d 100644 --- a/lualib/skynet.lua +++ b/lualib/skynet.lua @@ -399,7 +399,7 @@ local function raw_dispatch_message(prototype, msg, sz, session, source, ...) session_coroutine_address[co] = source suspend(co, coroutine.resume(co, session,source, p.unpack(msg,sz, ...))) else - unknown_request(session, source, msg, sz) + unknown_request(session, source, msg, sz) end end end @@ -426,8 +426,7 @@ local function dispatch_message(...) end function skynet.newservice(name, ...) - local param = table.concat({"snlua", name, ...}, " ") - local handle = skynet.call(".launcher", "text" , param) + local handle = skynet.tostring(skynet.rawcall(".launcher", "lua" , skynet.pack("LAUNCH", "snlua", name, ...))) if handle == "" then return nil else @@ -451,14 +450,6 @@ function skynet.queryservice(global, ...) end end -local function group_command(cmd, handle, address) - if address then - return string.format("%s %d :%x",cmd, handle, address) - else - return string.format("%s %d",cmd,handle) - end -end - function skynet.address(addr) if type(addr) == "number" then return string.format(":%x",addr) @@ -479,66 +470,10 @@ function skynet.error(...) return c.error(table.concat(t, " ")) end ------ debug - -local internal_info_func - -function skynet.info_func(func) - internal_info_func = func -end - -local dbgcmd = {} - -function dbgcmd.MEM() - local kb, bytes = collectgarbage "count" - skynet.ret(skynet.pack(kb,bytes)) -end - -function dbgcmd.GC() - coroutine_pool = {} - collectgarbage "collect" -end - -function dbgcmd.STAT() - local stat = {} - stat.mqlen = skynet.mqlen() - skynet.ret(skynet.pack(stat)) -end - -function dbgcmd.INFO() - if internal_info_func then - skynet.ret(skynet.pack(internal_info_func())) - else - skynet.ret(skynet.pack(nil)) - end -end - -local function _debug_dispatch(session, address, cmd, ...) - local f = dbgcmd[cmd] - assert(f, cmd) - f(...) -end - ----- register protocol do local REG = skynet.register_protocol - REG { - name = "text", - id = skynet.PTYPE_TEXT, - pack = function (...) - local n = select ("#" , ...) - if n == 0 then - return "" - elseif n == 1 then - return tostring(...) - else - return table.concat({...}," ") - end - end, - unpack = c.tostring - } - REG { name = "lua", id = skynet.PTYPE_LUA, @@ -551,14 +486,6 @@ do id = skynet.PTYPE_RESPONSE, } - REG { - name = "debug", - id = skynet.PTYPE_DEBUG, - pack = skynet.pack, - unpack = skynet.unpack, - dispatch = _debug_dispatch, - } - REG { name = "error", id = skynet.PTYPE_ERROR, @@ -603,10 +530,10 @@ local function init_service(start) local ok, err = xpcall(init_template, debug.traceback, start) if not ok then print("init service failed:", err) - skynet.send(".launcher","text", "ERROR") + skynet.send(".launcher","lua", "ERROR") skynet.exit() else - skynet.send(".launcher","text", "") + skynet.send(".launcher","lua", "LAUNCHOK") end end @@ -649,4 +576,8 @@ function skynet.mqlen() return tonumber(c.command "MQLEN") end +-- Inject internal debug framework +local debug = require "skynet.debug" +debug(skynet) + return skynet diff --git a/lualib/skynet/debug.lua b/lualib/skynet/debug.lua new file mode 100644 index 00000000..807ee2ae --- /dev/null +++ b/lualib/skynet/debug.lua @@ -0,0 +1,49 @@ +return function (skynet) + +local internal_info_func + +function skynet.info_func(func) + internal_info_func = func +end + +local dbgcmd = {} + +function dbgcmd.MEM() + local kb, bytes = collectgarbage "count" + skynet.ret(skynet.pack(kb,bytes)) +end + +function dbgcmd.GC() + coroutine_pool = {} + collectgarbage "collect" +end + +function dbgcmd.STAT() + local stat = {} + stat.mqlen = skynet.mqlen() + skynet.ret(skynet.pack(stat)) +end + +function dbgcmd.INFO() + if internal_info_func then + skynet.ret(skynet.pack(internal_info_func())) + else + skynet.ret(skynet.pack(nil)) + end +end + +local function _debug_dispatch(session, address, cmd, ...) + local f = dbgcmd[cmd] + assert(f, cmd) + f(...) +end + +skynet.register_protocol { + name = "debug", + id = assert(skynet.PTYPE_DEBUG), + pack = assert(skynet.pack), + unpack = assert(skynet.unpack), + dispatch = _debug_dispatch, +} + +end \ No newline at end of file diff --git a/lualib/snax.lua b/lualib/snax.lua index c712487c..f810e392 100644 --- a/lualib/snax.lua +++ b/lualib/snax.lua @@ -1,5 +1,5 @@ local skynet = require "skynet" -local snax_interface = require "snax_interface" +local snax_interface = require "snax.interface" local snax = {} local typeclass = {} diff --git a/lualib/snax_hotfix.lua b/lualib/snax/hotfix.lua similarity index 98% rename from lualib/snax_hotfix.lua rename to lualib/snax/hotfix.lua index f42ab0c6..e0cc2a7f 100644 --- a/lualib/snax_hotfix.lua +++ b/lualib/snax/hotfix.lua @@ -1,4 +1,4 @@ -local si = require "snax_interface" +local si = require "snax.interface" local io = io local hotfix = {} diff --git a/lualib/snax_interface.lua b/lualib/snax/interface.lua similarity index 100% rename from lualib/snax_interface.lua rename to lualib/snax/interface.lua diff --git a/service/launcher.lua b/service/launcher.lua index e51f8833..c6ed0c4c 100644 --- a/service/launcher.lua +++ b/service/launcher.lua @@ -2,8 +2,8 @@ local skynet = require "skynet" local string = string local services = {} - local command = {} +local instance = {} -- for confirm (function command.LAUNCH / command.ERROR / command.LAUNCHOK) local function handle_to_address(handle) return tonumber("0x" .. string.sub(handle , 2)) @@ -28,7 +28,7 @@ function command.STAT() return list end -function command.INFO(handle) +function command.INFO(_, _, handle) handle = handle_to_address(handle) if services[handle] == nil then return @@ -38,7 +38,7 @@ function command.INFO(handle) end end -function command.KILL(handle) +function command.KILL(_, _, handle) handle = handle_to_address(handle) skynet.kill(handle) local ret = { [skynet.address(handle)] = tostring(services[handle]) } @@ -62,48 +62,71 @@ function command.GC() return command.MEM() end -function command.REMOVE(handle) +function command.REMOVE(_,_, handle) services[handle] = nil -- don't return (skynet.ret) because the handle may exit return NORET end -local instance = {} - -skynet.dispatch("text" , function(session, address , cmd) - if cmd == "" then - -- init notice - local reply = instance[address] - if reply then - skynet.redirect(reply.address , 0, "response", reply.session, skynet.address(address)) - instance[address] = nil - end - elseif cmd == "ERROR" then - -- see serivce-src/service_lua.c - -- init failed - local reply = instance[address] - if reply then - skynet.redirect(reply.address , 0, "response", reply.session, "") - instance[address] = nil - end +function command.LAUNCH(address, session, service, ...) + local param = table.concat({...}, " ") + local inst = skynet.launch(service, param) + if inst then + services[inst] = service .. " " .. param + instance[inst] = { session = session, address = address } else - -- launch request - local service, param = string.match(cmd,"([^ ]+) (.*)") - local inst = skynet.launch(service, param) - if inst then - services[inst] = cmd - instance[inst] = { session = session, address = address } - else - skynet.ret("") - end + skynet.ret("") -- launch failed end -end) + return NORET +end + +function command.ERROR(address) + -- see serivce-src/service_lua.c + -- init failed + local reply = instance[address] + if reply then + skynet.redirect(reply.address , 0, "response", reply.session, "") + instance[address] = nil + end + + return NORET +end + +function command.LAUNCHOK(address) + -- init notice + local reply = instance[address] + if reply then + skynet.redirect(reply.address , 0, "response", reply.session, skynet.address(address)) + instance[address] = nil + end + + return NORET +end + +-- for historical reasons, launcher support text command (for C service) + +skynet.register_protocol { + name = "text", + id = skynet.PTYPE_TEXT, + unpack = skynet.tostring, + dispatch = function(session, address , cmd) + if cmd == "" then + command.LAUNCHOK(address) + elseif cmd == "ERROR" then + command.ERROR(address) + else + -- launch request + local service, param = string.match(cmd,"([^ ]+) (.*)") + command.LAUNCH(address, session, service, param) + end + end, +} skynet.dispatch("lua", function(session, address, cmd , ...) cmd = string.upper(cmd) local f = command[cmd] if f then - local ret = f(...) + local ret = f(address, session, ...) if ret ~= NORET then skynet.ret(skynet.pack(ret)) end diff --git a/service/snaxd.lua b/service/snaxd.lua index b7e1a359..de41d6c3 100644 --- a/service/snaxd.lua +++ b/service/snaxd.lua @@ -1,6 +1,6 @@ local skynet = require "skynet" local c = require "skynet.c" -local snax_interface = require "snax_interface" +local snax_interface = require "snax.interface" local profile = require "profile" local snax = require "snax" @@ -21,8 +21,10 @@ local function update_stat(name, ti) t.time = t.time + ti end +local traceback = debug.traceback + local function do_func(f, msg) - return pcall(f, table.unpack(msg)) + return xpcall(f, traceback, table.unpack(msg)) end local function dispatch(f, ...) @@ -42,7 +44,7 @@ local function message_dispatch() if method[2] == "accept" then -- no return profile.start() - local ok, data = pcall(f, table.unpack(msg)) + local ok, data = xpcall(f, traceback, table.unpack(msg)) local ti = profile.stop() update_stat(method[3], ti) if not ok then @@ -50,7 +52,7 @@ local function message_dispatch() end else profile.start() - local ok, data, size = pcall(dispatch, f, table.unpack(msg)) + local ok, data, size = xpcall(dispatch, traceback, f, table.unpack(msg)) local ti = profile.stop() update_stat(method[3], ti) if ok then @@ -89,9 +91,9 @@ local function timing( method, ... ) profile.start() if method[2] == "accept" then -- no return - err,msg = pcall(method[4], ...) + err,msg = xpcall(method[4], traceback, ...) else - err,msg = pcall(return_f, method[4], ...) + err,msg = xpcall(return_f, traceback, method[4], ...) end local ti = profile.stop() update_stat(method[3], ti) @@ -105,7 +107,7 @@ skynet.start(function() if method[2] == "system" then local command = method[3] if command == "hotfix" then - local hotfix = require "snax_hotfix" + local hotfix = require "snax.hotfix" skynet.ret(skynet.pack(hotfix(func, ...))) elseif command == "init" then assert(not init, "Already init")