From 4f55ed14d33cfefd661245e4effd17a275be0082 Mon Sep 17 00:00:00 2001 From: Marco Costalba Date: Thu, 15 Aug 2013 09:36:26 +0200 Subject: [PATCH] Revert using exceptions Due to crashes. It will be reapplied once we understand what's happening. No functional change. --- src/Makefile | 2 +- src/search.cpp | 52 ++++++++++++++++++++++---------------------------- 2 files changed, 24 insertions(+), 30 deletions(-) diff --git a/src/Makefile b/src/Makefile index 91286988..f8d65ccb 100644 --- a/src/Makefile +++ b/src/Makefile @@ -232,7 +232,7 @@ ifeq ($(COMP),clang) endif ### 3.2 General compiler settings -CXXFLAGS = -Wall -Wcast-qual -fno-rtti $(EXTRACXXFLAGS) +CXXFLAGS = -Wall -Wcast-qual -fno-exceptions -fno-rtti $(EXTRACXXFLAGS) ifeq ($(comp),gcc) CXXFLAGS += -ansi -pedantic -Wno-long-long -Wextra -Wshadow diff --git a/src/search.cpp b/src/search.cpp index 89ddfef6..9143f669 100644 --- a/src/search.cpp +++ b/src/search.cpp @@ -21,7 +21,6 @@ #include #include #include -#include #include #include @@ -105,8 +104,6 @@ namespace { bool refutes(const Position& pos, Move first, Move second); string uci_pv(const Position& pos, int depth, Value alpha, Value beta); - class stop : public std::exception {}; - struct Skill { Skill(int l) : level(l), best(MOVE_NONE) {} ~Skill() { @@ -359,9 +356,7 @@ namespace { // research with bigger window until not failing high/low anymore. while (true) { - try { - bestValue = search(pos, ss, alpha, beta, depth * ONE_PLY, false); - } catch (stop&) {} + bestValue = search(pos, ss, alpha, beta, depth * ONE_PLY, false); // Bring to front the best move. It is critical that sorting is // done with a stable algorithm because all the values but the first @@ -546,13 +541,10 @@ namespace { if (PvNode && thisThread->maxPly < ss->ply) thisThread->maxPly = ss->ply; - if (Signals.stop || thisThread->cutoff_occurred()) - throw stop(); - if (!RootNode) { // Step 2. Check for aborted search and immediate draw - if (pos.is_draw() || ss->ply > MAX_PLY) + if (Signals.stop || pos.is_draw() || ss->ply > MAX_PLY) return DrawValue[pos.side_to_move()]; // Step 3. Mate distance pruning. Even if we mate at the next move our score @@ -1007,6 +999,13 @@ moves_loop: // When in check and at SpNode search starts from here alpha = splitPoint->alpha; } + // Finished searching the move. If Signals.stop is true, the search + // was aborted because the user interrupted the search or because we + // ran out of time. In this case, the return value of the search cannot + // be trusted, and we don't update the best move and/or PV. + if (Signals.stop || thisThread->cutoff_occurred()) + return value; // To avoid returning VALUE_INFINITE + if (RootNode) { RootMove& rm = *std::find(RootMoves.begin(), RootMoves.end(), move); @@ -1697,27 +1696,22 @@ void Thread::idle_loop() { activePosition = &pos; - try { - switch (sp->nodeType) { - case Root: - search(pos, ss, sp->alpha, sp->beta, sp->depth, sp->cutNode); - break; - case PV: - search(pos, ss, sp->alpha, sp->beta, sp->depth, sp->cutNode); - break; - case NonPV: - search(pos, ss, sp->alpha, sp->beta, sp->depth, sp->cutNode); - break; - default: - assert(false); - } - - assert(searching); - } - catch (stop&) { - sp->mutex.lock(); // Exception is thrown out of lock + switch (sp->nodeType) { + case Root: + search(pos, ss, sp->alpha, sp->beta, sp->depth, sp->cutNode); + break; + case PV: + search(pos, ss, sp->alpha, sp->beta, sp->depth, sp->cutNode); + break; + case NonPV: + search(pos, ss, sp->alpha, sp->beta, sp->depth, sp->cutNode); + break; + default: + assert(false); } + assert(searching); + searching = false; activePosition = NULL; sp->slavesMask &= ~(1ULL << idx); -- 2.39.2