local skynet = require "skynet" local service = {} local cache = {} local provider local function get_provider() provider = provider or skynet.uniqueservice "service_provider" return provider end local function check(func) local info = debug.getinfo(func, "u") assert(info.nups == 1) assert(debug.getupvalue(func,1) == "_ENV") end function service.new(name, mainfunc, ...) local p = get_provider() local addr, booting = skynet.call(p, "lua", "test", name) local address if addr then address = addr else if booting then address = skynet.call(p, "lua", "query", name) else check(mainfunc) local code = string.dump(mainfunc) address = skynet.call(p, "lua", "launch", name, code, ...) end end cache[name] = address return address end function service.query(name) if not cache[name] then cache[name] = skynet.call(get_provider(), "lua", "query", name) end return cache[name] end return service data.update(name, v, ...) skynet.call(service, "lua", "update", name, v, ...) end function sharedata.delete(name) skynet.call(service, "lua", "delete", name) end function sharedata.flush() for name, obj in pairs(cache) do sd.flush(obj) end collectgarbage() end function sharedata.deepcopy(name, ...) if cache[name] then local cobj = cache[name].__obj return sd.copy(cobj, ...) end local cobj = skynet.call(service, "lua", "query", name) local ret = sd.copy(cobj, ...) skynet.send(service, "lua", "confirm" , cobj) return ret end return sharedata