mirror of
https://github.com/cloudwu/skynet.git
synced 2026-07-24 20:23:06 +00:00
* skynet.init rework, See #1322 * restore init_list #1322 * xpcall init_all, See #1322
This commit is contained in:
@@ -45,4 +45,6 @@ if LUA_PRELOAD then
|
|||||||
LUA_PRELOAD = nil
|
LUA_PRELOAD = nil
|
||||||
end
|
end
|
||||||
|
|
||||||
|
_G.require = (require "skynet.require").require
|
||||||
|
|
||||||
main(select(2, table.unpack(args)))
|
main(select(2, table.unpack(args)))
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
-- read https://github.com/cloudwu/skynet/wiki/FAQ for the module "skynet.core"
|
-- read https://github.com/cloudwu/skynet/wiki/FAQ for the module "skynet.core"
|
||||||
local c = require "skynet.core"
|
local c = require "skynet.core"
|
||||||
|
local skynet_require = require "skynet.require"
|
||||||
local tostring = tostring
|
local tostring = tostring
|
||||||
local coroutine = coroutine
|
local coroutine = coroutine
|
||||||
local assert = assert
|
local assert = assert
|
||||||
@@ -925,49 +926,16 @@ do
|
|||||||
}
|
}
|
||||||
end
|
end
|
||||||
|
|
||||||
local init_func = {}
|
skynet.init = skynet_require.init
|
||||||
|
-- skynet.pcall is deprecated, use pcall directly
|
||||||
function skynet.init(f, name)
|
skynet.pcall = pcall
|
||||||
assert(type(f) == "function")
|
|
||||||
if init_func == nil then
|
|
||||||
f()
|
|
||||||
else
|
|
||||||
tinsert(init_func, f)
|
|
||||||
if name then
|
|
||||||
assert(type(name) == "string")
|
|
||||||
assert(init_func[name] == nil)
|
|
||||||
init_func[name] = f
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
local function init_all()
|
|
||||||
local funcs = init_func
|
|
||||||
init_func = nil
|
|
||||||
if funcs then
|
|
||||||
for _,f in ipairs(funcs) do
|
|
||||||
f()
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
local function ret(f, ...)
|
|
||||||
f()
|
|
||||||
return ...
|
|
||||||
end
|
|
||||||
|
|
||||||
local function init_template(start, ...)
|
|
||||||
init_all()
|
|
||||||
init_func = {}
|
|
||||||
return ret(init_all, start(...))
|
|
||||||
end
|
|
||||||
|
|
||||||
function skynet.pcall(start, ...)
|
|
||||||
return xpcall(init_template, traceback, start, ...)
|
|
||||||
end
|
|
||||||
|
|
||||||
function skynet.init_service(start)
|
function skynet.init_service(start)
|
||||||
local ok, err = skynet.pcall(start)
|
local function main()
|
||||||
|
skynet_require.init_all()
|
||||||
|
start()
|
||||||
|
end
|
||||||
|
local ok, err = xpcall(main, traceback)
|
||||||
if not ok then
|
if not ok then
|
||||||
skynet.error("init service failed: " .. tostring(err))
|
skynet.error("init service failed: " .. tostring(err))
|
||||||
skynet.send(".launcher","lua", "ERROR")
|
skynet.send(".launcher","lua", "ERROR")
|
||||||
|
|||||||
@@ -95,6 +95,6 @@ local function init()
|
|||||||
}
|
}
|
||||||
end
|
end
|
||||||
|
|
||||||
skynet.init(init, "multicast")
|
skynet.init(init)
|
||||||
|
|
||||||
return multicast
|
return multicast
|
||||||
51
lualib/skynet/require.lua
Normal file
51
lualib/skynet/require.lua
Normal file
@@ -0,0 +1,51 @@
|
|||||||
|
-- skynet module two-step initialize . When you require a skynet module :
|
||||||
|
-- 1. Run module main function as official lua module behavior.
|
||||||
|
-- 2. Run the functions register by skynet.init() during the step 1,
|
||||||
|
-- unless calling `require` in main thread .
|
||||||
|
-- If you call `require` in main thread ( service main function ), the functions
|
||||||
|
-- registered by skynet.init() do not execute immediately, they will be executed
|
||||||
|
-- by skynet.start() before start function.
|
||||||
|
|
||||||
|
local M = {}
|
||||||
|
|
||||||
|
local mainthread, ismain = coroutine.running()
|
||||||
|
assert(ismain, "skynet.require must initialize in main thread")
|
||||||
|
|
||||||
|
local context = {
|
||||||
|
[mainthread] = {},
|
||||||
|
}
|
||||||
|
|
||||||
|
do
|
||||||
|
local require = _G.require
|
||||||
|
function M.require(...)
|
||||||
|
local co, main = coroutine.running()
|
||||||
|
if main then
|
||||||
|
return require(...)
|
||||||
|
else
|
||||||
|
local old_init_list = context[co]
|
||||||
|
local init_list = {}
|
||||||
|
context[co] = init_list
|
||||||
|
local ret = require(...)
|
||||||
|
for _, f in ipairs(init_list) do
|
||||||
|
f()
|
||||||
|
end
|
||||||
|
context[co] = old_init_list
|
||||||
|
return ret
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function M.init_all()
|
||||||
|
for _, f in ipairs(context[mainthread]) do
|
||||||
|
f()
|
||||||
|
end
|
||||||
|
context[mainthread] = nil
|
||||||
|
end
|
||||||
|
|
||||||
|
function M.init(f)
|
||||||
|
assert(type(f) == "function")
|
||||||
|
local co = coroutine.running()
|
||||||
|
table.insert(context[co], f)
|
||||||
|
end
|
||||||
|
|
||||||
|
return M
|
||||||
Reference in New Issue
Block a user