Skip to content

Instantly share code, notes, and snippets.

@hanxi
Created August 26, 2013 06:35
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save hanxi/6338589 to your computer and use it in GitHub Desktop.
Save hanxi/6338589 to your computer and use it in GitHub Desktop.
单消息多处理函数的实现.注册消息处理函数时可提供优先执行函数列表(即在优先执行函数列表中的函数先于正在注册的函数).
--[[=============================================================================
# FileName: HXProtHandler.lua
# Desc: 单个消息多个处理函数带有优先级的实现
# Author: hanxi
# Email: hanxi.com@gmail.com
# HomePage: http://hanxi.cnblogs.com
# Version: 0.0.1
# LastChange: 2013-08-26 11:42:37
# History: 添加优先级冲突检测
=============================================================================]]
-- 全局变量
-- _GProtFuncName2Func = { -- 绑定函数名和函数
-- funcName1 = func1,
-- funcName2 = func2,
-- }
-- _GProtHandlers = { -- 绑定协议号和函数名
-- [protId] = { -- key为函数名,preFuncNames为优先执行函数名组
-- funcName1 = preFuncNames,
-- funcName2 = preFuncNames,
-- }
-- }
-- preFuncNames = { -- 收到消息时,优先执行下面的函数
-- preFuncName1,preFuncName2,
-- }
-- 按优先级排序后的handler函数
-- _GProtHandlersForExec = {
-- [protId] = {func1,func2}
-- }
function log (...)
print(...)
end
-- @param:protId -- 协议Id
-- @param:func -- 注册函数
-- @param:funcName -- 注册函数名
-- @param:preFuncNames -- 优先执行函数名组
function HXProtRegHandler(protId,func,funcName,preFuncNames)
if not protId or type(func)~="function" or type(funcName)~="string" then
error("HXProtRegHandler 参数错误")
return -1
end
if not preFuncNames then
preFuncNames = {}
end
if not _GProtHandlers then
_GProtHandlers={}
end
if not _GProtHandlers[protId] then
_GProtHandlers[protId]={}
end
_GProtHandlers[protId][funcName] = preFuncNames
if not _GProtFuncName2Func then
_GProtFuncName2Func = {}
end
_GProtFuncName2Func[funcName] = func
if type(_GProtHandlersForExec)=="table" then
-- 用于热更新的时候,重置_GProtHandlersForExec
_GProtHandlersForExec[protId] = nil
end
end
-- 查找表中是否存在value
function table.find(tab, value)
for k,v in pairs(tab) do
if v==value then
return k
end
end
return -1
end
-- 查找表中所有存在的value
function table.findall(tab, value)
local result = {}
for k,v in pairs(tab) do
if v==value then
table.insert(result,k)
end
end
if #result==0 then
return -1
end
return result
end
-- 收到协议id为protId的消息时进入此函数处理
HXProtExecHandler = function (fd,protId,prot)
local handlers = _GProtHandlers[protId]
if not handlers then
log("ERROR: 收到为注册的协议.protId=",protId)
for k,v in pairs(prot) do
log(k,v)
end
return
end
if not _GProtHandlersForExec then
_GProtHandlersForExec = {}
end
if not _GProtHandlersForExec[protId] then
_GProtHandlersForExec[protId] = {}
for funcName,preFuncNames in pairs(handlers) do
log("["..funcName.."]")
for k,v in pairs(preFuncNames) do
log("--",v)
end
local pos = table.find(_GProtHandlersForExec[protId],funcName)
log("pos",pos,funcName)
if pos==-1 then
table.insert(_GProtHandlersForExec[protId],funcName)
pos = #_GProtHandlersForExec[protId]
end
for _,preFuncName in ipairs(preFuncNames) do
local p = table.find(_GProtHandlersForExec[protId],preFuncName)
log("p",p,preFuncName)
if p==-1 then
table.insert(_GProtHandlersForExec[protId],pos,preFuncName)
elseif p>pos then
log("优先函数处理有冲突:"..funcName..","..preFuncName)
end
end
end
end
for k,funcName in ipairs(_GProtHandlersForExec[protId]) do
local func = _GProtFuncName2Func[funcName]
if not func then
log("协议protId="..protId..",有未实现的handler函数,funcName="..funcName)
else
func(fd,prot)
end
end
end
-- test
function f1(fd,prot)
log("f1",prot)
end
-- 注册处理函数
HXProtRegHandler(1,f1,"f1",{"f2","f3"})
function f2(fd,prot)
log("f2",prot)
end
HXProtRegHandler(1,f2,"f2",{"f1"})
function f3(fd,prot)
log("f3",prot)
end
HXProtRegHandler(1,f3,"f3",{"f1","f4"})
function f4(fd,prot)
log("f4",prot)
end
HXProtRegHandler(1,f4,"f4",{"f2","f3"})
function f5(fd,prot)
log("f5",prot)
end
HXProtRegHandler(1,f5,"f5",{"f7"})
-- 假设收到消息1
HXProtExecHandler(1,1,"prot")
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment