]> git.sesse.net Git - stockfish/commitdiff
Don't fear races when are harmless
authorMarco Costalba <mcostalba@gmail.com>
Sat, 8 Feb 2014 12:07:57 +0000 (13:07 +0100)
committerMarco Costalba <mcostalba@gmail.com>
Sat, 8 Feb 2014 12:07:57 +0000 (13:07 +0100)
Actually race conditions do exist in an engine, just
think for a moment to TT concurrent access. Racy code
is not a problem per se, if the consequences are well
known and correctly handled.

In case of TT access we ensure that the TT move is validated
before to be tried, here we just retry the same move in less
that 1 case out of a million: this is totally harmless considering
that very probably the second time the move is tried we get
immediately a TT hit and search quickly returns.

So we simplify the code for no harm.

No fuctional change (in single thread case)

src/movepick.cpp

index f3e094c6517c67fecc4b883e08f0d414105790ee..41b85f074ae0994a86c6615707ad03bb5be925b2 100644 (file)
@@ -233,15 +233,15 @@ void MovePicker::generate_next() {
       killers[2].move = killers[3].move = MOVE_NONE;
       killers[4].move = killers[5].move = MOVE_NONE;
 
       killers[2].move = killers[3].move = MOVE_NONE;
       killers[4].move = killers[5].move = MOVE_NONE;
 
+      // Please note that following code is racy and could yield to rare (less
+      // than 1 out of a million) duplicated entries in SMP case. This is harmless.
+
       // Be sure countermoves are different from killers
       for (int i = 0; i < 2; ++i)
           if (   countermoves[i] != (cur+0)->move
               && countermoves[i] != (cur+1)->move)
               (end++)->move = countermoves[i];
 
       // Be sure countermoves are different from killers
       for (int i = 0; i < 2; ++i)
           if (   countermoves[i] != (cur+0)->move
               && countermoves[i] != (cur+1)->move)
               (end++)->move = countermoves[i];
 
-      if (countermoves[1] && countermoves[1] == countermoves[0]) // Due to SMP races
-          killers[3].move = MOVE_NONE;
-
       // Be sure followupmoves are different from killers and countermoves
       for (int i = 0; i < 2; ++i)
           if (   followupmoves[i] != (cur+0)->move
       // Be sure followupmoves are different from killers and countermoves
       for (int i = 0; i < 2; ++i)
           if (   followupmoves[i] != (cur+0)->move
@@ -249,10 +249,6 @@ void MovePicker::generate_next() {
               && followupmoves[i] != (cur+2)->move
               && followupmoves[i] != (cur+3)->move)
               (end++)->move = followupmoves[i];
               && followupmoves[i] != (cur+2)->move
               && followupmoves[i] != (cur+3)->move)
               (end++)->move = followupmoves[i];
-
-      if (followupmoves[1] && followupmoves[1] == followupmoves[0]) // Due to SMP races
-          (--end)->move = MOVE_NONE;
-
       return;
 
   case QUIETS_1_S1:
       return;
 
   case QUIETS_1_S1: