12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091 |
- 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)
|