浏览代码

Fix freeze if AI initiates large number of async requests during turn

Ivan Savenko 7 月之前
父节点
当前提交
dff37ce81f
共有 2 个文件被更改,包括 8 次插入14 次删除
  1. 4 6
      AI/Nullkiller/AIGateway.cpp
  2. 4 8
      AI/VCAI/VCAI.cpp

+ 4 - 6
AI/Nullkiller/AIGateway.cpp

@@ -593,12 +593,11 @@ void AIGateway::yourTurn(QueryID queryID)
 
 	nullkiller->makingTurnInterrupption.reset();
 
-	asyncTasks->run([this]()
+	executeActionAsyncArena.enqueue(asyncTasks->defer([this]()
 	{
 		ScopedThreadName guard("NKAI::makingTurn");
 		makeTurn();
-	});
-	executeActionAsyncArena.enqueue([this](){asyncTasks->wait();});
+	}));
 }
 
 void AIGateway::heroGotLevel(const CGHeroInstance * hero, PrimarySkill pskill, std::vector<SecondarySkill> & skills, QueryID queryID)
@@ -1609,14 +1608,13 @@ void AIGateway::executeActionAsync(const std::string & description, const std::f
 	if (!asyncTasks)
 		throw std::runtime_error("Attempt to execute task on shut down AI state!");
 
-	asyncTasks->run([this, description, whatToDo]()
+	executeActionAsyncArena.enqueue(asyncTasks->defer([this, description, whatToDo]()
 	{
 		ScopedThreadName guard("NKAI::" + description);
 		SET_GLOBAL_STATE(this);
 		std::shared_lock gsLock(CGameState::mutex);
 		whatToDo();
-	});
-	executeActionAsyncArena.enqueue([this](){asyncTasks->wait();});
+	}));
 }
 
 void AIGateway::lostHero(HeroPtr h)

+ 4 - 8
AI/VCAI/VCAI.cpp

@@ -653,12 +653,11 @@ void VCAI::yourTurn(QueryID queryID)
 	status.startedTurn();
 
 	makingTurnInterrupption.reset();
-	asyncTasks->run([this]()
+	executeActionAsyncArena.enqueue(asyncTasks->defer([this]()
 	{
 		ScopedThreadName guard("VCAI::makingTurn");
 		makeTurn();
-	});
-	executeActionAsyncArena.enqueue([this](){asyncTasks->wait();});
+	}));
 }
 
 void VCAI::heroGotLevel(const CGHeroInstance * hero, PrimarySkill pskill, std::vector<SecondarySkill> & skills, QueryID queryID)
@@ -2508,19 +2507,16 @@ void VCAI::finish()
 
 void VCAI::executeActionAsync(const std::string & description, const std::function<void()> & whatToDo)
 {
-
-
 	if (!asyncTasks)
 		throw std::runtime_error("Attempt to execute task on shut down AI state!");
 
-	asyncTasks->run([this, description, whatToDo]()
+	executeActionAsyncArena.enqueue(asyncTasks->defer([this, description, whatToDo]()
 	{
 		ScopedThreadName guard("VCAI::" + description);
 		SET_GLOBAL_STATE(this);
 		std::shared_lock gsLock(CGameState::mutex);
 		whatToDo();
-	});
-	executeActionAsyncArena.enqueue([this](){asyncTasks->wait();});
+	}));
 }
 
 void VCAI::lostHero(HeroPtr h)