From 0a1092f64eb9eb232094036086fc5c98ed1f3c46 Mon Sep 17 00:00:00 2001 From: Marco Costalba Date: Sat, 8 Feb 2014 13:07:57 +0100 Subject: [PATCH] Don't fear races when are harmless 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 | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/src/movepick.cpp b/src/movepick.cpp index f3e094c6..41b85f07 100644 --- a/src/movepick.cpp +++ b/src/movepick.cpp @@ -233,15 +233,15 @@ void MovePicker::generate_next() { 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]; - 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 @@ -249,10 +249,6 @@ void MovePicker::generate_next() { && 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: -- 2.39.2