change source dir

This commit is contained in:
云风
2012-08-09 15:36:56 +08:00
parent d23c4aa905
commit eed9c42fd4
46 changed files with 284 additions and 118 deletions

47
lualib/redis.lua Normal file
View File

@@ -0,0 +1,47 @@
local skynet = require "skynet"
local string = string
local table = table
local unpack = unpack
local redis = {}
local command = {}
redis.cmd = command
setmetatable(command, { __index = function(t,k)
local f = function(...)
return skynet.call(".redis", skynet.unpack, skynet.pack(k, ...))
end
t[k] = f
return f
end})
function command.EXISTS(key)
local result , exists = skynet.call(".redis", skynet.unpack, skynet.pack("EXISTS", key))
exists = exists ~= 0
return result, exists
end
local function split(cmd)
local cmds = {}
for v in string.gmatch(cmd,"[^ ]+") do
table.insert(cmds,v)
end
return unpack(cmds)
end
local function send_command(cmd, ...)
return command[cmd](...)
end
function redis.send(cmd, more, ...)
if more == nil then
send_command(split(cmd))
else
send_command(cmd, more, ...)
end
end
return redis

121
lualib/skynet.lua Normal file
View File

@@ -0,0 +1,121 @@
local c = require "skynet.c"
local tostring = tostring
local tonumber = tonumber
local coroutine = coroutine
local assert = assert
local skynet = {}
local session_id_coroutine = {}
local session_coroutine_id = {}
local session_coroutine_address = {}
local function suspend(co, result, command, param, size)
assert(result, command)
if command == "CALL" or command == "SLEEP" then
session_id_coroutine[param] = co
elseif command == "RETURN" then
local co_session = session_coroutine_id[co]
local co_address = session_coroutine_address[co]
c.send(co_address, co_session, param, size)
else
assert(command == nil, command)
session_coroutine_id[co] = nil
session_coroutine_address[co] = nil
end
end
function skynet.timeout(ti, func, ...)
local session = c.command("TIMEOUT",tostring(ti))
assert(session)
session = tonumber(session)
local co = coroutine.create(func)
assert(session_id_coroutine[session] == nil)
session_id_coroutine[session] = co
suspend(co, coroutine.resume(co, ...))
end
function skynet.yield()
local session = c.command("TIMEOUT","0")
coroutine.yield("SLEEP", tonumber(session))
end
function skynet.sleep(ti)
local session = c.command("TIMEOUT",tostring(ti))
assert(session)
coroutine.yield("SLEEP", tonumber(session))
end
function skynet.register(name)
return c.command("REG", name)
end
function skynet.self()
return c.command("REG")
end
function skynet.launch(...)
return c.command("LAUNCH", table.concat({...}," "))
end
function skynet.now()
return tonumber(c.command("NOW"))
end
function skynet.exit()
c.command("EXIT")
end
function skynet.kill(name)
c.command("KILL",name)
end
skynet.send = c.send
skynet.pack = c.pack
skynet.tostring = c.tostring
skynet.unpack = c.unpack
function skynet.call(addr, deseri , ...)
local t = type(deseri)
if t == "function" then
local session = c.send(addr, -1, ...)
return deseri(coroutine.yield("CALL", session))
else
assert(t=="string")
local session = c.send(addr, -1, deseri)
return c.tostring(coroutine.yield("CALL", session))
end
end
function skynet.ret(...)
coroutine.yield("RETURN", ...)
end
function skynet.dispatch(f)
c.callback(function(session, address , msg, sz)
if session <= 0 then
session = - session
co = coroutine.create(f)
session_coroutine_id[co] = session
session_coroutine_address[co] = address
suspend(co, coroutine.resume(co, msg, sz, session, address))
else
local co = session_id_coroutine[session]
assert(co, session)
session_id_coroutine[session] = nil
suspend(co, coroutine.resume(co, msg, sz))
end
end)
end
function skynet.start(f)
local session = c.command("TIMEOUT","0")
local co = coroutine.create(
function(...)
f(...)
skynet.send(".launcher",0)
end
)
session_id_coroutine[tonumber(session)] = co
end
return skynet