Make engine startup error non-fatal
authorH.G. Muller <h.g.muller@hccnet.nl>
Wed, 20 Apr 2011 08:27:20 +0000 (10:27 +0200)
committerH.G. Muller <h.g.muller@hccnet.nl>
Wed, 20 Apr 2011 20:35:16 +0000 (22:35 +0200)
When engine startup fails, do not generate a fatal error, but swicth
back to -ncp mode. Write on broken pipe errors had to be suppressed for
this.

backend.c

index 7b5d2fc..f560b2f 100644 (file)
--- a/backend.c
+++ b/backend.c
@@ -1320,6 +1320,12 @@ InitBackEnd3 P((void))
     DisplayMessage("", "");
     if (StrCaseCmp(appData.initialMode, "") == 0) {
       initialMode = BeginningOfGame;
     DisplayMessage("", "");
     if (StrCaseCmp(appData.initialMode, "") == 0) {
       initialMode = BeginningOfGame;
+      if(!appData.icsActive && appData.noChessProgram) { // [HGM] could be fall-back
+        gameMode = MachinePlaysBlack; // "Machine Black" might have been implicitly highlighted
+        ModeHighlight(); // make sure XBoard knows it is highlighted, so it will un-highlight it
+        gameMode = BeginningOfGame; // in case BeginningOfGame now means "Edit Position"
+        ModeHighlight();
+      }
     } else if (StrCaseCmp(appData.initialMode, "TwoMachines") == 0) {
       initialMode = TwoMachinesPlay;
     } else if (StrCaseCmp(appData.initialMode, "AnalyzeFile") == 0) {
     } else if (StrCaseCmp(appData.initialMode, "TwoMachines") == 0) {
       initialMode = TwoMachinesPlay;
     } else if (StrCaseCmp(appData.initialMode, "AnalyzeFile") == 0) {
@@ -7927,7 +7933,10 @@ if(appData.debugMode) fprintf(debugFP, "nodes = %d, %lld\n", (int) programStats.
        snprintf(buf1, sizeof(buf1), _("Failed to start %s chess program %s on %s: %s\n"),
                _(cps->which), cps->program, cps->host, message);
        RemoveInputSource(cps->isr);
        snprintf(buf1, sizeof(buf1), _("Failed to start %s chess program %s on %s: %s\n"),
                _(cps->which), cps->program, cps->host, message);
        RemoveInputSource(cps->isr);
-       DisplayFatalError(buf1, 0, 1);
+       if(appData.icsActive) DisplayFatalError(buf1, 0, 1); else {
+           if(cps == &first) appData.noChessProgram = TRUE;
+           DisplayError(buf1, 0);
+       }
        return;
     }
 
        return;
     }
 
@@ -13786,6 +13795,7 @@ SendToProgram(message, cps)
     outCount = OutputToProcess(cps->pr, message, count, &error);
     if (outCount < count && !exiting
                          && !endingGame) { /* [HGM] crash: to not hang GameEnds() writing to deceased engines */
     outCount = OutputToProcess(cps->pr, message, count, &error);
     if (outCount < count && !exiting
                          && !endingGame) { /* [HGM] crash: to not hang GameEnds() writing to deceased engines */
+      if(!cps->initDone) return; // [HGM] should not generate fatal error during engine load
       snprintf(buf, MSG_SIZ, _("Error writing to %s chess program"), _(cps->which));
         if(gameInfo.resultDetails==NULL) { /* [HGM] crash: if game in progress, give reason for abort */
             if((signed char)boards[forwardMostMove][EP_STATUS] <= EP_DRAWS) {
       snprintf(buf, MSG_SIZ, _("Error writing to %s chess program"), _(cps->which));
         if(gameInfo.resultDetails==NULL) { /* [HGM] crash: if game in progress, give reason for abort */
             if((signed char)boards[forwardMostMove][EP_STATUS] <= EP_DRAWS) {