123456789101112131415161718192021222324252627282930313233343536373839404142434445 |
- 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
|