Browse Source

Fix potential data race if two threads attempt to select bonuses with
different durations

Ivan Savenko 1 year ago
parent
commit
1ac98e305f
2 changed files with 20 additions and 17 deletions
  1. 9 2
      lib/bonuses/BonusSelector.cpp
  2. 11 15
      lib/bonuses/BonusSelector.h

+ 9 - 2
lib/bonuses/BonusSelector.cpp

@@ -51,8 +51,15 @@ namespace Selector
 		return seffectRange;
 	}
 
-	DLL_LINKAGE CWillLastTurns turns;
-	DLL_LINKAGE CWillLastDays days;
+	DLL_LINKAGE CWillLastTurns turns(int turns)
+	{
+		return CWillLastTurns(turns);
+	}
+
+	DLL_LINKAGE CWillLastDays days(int days)
+	{
+		return CWillLastDays(days);
+	}
 
 	CSelector DLL_LINKAGE typeSubtype(BonusType Type, BonusSubtypeID Subtype)
 	{

+ 11 - 15
lib/bonuses/BonusSelector.h

@@ -81,8 +81,11 @@ public:
 
 class DLL_LINKAGE CWillLastTurns
 {
-public:
 	int turnsRequested;
+public:
+	CWillLastTurns(int turnsRequested):
+		turnsRequested(turnsRequested)
+	{}
 
 	bool operator()(const Bonus *bonus) const
 	{
@@ -90,18 +93,17 @@ public:
 			|| !Bonus::NTurns(bonus) //so do every not expriing after N-turns effect
 			|| bonus->turnsRemain > turnsRequested;
 	}
-	CWillLastTurns& operator()(const int &setVal)
-	{
-		turnsRequested = setVal;
-		return *this;
-	}
 };
 
 class DLL_LINKAGE CWillLastDays
 {
-public:
 	int daysRequested;
 
+public:
+	CWillLastDays(int daysRequested):
+		daysRequested(daysRequested)
+	{}
+
 	bool operator()(const Bonus *bonus) const
 	{
 		if(daysRequested <= 0 || Bonus::Permanent(bonus) || Bonus::OneBattle(bonus))
@@ -112,14 +114,8 @@ public:
 		{
 			return bonus->turnsRemain > daysRequested;
 		}
-
 		return false; // TODO: ONE_WEEK need support for turnsRemain, but for now we'll exclude all unhandled durations
 	}
-	CWillLastDays& operator()(const int &setVal)
-	{
-		daysRequested = setVal;
-		return *this;
-	}
 };
 
 
@@ -131,8 +127,8 @@ namespace Selector
 	extern DLL_LINKAGE const CSelectFieldEqual<BonusSource> & sourceType();
 	extern DLL_LINKAGE const CSelectFieldEqual<BonusSource> & targetSourceType();
 	extern DLL_LINKAGE const CSelectFieldEqual<BonusLimitEffect> & effectRange();
-	extern DLL_LINKAGE CWillLastTurns turns;
-	extern DLL_LINKAGE CWillLastDays days;
+	CWillLastTurns DLL_LINKAGE turns(int turns);
+	CWillLastDays DLL_LINKAGE days(int days);
 
 	CSelector DLL_LINKAGE typeSubtype(BonusType Type, BonusSubtypeID Subtype);
 	CSelector DLL_LINKAGE typeSubtypeInfo(BonusType type, BonusSubtypeID subtype, const CAddInfo & info);