逻辑bug优化

This commit is contained in:
hahwu 2026-01-09 18:07:53 +08:00
parent 8d82a2cf15
commit 6ef6006f3e
2 changed files with 23 additions and 11 deletions

View File

@ -464,6 +464,7 @@ func G_getGameLogic() *GameLogic {
G_GameLogicPtr.M_Players = sync.Map{} G_GameLogicPtr.M_Players = sync.Map{}
G_GameLogicPtr.NotInitPlayer = new(Player) G_GameLogicPtr.NotInitPlayer = new(Player)
G_GameLogicPtr.M_LimitActiveList = []int{} G_GameLogicPtr.M_LimitActiveList = []int{}
G_GameLogicPtr.CreateMessageMgr() // 创建消息管理器
G_GameLogicPtr.OpenTimestampTick() // 开启时间戳计时器 G_GameLogicPtr.OpenTimestampTick() // 开启时间戳计时器
G_GameLogicPtr.RegisterEvent() // 注册事件 G_GameLogicPtr.RegisterEvent() // 注册事件
G_GameLogicPtr.RegisterNetWorkFunc() // 注册客户端接口 G_GameLogicPtr.RegisterNetWorkFunc() // 注册客户端接口
@ -477,7 +478,6 @@ func G_getGameLogic() *GameLogic {
} }
G_GameLogicPtr.CreateRankMgr() //创建排行榜管理器 G_GameLogicPtr.CreateRankMgr() //创建排行榜管理器
G_GameLogicPtr.CreateMailMgr() //创建邮件管理器 G_GameLogicPtr.CreateMailMgr() //创建邮件管理器
G_GameLogicPtr.CreateMessageMgr() // 创建消息管理器
ClusterMgrInit() //初始化集群 ClusterMgrInit() //初始化集群
G_GameLogicPtr.StartTime = time.Now().Unix() G_GameLogicPtr.StartTime = time.Now().Unix()
// G_GameLogicPtr.CreateHttpManager() // G_GameLogicPtr.CreateHttpManager()

View File

@ -199,13 +199,25 @@ func (L *LogMgr) InitManager() {
func (L *LogMgr) AddLog(logs *Log) { func (L *LogMgr) AddLog(logs *Log) {
// 复制结构体和 Param map避免并发修改导致 json.Marshal 时 panic // 复制结构体和 Param map避免并发修改导致 json.Marshal 时 panic
copyLog := *logs copyLog := *logs
// 安全地复制 map使用 defer recover 防止并发迭代时的 panic
if logs.Param != nil { if logs.Param != nil {
func() {
defer func() {
if r := recover(); r != nil {
// 发生 panic 时使用空 map
log.Debug("AddLog: concurrent map read/write detected, using empty map")
copyLog.Param = make(map[string]interface{})
}
}()
newParam := make(map[string]interface{}, len(logs.Param)) newParam := make(map[string]interface{}, len(logs.Param))
for k, v := range logs.Param { for k, v := range logs.Param {
newParam[k] = v newParam[k] = v
} }
copyLog.Param = newParam copyLog.Param = newParam
}()
} }
// 如果已经开始关闭,直接丢弃 // 如果已经开始关闭,直接丢弃
L.Lock.Lock() L.Lock.Lock()
if L.closing { if L.closing {
@ -214,7 +226,7 @@ func (L *LogMgr) AddLog(logs *Log) {
} }
// 非阻塞入队:若通道满则先丢弃最旧一条再入队,避免阻塞调用者 // 非阻塞入队:若通道满则先丢弃最旧一条再入队,避免阻塞调用者
select { select {
case L.L <- logs: case L.L <- &copyLog:
L.Lock.Unlock() L.Lock.Unlock()
return return
default: default:
@ -225,7 +237,7 @@ func (L *LogMgr) AddLog(logs *Log) {
} }
// 再尝试入队一次 // 再尝试入队一次
select { select {
case L.L <- logs: case L.L <- &copyLog:
default: default:
// 放不下就直接丢弃 // 放不下就直接丢弃
} }