Merge pull request #509 from dpull/master

重新设计debug.lua接口
This commit is contained in:
云风
2016-06-12 16:41:18 +08:00
committed by GitHub
2 changed files with 97 additions and 88 deletions

View File

@@ -663,7 +663,7 @@ end
-- Inject internal debug framework -- Inject internal debug framework
local debug = require "skynet.debug" local debug = require "skynet.debug"
debug(skynet, { debug.init(skynet, {
dispatch = skynet.dispatch_message, dispatch = skynet.dispatch_message,
suspend = suspend, suspend = suspend,
}) })

View File

@@ -1,96 +1,105 @@
local table = table local table = table
local extern_dbgcmd = {}; local extern_dbgcmd = {}
return function (skynet, export) local function init(skynet, export)
local internal_info_func
local internal_info_func function skynet.info_func(func)
function skynet.info_func(func)
internal_info_func = func internal_info_func = func
end end
local dbgcmd local dbgcmd
local function init_dbgcmd() local function init_dbgcmd()
dbgcmd = extern_dbgcmd dbgcmd = {}
function dbgcmd.MEM() function dbgcmd.MEM()
local kb, bytes = collectgarbage "count" local kb, bytes = collectgarbage "count"
skynet.ret(skynet.pack(kb,bytes)) skynet.ret(skynet.pack(kb,bytes))
end end
function dbgcmd.GC()
function dbgcmd.GC()
collectgarbage "collect" collectgarbage "collect"
end end
function dbgcmd.STAT() function dbgcmd.STAT()
local stat = {} local stat = {}
stat.mqlen = skynet.mqlen() stat.mqlen = skynet.mqlen()
stat.task = skynet.task() stat.task = skynet.task()
skynet.ret(skynet.pack(stat)) skynet.ret(skynet.pack(stat))
end end
function dbgcmd.TASK() function dbgcmd.TASK()
local task = {} local task = {}
skynet.task(task) skynet.task(task)
skynet.ret(skynet.pack(task)) skynet.ret(skynet.pack(task))
end end
function dbgcmd.INFO(...) function dbgcmd.INFO(...)
if internal_info_func then if internal_info_func then
skynet.ret(skynet.pack(internal_info_func(...))) skynet.ret(skynet.pack(internal_info_func(...)))
else else
skynet.ret(skynet.pack(nil)) skynet.ret(skynet.pack(nil))
end end
end end
function dbgcmd.EXIT() function dbgcmd.EXIT()
skynet.exit() skynet.exit()
end end
function dbgcmd.RUN(source, filename) function dbgcmd.RUN(source, filename)
local inject = require "skynet.inject" local inject = require "skynet.inject"
local output = inject(skynet, source, filename , export.dispatch, skynet.register_protocol) local output = inject(skynet, source, filename , export.dispatch, skynet.register_protocol)
collectgarbage "collect" collectgarbage "collect"
skynet.ret(skynet.pack(table.concat(output, "\n"))) skynet.ret(skynet.pack(table.concat(output, "\n")))
end end
function dbgcmd.TERM(service) function dbgcmd.TERM(service)
skynet.term(service) skynet.term(service)
end end
function dbgcmd.REMOTEDEBUG(...) function dbgcmd.REMOTEDEBUG(...)
local remotedebug = require "skynet.remotedebug" local remotedebug = require "skynet.remotedebug"
remotedebug.start(export, ...) remotedebug.start(export, ...)
end end
function dbgcmd.SUPPORT(pname) function dbgcmd.SUPPORT(pname)
return skynet.ret(skynet.pack(skynet.dispatch(pname) ~= nil)) return skynet.ret(skynet.pack(skynet.dispatch(pname) ~= nil))
end end
function dbgcmd.PING() function dbgcmd.PING()
return skynet.ret() return skynet.ret()
end end
function dbgcmd.LINK() function dbgcmd.LINK()
-- no return, raise error when exit -- no return, raise error when exit
end end
return dbgcmd return dbgcmd
end -- function init_dbgcmd end -- function init_dbgcmd
local function _debug_dispatch(session, address, cmd, ...) local function _debug_dispatch(session, address, cmd, ...)
local f = (dbgcmd or init_dbgcmd())[cmd] -- lazy init dbgcmd dbgcmd = dbgcmd or init_dbgcmd() -- lazy init dbgcmd
local f = dbgcmd[cmd] or extern_dbgcmd[cmd]
assert(f, cmd) assert(f, cmd)
f(...) f(...)
end end
skynet.register_protocol { skynet.register_protocol {
name = "debug", name = "debug",
id = assert(skynet.PTYPE_DEBUG), id = assert(skynet.PTYPE_DEBUG),
pack = assert(skynet.pack), pack = assert(skynet.pack),
unpack = assert(skynet.unpack), unpack = assert(skynet.unpack),
dispatch = _debug_dispatch, dispatch = _debug_dispatch,
} }
end end
local function reg_debugcmd(name, fn)
extern_dbgcmd[name] = fn
end
return {
init = init,
reg_debugcmd = reg_debugcmd,
}