From 437eeac1dd2057bf68c5ecf7eddffab3686edb8b Mon Sep 17 00:00:00 2001 From: hahwu <31872165+hahwu@users.noreply.github.com> Date: Tue, 24 Feb 2026 11:35:06 +0800 Subject: [PATCH] =?UTF-8?q?=E6=95=B0=E6=8D=AE=E4=BF=9D=E5=AD=98=E5=8A=A0?= =?UTF-8?q?=E9=94=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/server/game/gm_handler.go | 2 +- src/server/game/message_mgr.go | 52 +++++++++++----------------------- src/server/game/mod/msg/Msg.go | 4 +-- src/server/game/player_data.go | 4 +-- 4 files changed, 21 insertions(+), 41 deletions(-) diff --git a/src/server/game/gm_handler.go b/src/server/game/gm_handler.go index 17f12aab..fdb4335f 100644 --- a/src/server/game/gm_handler.go +++ b/src/server/game/gm_handler.go @@ -270,7 +270,7 @@ func ReqGmCommand_(player *Player, Command string) error { N: ChampshipMod.GetN(), }, End: GoUtil.ZeroTimestamp() + 86400, // 第二天零点删除 - HandleType: MsgMod.HANDLE_MDO_CHAMPSHIP_INRANK, + HandleType: MsgMod.HANDLE_MOD_CHAMPSHIP_INRANK, } SendMsgToCenterAsync(m) case "resetUserInfo": diff --git a/src/server/game/message_mgr.go b/src/server/game/message_mgr.go index c010525e..44e24183 100644 --- a/src/server/game/message_mgr.go +++ b/src/server/game/message_mgr.go @@ -26,7 +26,7 @@ type MessageMiddleware func(MessageHandlerFunc) MessageHandlerFunc var save_msg_type = []int{ msg.HANDLE_MOD_PLAYER_MSG, - msg.HANDLE_MDO_CHAMPSHIP_INRANK, + msg.HANDLE_MOD_CHAMPSHIP_INRANK, msg.HANDLE_MOD_USER_VAR_SET, } @@ -125,31 +125,6 @@ func (m *MessageMgr) MessageMgrInit() { m.Use(TimeoutMiddleware(5 * time.Second)) m.NodeRegister() m.CenterRegister() - FixBug() -} - -func FixBug() { - messageMgrData := getMessageData() - // 先更新 PlayerList(需要加锁) - G_GameLogicPtr.MessageMgr.lock.Lock() - defer G_GameLogicPtr.MessageMgr.lock.Unlock() - now := GoUtil.Now() - for k, v := range messageMgrData.MessageList { - if k < 100000 { - delete(messageMgrData.MessageList, k) - continue - } - // 反向遍历以安全删除元素 - for i := len(v.Messages) - 1; i >= 0; i-- { - if v.Messages[i].Type == msg.HANDLE_TYPE_CHAMPSHIP_NOTIFY || (v.Messages[i].End != 0 && v.Messages[i].End < now) { - // 删除消息 - v.Messages = append(v.Messages[:i], v.Messages[i+1:]...) - } - } - if len(v.Messages) == 0 { - delete(messageMgrData.MessageList, k) - } - } } // 注册处理器 @@ -168,7 +143,7 @@ func (m *MessageMgr) NodeRegister() { func (m *MessageMgr) CenterRegister() { if conf.Server.ServerType == "center" { m.RegisterHandler(msg.HANDLE_MOD_PLAYER_LOGIN, MessageHandlerFunc(PlayerLoginHandler)) - m.RegisterHandler(msg.HANDLE_MDO_PLAYER_LOGOUT, MessageHandlerFunc(PlayerLogoutHandler)) + m.RegisterHandler(msg.HANDLE_MOD_PLAYER_LOGOUT, MessageHandlerFunc(PlayerLogoutHandler)) m.RegisterHandler(msg.HANDLE_MOD_PLAYER_MSG, MessageHandlerFunc(CenterPlayerMsgHandler)) m.RegisterHandler(msg.HANDLE_MOD_COMSUME_MSG, MessageHandlerFunc(ComsumerMsgHandler)) m.RegisterHandler(msg.HANDLE_MOD_VAR_SET, MessageHandlerFunc(SetVarDataHandler)) @@ -176,7 +151,7 @@ func (m *MessageMgr) CenterRegister() { m.RegisterHandler(msg.HANDLE_MOD_USER_VAR_SET, MessageHandlerFunc(SetUserVarDataHandler)) m.RegisterHandler(msg.HANDLE_MOD_USER_VAR_GET, MessageHandlerFunc(GetUserVarDataHandler)) m.RegisterHandler(msg.HANDLE_MOD_CATNIP_PARTNER, MessageHandlerFunc(CatnipPartnerHandler)) - m.RegisterHandler(msg.HANDLE_MDO_CHAMPSHIP_INRANK, MessageHandlerFunc(ChampshipInRankHandler)) + m.RegisterHandler(msg.HANDLE_MOD_CHAMPSHIP_INRANK, MessageHandlerFunc(ChampshipInRankHandler)) m.RegisterHandler(msg.HANDLE_MOD_CHAMPSHIP_RANK_INFO, MessageHandlerFunc(ChampshipRankInfoHandler)) m.RegisterHandler(msg.HANDLE_MOD_CHAMPSHIP_RANK_LIST, MessageHandlerFunc(ChampshipRankListHandler)) m.RegisterHandler(msg.HANDLE_MOD_CHAMPSHIP_PRE_RANK, MessageHandlerFunc(ChampshipRankPreHandler)) @@ -885,9 +860,6 @@ func sendMessageSync(m *msg.Msg, node int) (*msg.Msg, error) { // 保存消息到本地 func saveMessage(m *msg.Msg) error { - G_GameLogicPtr.MessageMgr.lock.Lock() - defer G_GameLogicPtr.MessageMgr.lock.Unlock() - // 使用不加锁的内部方法,避免死锁 messages := getMessgeUnsafe(int64(m.To)) messages.mu.Lock() defer messages.mu.Unlock() @@ -944,7 +916,6 @@ func deleteMessage(m *msg.Msg) error { } messages := getMessge(int64(m.To)) messages.mu.Lock() - defer messages.mu.Unlock() // 使用更安全的方式删除元素:找到索引后再删除,避免在range中修改切片 foundIndex := -1 @@ -965,12 +936,21 @@ func deleteMessage(m *msg.Msg) error { messages.Messages[len(messages.Messages)-1] = nil // 清除最后一个元素的引用 messages.Messages = messages.Messages[:len(messages.Messages)-1] } - if len(messages.Messages) == 0 { + + shouldDelete := len(messages.Messages) == 0 + messages.mu.Unlock() // 先释放 messages.mu 锁,避免死锁 + + if shouldDelete { // 如果消息列表为空,则删除该玩家的消息列表 messageMgrData := getMessageData() - G_GameLogicPtr.MessageMgr.lock.Lock() - defer G_GameLogicPtr.MessageMgr.lock.Unlock() - delete(messageMgrData.MessageList, int64(m.To)) + // 双重检查:再次确认消息列表是否为空(防止在锁释放期间有新消息添加) + if list, ok := messageMgrData.MessageList[int64(m.To)]; ok { + list.mu.Lock() + if len(list.Messages) == 0 { + delete(messageMgrData.MessageList, int64(m.To)) + } + list.mu.Unlock() + } } return nil } diff --git a/src/server/game/mod/msg/Msg.go b/src/server/game/mod/msg/Msg.go index ad79e4e5..1d9681a2 100644 --- a/src/server/game/mod/msg/Msg.go +++ b/src/server/game/mod/msg/Msg.go @@ -41,14 +41,14 @@ const ( HANDLE_MOD_PLAYER_LOGIN = 20003 // 玩家登录消息 HANDLE_MOD_COMSUME_MSG = 20004 // 消费消息 HANDLE_MOD_CLUSTER_SYNC = 20005 // 集群同步消息 - HANDLE_MDO_PLAYER_LOGOUT = 20006 // 玩家登出消息 + HANDLE_MOD_PLAYER_LOGOUT = 20006 // 玩家登出消息 HANDLE_MOD_VAR_GET = 20007 // 获取变量 HANDLE_MOD_VAR_SET = 20008 // 设置变量 HANDLE_MOD_CATNIP_PARTNER = 20009 // 猫薄荷伙伴 HANDLE_MOD_USER_VAR_GET = 20010 // 获取玩家变量 HANDLE_MOD_USER_VAR_SET = 20011 // 设置玩家变量 HANDLE_MOD_REPLY_PLAYER_MSG = 20012 // 回复玩家消息 - HANDLE_MDO_CHAMPSHIP_INRANK = 20013 // 锦标赛入榜 + HANDLE_MOD_CHAMPSHIP_INRANK = 20013 // 锦标赛入榜 HANDLE_MOD_CHAMPSHIP_RANK_INFO = 20014 // 锦标赛排名信息 HANDLE_MOD_CHAMPSHIP_RANK_LIST = 20015 // 锦标赛排行榜 HANDLE_MOD_CHAMPSHIP_PRE_RANK = 20016 // 锦标赛上期排名 diff --git a/src/server/game/player_data.go b/src/server/game/player_data.go index 1fe85f8c..969d0799 100644 --- a/src/server/game/player_data.go +++ b/src/server/game/player_data.go @@ -473,7 +473,7 @@ func (p *Player) ClearData() { G_GameLogicPtr.DelPlayer(p) SendMsgToCenterAsync(&MsgMod.Msg{ From: Uid, - HandleType: MsgMod.HANDLE_MDO_PLAYER_LOGOUT, + HandleType: MsgMod.HANDLE_MOD_PLAYER_LOGOUT, }) } @@ -1043,7 +1043,7 @@ func (p *Player) HandleInChampshipRank() { N: ChampshipMod.GetN(), }, End: GoUtil.ZeroTimestamp() + 86400, // 第二天零点删除 - HandleType: MsgMod.HANDLE_MDO_CHAMPSHIP_INRANK, + HandleType: MsgMod.HANDLE_MOD_CHAMPSHIP_INRANK, } SendMsgToCenterAsync(m) }