瀏覽代碼

Fix potential concurrenccy issues

nordsoft 2 年之前
父節點
當前提交
6226ddf4a7
共有 2 個文件被更改,包括 10 次插入0 次删除
  1. 9 0
      server/TurnTimerHandler.cpp
  2. 1 0
      server/TurnTimerHandler.h

+ 9 - 0
server/TurnTimerHandler.cpp

@@ -32,6 +32,7 @@ void TurnTimerHandler::onGameplayStart(PlayerColor player)
 	{
 		if(si->turnTimerInfo.isEnabled())
 		{
+			std::lock_guard<std::recursive_mutex> guard(mx);
 			timers[player] = si->turnTimerInfo;
 			timers[player].turnTimer = 0;
 		}
@@ -44,6 +45,7 @@ void TurnTimerHandler::onPlayerGetTurn(PlayerColor player)
 	{
 		if(si->turnTimerInfo.isEnabled())
 		{
+			std::lock_guard<std::recursive_mutex> guard(mx);
 			timers[player].baseTimer += timers[player].turnTimer;
 			timers[player].turnTimer = si->turnTimerInfo.turnTimer;
 			
@@ -66,6 +68,7 @@ void TurnTimerHandler::onPlayerMakingTurn(PlayerColor player, int waitTime)
 	
 	if(state.human && si->turnTimerInfo.isEnabled() && !gs->curB)
 	{
+		std::lock_guard<std::recursive_mutex> guard(mx);
 		if(timers[player].turnTimer > 0)
 		{
 			timers[player].turnTimer -= waitTime;
@@ -98,6 +101,8 @@ void TurnTimerHandler::onBattleStart()
 	if(!si || !gs || !gs->curB || !si->turnTimerInfo.isBattleEnabled())
 		return;
 	
+	std::lock_guard<std::recursive_mutex> guard(mx);
+
 	auto attacker = gs->curB->getSidePlayer(BattleSide::ATTACKER);
 	auto defender = gs->curB->getSidePlayer(BattleSide::DEFENDER);
 	
@@ -123,6 +128,8 @@ void TurnTimerHandler::onBattleNextStack(const CStack & stack)
 	if(!si || !gs || !gs->curB || !si->turnTimerInfo.isBattleEnabled())
 		return;
 	
+	std::lock_guard<std::recursive_mutex> guard(mx);
+	
 	auto player = stack.getOwner();
 	
 	if(!player.isValidPlayer())
@@ -145,6 +152,8 @@ void TurnTimerHandler::onBattleLoop(int waitTime)
 	if(!si || !gs || !gs->curB)
 		return;
 	
+	std::lock_guard<std::recursive_mutex> guard(mx);
+	
 	const auto * stack = gs->curB.get()->battleGetStackByID(gs->curB->getActiveStackID());
 	if(!stack || !stack->getOwner().isValidPlayer())
 		return;

+ 1 - 0
server/TurnTimerHandler.h

@@ -27,6 +27,7 @@ class TurnTimerHandler
 	const int turnTimePropagateFrequencyCrit = 1000;
 	const int turnTimePropagateThreshold = 3000;
 	std::map<PlayerColor, TurnTimerInfo> timers;
+	std::recursive_mutex mx;
 	
 public:
 	TurnTimerHandler(CGameHandler &);