Revert using exceptions
authorMarco Costalba <mcostalba@gmail.com>
Thu, 15 Aug 2013 07:36:26 +0000 (09:36 +0200)
committerMarco Costalba <mcostalba@gmail.com>
Thu, 15 Aug 2013 07:36:26 +0000 (09:36 +0200)
Due to crashes. It will be reapplied once
we understand what's happening.

No functional change.

src/Makefile
src/search.cpp

index 9128698..f8d65cc 100644 (file)
@@ -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
index 89ddfef..9143f66 100644 (file)
@@ -21,7 +21,6 @@
 #include <cassert>
 #include <cmath>
 #include <cstring>
-#include <exception>
 #include <iostream>
 #include <sstream>
 
@@ -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<Root>(pos, ss, alpha, beta, depth * ONE_PLY, false);
-                } catch (stop&) {}
+                bestValue = search<Root>(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<SplitPointRoot>(pos, ss, sp->alpha, sp->beta, sp->depth, sp->cutNode);
-                  break;
-              case PV:
-                  search<SplitPointPV>(pos, ss, sp->alpha, sp->beta, sp->depth, sp->cutNode);
-                  break;
-              case NonPV:
-                  search<SplitPointNonPV>(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<SplitPointRoot>(pos, ss, sp->alpha, sp->beta, sp->depth, sp->cutNode);
+              break;
+          case PV:
+              search<SplitPointPV>(pos, ss, sp->alpha, sp->beta, sp->depth, sp->cutNode);
+              break;
+          case NonPV:
+              search<SplitPointNonPV>(pos, ss, sp->alpha, sp->beta, sp->depth, sp->cutNode);
+              break;
+          default:
+              assert(false);
           }
 
+          assert(searching);
+
           searching = false;
           activePosition = NULL;
           sp->slavesMask &= ~(1ULL << idx);