From cd3391461cad04b3303a352b3f01e0e3db3475af Mon Sep 17 00:00:00 2001 From: Cloud Wu Date: Wed, 22 Apr 2015 16:50:20 +0800 Subject: [PATCH] add skynet.pcall for hotfix use (call a function with require) --- examples/cluster1.lua | 3 +++ examples/cluster2.lua | 1 + examples/clustername.lua | 1 + lualib/skynet.lua | 12 +++++++++--- lualib/skynet/debug.lua | 2 +- lualib/skynet/inject.lua | 4 ++-- service/sharedatad.lua | 2 +- 7 files changed, 18 insertions(+), 7 deletions(-) diff --git a/examples/cluster1.lua b/examples/cluster1.lua index 6bb3b68d..27c00371 100644 --- a/examples/cluster1.lua +++ b/examples/cluster1.lua @@ -5,6 +5,9 @@ skynet.start(function() local sdb = skynet.newservice("simpledb") skynet.name(".simpledb", sdb) print(skynet.call(".simpledb", "lua", "SET", "a", "foobar")) + print(skynet.call(".simpledb", "lua", "SET", "b", "foobar2")) print(skynet.call(".simpledb", "lua", "GET", "a")) + print(skynet.call(".simpledb", "lua", "GET", "b")) cluster.open "db" + cluster.open "db2" end) diff --git a/examples/cluster2.lua b/examples/cluster2.lua index a49aa718..7b315e1a 100644 --- a/examples/cluster2.lua +++ b/examples/cluster2.lua @@ -5,4 +5,5 @@ skynet.start(function() local proxy = cluster.proxy("db", ".simpledb") print(skynet.call(proxy, "lua", "GET", "a")) print(cluster.call("db", ".simpledb", "GET", "a")) + print(cluster.call("db2", ".simpledb", "GET", "b")) end) diff --git a/examples/clustername.lua b/examples/clustername.lua index c5ed5e69..681245a1 100644 --- a/examples/clustername.lua +++ b/examples/clustername.lua @@ -1 +1,2 @@ db = "127.0.0.1:2528" +db2 = "127.0.0.1:2529" diff --git a/lualib/skynet.lua b/lualib/skynet.lua index 481a2321..d3cb623d 100644 --- a/lualib/skynet.lua +++ b/lualib/skynet.lua @@ -620,8 +620,10 @@ end local function init_all() local funcs = init_func init_func = nil - for k,v in pairs(funcs) do - v() + if funcs then + for k,v in pairs(funcs) do + v() + end end end @@ -632,8 +634,12 @@ local function init_template(start) init_all() end +function skynet.pcall(start) + return xpcall(init_template, debug.traceback, start) +end + local function init_service(start) - local ok, err = xpcall(init_template, debug.traceback, start) + local ok, err = skynet.pcall(start) if not ok then skynet.error("init service failed: " .. tostring(err)) skynet.send(".launcher","lua", "ERROR") diff --git a/lualib/skynet/debug.lua b/lualib/skynet/debug.lua index 0ef6dcb8..0bcb8edb 100644 --- a/lualib/skynet/debug.lua +++ b/lualib/skynet/debug.lua @@ -49,7 +49,7 @@ end function dbgcmd.RUN(source, filename) local inject = require "skynet.inject" - local output = inject(source, filename , export.dispatch, skynet.register_protocol) + local output = inject(skynet, source, filename , export.dispatch, skynet.register_protocol) collectgarbage "collect" skynet.ret(skynet.pack(table.concat(output, "\n"))) end diff --git a/lualib/skynet/inject.lua b/lualib/skynet/inject.lua index 68e3954b..3c945ffe 100644 --- a/lualib/skynet/inject.lua +++ b/lualib/skynet/inject.lua @@ -18,7 +18,7 @@ local function getupvaluetable(u, func, unique) end end -return function(source, filename , ...) +return function(skynet, source, filename , ...) if filename then filename = "@" .. filename else @@ -56,7 +56,7 @@ return function(source, filename , ...) if not func then return { err } end - local ok, err = xpcall(func, debug.traceback) + local ok, err = skynet.pcall(func) if not ok then table.insert(output, err) end diff --git a/service/sharedatad.lua b/service/sharedatad.lua index 191bab5d..a7e8d427 100644 --- a/service/sharedatad.lua +++ b/service/sharedatad.lua @@ -44,7 +44,7 @@ function CMD.new(name, t) elseif dt == "string" then value = setmetatable({}, env_mt) local f = load(t, "=" .. name, "t", value) - f() + assert(skynet.pcall(f)) setmetatable(value, nil) elseif dt == "nil" then value = {}