12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394 |
- local skynet = require "skynet"
- local c = require "skynet.core"
- function skynet.launch(...)
- local addr = c.command("LAUNCH", table.concat({...}," "))
- if addr then
- return tonumber("0x" .. string.sub(addr , 2))
- end
- end
- function skynet.kill(name)
- if type(name) == "number" then
- skynet.send(".launcher","lua","REMOVE",name, true)
- name = skynet.address(name)
- end
- c.command("KILL",name)
- end
- function skynet.abort()
- c.command("ABORT")
- end
- local function globalname(name, handle)
- local c = string.sub(name,1,1)
- assert(c ~= ':')
- if c == '.' then
- return false
- end
- assert(#name <= 16) -- GLOBALNAME_LENGTH is 16, defined in skynet_harbor.h
- assert(tonumber(name) == nil) -- global name can't be number
- local harbor = require "skynet.harbor"
- harbor.globalname(name, handle)
- return true
- end
- function skynet.register(name)
- if not globalname(name) then
- c.command("REG", name)
- end
- end
- function skynet.name(name, handle)
- if not globalname(name, handle) then
- c.command("NAME", name .. " " .. skynet.address(handle))
- end
- end
- local dispatch_message = skynet.dispatch_message
- function skynet.forward_type(map, start_func)
- c.callback(function(ptype, msg, sz, ...)
- local prototype = map[ptype]
- if prototype then
- dispatch_message(prototype, msg, sz, ...)
- else
- local ok, err = pcall(dispatch_message, ptype, msg, sz, ...)
- c.trash(msg, sz)
- if not ok then
- error(err)
- end
- end
- end, true)
- skynet.timeout(0, function()
- skynet.init_service(start_func)
- end)
- end
- function skynet.filter(f ,start_func)
- c.callback(function(...)
- dispatch_message(f(...))
- end)
- skynet.timeout(0, function()
- skynet.init_service(start_func)
- end)
- end
- function skynet.monitor(service, query)
- local monitor
- if query then
- monitor = skynet.queryservice(true, service)
- else
- monitor = skynet.uniqueservice(true, service)
- end
- assert(monitor, "Monitor launch failed")
- c.command("MONITOR", string.format(":%08x", monitor))
- return monitor
- end
- return skynet
|