You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
91 lines
2.2 KiB
Lua
91 lines
2.2 KiB
Lua
local skynet = require "skynet"
|
|
local c = require "skynet.core"
|
|
local snax_interface = require "snax.interface"
|
|
local profile = require "skynet.profile"
|
|
local snax = require "skynet.snax"
|
|
|
|
local snax_name = tostring(...)
|
|
local loaderpath = skynet.getenv"snax_loader"
|
|
local loader = loaderpath and assert(dofile(loaderpath))
|
|
local func, pattern = snax_interface(snax_name, _ENV, loader)
|
|
local snax_path = pattern:sub(1,pattern:find("?", 1, true)-1) .. snax_name .. "/"
|
|
package.path = snax_path .. "?.lua;" .. package.path
|
|
|
|
SERVICE_NAME = snax_name
|
|
SERVICE_PATH = snax_path
|
|
|
|
local profile_table = {}
|
|
|
|
local function update_stat(name, ti)
|
|
local t = profile_table[name]
|
|
if t == nil then
|
|
t = { count = 0, time = 0 }
|
|
profile_table[name] = t
|
|
end
|
|
t.count = t.count + 1
|
|
t.time = t.time + ti
|
|
end
|
|
|
|
local traceback = debug.traceback
|
|
|
|
local function return_f(f, ...)
|
|
return skynet.ret(skynet.pack(f(...)))
|
|
end
|
|
|
|
local function timing( method, ... )
|
|
local err, msg
|
|
profile.start()
|
|
if method[2] == "accept" then
|
|
-- no return
|
|
err,msg = xpcall(method[4], traceback, ...)
|
|
else
|
|
err,msg = xpcall(return_f, traceback, method[4], ...)
|
|
end
|
|
local ti = profile.stop()
|
|
update_stat(method[3], ti)
|
|
assert(err,msg)
|
|
end
|
|
|
|
skynet.start(function()
|
|
local init = false
|
|
local function dispatcher( session , source , id, ...)
|
|
local method = func[id]
|
|
|
|
if method[2] == "system" then
|
|
local command = method[3]
|
|
if command == "hotfix" then
|
|
local hotfix = require "snax.hotfix"
|
|
skynet.ret(skynet.pack(hotfix(func, ...)))
|
|
elseif command == "profile" then
|
|
skynet.ret(skynet.pack(profile_table))
|
|
elseif command == "init" then
|
|
assert(not init, "Already init")
|
|
local initfunc = method[4] or function() end
|
|
initfunc(...)
|
|
skynet.ret()
|
|
skynet.info_func(function()
|
|
return profile_table
|
|
end)
|
|
init = true
|
|
else
|
|
assert(init, "Never init")
|
|
assert(command == "exit")
|
|
local exitfunc = method[4] or function() end
|
|
exitfunc(...)
|
|
skynet.ret()
|
|
init = false
|
|
skynet.exit()
|
|
end
|
|
else
|
|
assert(init, "Init first")
|
|
timing(method, ...)
|
|
end
|
|
end
|
|
skynet.dispatch("snax", dispatcher)
|
|
|
|
-- set lua dispatcher
|
|
function snax.enablecluster()
|
|
skynet.dispatch("lua", dispatcher)
|
|
end
|
|
end)
|