From 5f7eb20090ccd04b2a7d439b723ed58591dcc7e8 Mon Sep 17 00:00:00 2001 From: Marco Costalba Date: Sat, 23 Jul 2011 12:52:49 +0100 Subject: [PATCH] Use a circular buffer to keep track of setup states This fixes a regression on real games due to the fact that we have some mismatches: history[st->gamePly - i] != stp->key when st->gamePly - i == 0,this is due to a nasty bug I have introduced when using std::vector<> as StateInfo backup. The point is that StateInfo keeps inside a pointer to the previous StateInfo in a kind of linked list. But when std::vector<> is resized reallocates a larger chunk of memory and moves the data there so these pointers became stale. This patch fixes the issue. No functional change. Signed-off-by: Marco Costalba --- src/uci.cpp | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/uci.cpp b/src/uci.cpp index 931891a0..813c40f7 100644 --- a/src/uci.cpp +++ b/src/uci.cpp @@ -38,8 +38,9 @@ namespace { const string StartPositionFEN = "rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1"; // Keep track of position keys along the setup moves (from start position to the - // position just before to start searching). This is needed by draw detection. - std::vector SetupState(200, StateInfo()); + // position just before to start searching). This is needed by draw detection + // where, due to 50 moves rule, we need to ckeck at most 100 plies back. + StateInfo StateRingBuf[102], *SetupState = StateRingBuf; // UCIParser is a class for parsing UCI input. The class // is actually a string stream built on a given input string. @@ -144,13 +145,14 @@ namespace { } else return; - SetupState.clear(); - // Parse move list (if any) while (up >> token && (m = move_from_uci(pos, token)) != MOVE_NONE) { - SetupState.push_back(StateInfo()); - pos.do_move(m, SetupState.back()); + pos.do_move(m, *SetupState); + + // Increment pointer to StateRingBuf circular buffer + if (++SetupState - StateRingBuf >= 102) + SetupState = StateRingBuf; } } -- 2.39.2