逻辑bug优化
This commit is contained in:
parent
9f28bf39e4
commit
53e1cc8eaa
@ -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()
|
||||||
|
|||||||
@ -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 <- ©Log:
|
||||||
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 <- ©Log:
|
||||||
default:
|
default:
|
||||||
// 放不下就直接丢弃
|
// 放不下就直接丢弃
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user