From 68a952ff1739ed1c9bc1347ae294830d3b2e6206 Mon Sep 17 00:00:00 2001 From: Cloud Wu Date: Tue, 29 Jul 2014 21:22:49 +0800 Subject: [PATCH] bugfix: update until delete --- examples/share.lua | 15 ++++++++++++--- lualib/sharedata.lua | 11 +++++++++-- service/sharedatad.lua | 9 ++++++++- 3 files changed, 29 insertions(+), 6 deletions(-) diff --git a/examples/share.lua b/examples/share.lua index 2c81f790..ec94ead8 100644 --- a/examples/share.lua +++ b/examples/share.lua @@ -10,9 +10,15 @@ skynet.start(function() sharedata.new("foobar", { a=1, b= { "hello", "world" } }) skynet.fork(function() - skynet.sleep(300) -- sleep 3s + skynet.sleep(200) -- sleep 3s skynet.error("update foobar") sharedata.update("foobar", { a =2 }) + skynet.sleep(200) -- sleep 3s + skynet.error("update foobar") + sharedata.update("foobar", { a = 3, b = { "change" } }) + skynet.sleep(100) + skynet.error("delete foobar") + sharedata.delete "foobar" end) end) @@ -47,6 +53,11 @@ skynet.start(function() skynet.error(err) end + -- obj. b is not the same with local b + for k,v in ipairs(obj.b) do + skynet.error(string.format("b[%d] = %s", k , tostring(v))) + end + collectgarbage() skynet.error("sleep") skynet.sleep(100) @@ -55,8 +66,6 @@ skynet.start(function() skynet.error("sleep") skynet.sleep(100) - sharedata.delete "foobar" - skynet.exit() end) diff --git a/lualib/sharedata.lua b/lualib/sharedata.lua index edbf61c5..a5fbc115 100644 --- a/lualib/sharedata.lua +++ b/lualib/sharedata.lua @@ -10,8 +10,15 @@ end) local sharedata = {} local function monitor(name, obj, cobj) - local newobj = skynet.call(service, "lua", "monitor", name, cobj) - sd.update(obj, newobj) + local newobj = cobj + while true do + newobj = skynet.call(service, "lua", "monitor", name, newobj) + if newobj == nil then + return + end + sd.update(obj, newobj) + end + print("name exit") end function sharedata.query(name) diff --git a/service/sharedatad.lua b/service/sharedatad.lua index 7ce24b89..8733d59c 100644 --- a/service/sharedatad.lua +++ b/service/sharedatad.lua @@ -56,6 +56,11 @@ function CMD.delete(name) assert(objmap[v.obj]) objmap[v.obj] = true sharedata.host.decref(v.obj) + for _,v in ipairs(v.watch) do + local session = v[1] + local address = v[2] + skynet.redirect(address, 0, "response", session, skynet.pack(nil)) + end end function CMD.query(name) @@ -78,7 +83,9 @@ function CMD.update(name, t) if v then watch = v.watch oldcobj = v.obj - CMD.delete(name) + objmap[oldcobj] = true + sharedata.host.decref(oldcobj) + pool[name] = nil end CMD.new(name, t) local newobj = pool[name].obj