gnome-games r7992 - branches/gnome-2-24/glchess/src/lib



Author: rancell
Date: Thu Oct  9 04:34:10 2008
New Revision: 7992
URL: http://svn.gnome.org/viewvc/gnome-games?rev=7992&view=rev

Log:
Handle fork() errors in AI processes (Bug #530425)

Modified:
   branches/gnome-2-24/glchess/src/lib/ai.py

Modified: branches/gnome-2-24/glchess/src/lib/ai.py
==============================================================================
--- branches/gnome-2-24/glchess/src/lib/ai.py	(original)
+++ branches/gnome-2-24/glchess/src/lib/ai.py	Thu Oct  9 04:34:10 2008
@@ -7,6 +7,7 @@
 import select
 import signal
 import xml.dom.minidom
+import xml.parsers.expat
 
 import game
 import cecp
@@ -238,33 +239,43 @@
         self.__fromEngineFd = fromManagerOutput
 
         # Fork off a child process to manage the engine
-        self.__pid = os.fork()
-        if self.__pid == 0:
+        try:
+            self.__pid = os.fork()
+        except OSError, e:
+            print 'Monitor failed to fork: %s' % e.message
             os.close(toManagerInput)
-            os.close(fromManagerOutput)
-            self._runMonitor(fromManagerInput, toManagerOutput)
             os.close(toManagerOutput)
             os.close(fromManagerInput)
-            os._exit(0)
+            os.close(fromManagerOutput)
+            self.__toEngineFd = None
+            self.__fromEngineFd = None
+        else:
+            if self.__pid == 0:
+                os.close(toManagerInput)
+                os.close(fromManagerOutput)
+                self._runMonitor(fromManagerInput, toManagerOutput)
+                os.close(toManagerOutput)
+                os.close(fromManagerInput)
+                os._exit(0)
 
-        os.close(toManagerOutput)
-        os.close(fromManagerInput)
+            os.close(toManagerOutput)
+            os.close(fromManagerInput)
 
-        if profile.protocol == CECP:
-            self.connection = CECPConnection(self)
-        elif profile.protocol == UCI:
-            self.connection = UCIConnection(self)
-        else:
-            assert(False)
+            if profile.protocol == CECP:
+                self.connection = CECPConnection(self)
+            elif profile.protocol == UCI:
+                self.connection = UCIConnection(self)
+            else:
+                assert(False)
             
-        self.connection.start()
-        self.connection.startGame()
-        try:
-            level = self.__profile.levels[self.__level]
-        except KeyError:
-            self.connection.configure()
-        else:
-            self.connection.configure(level.options)
+            self.connection.start()
+            self.connection.startGame()
+            try:
+                level = self.__profile.levels[self.__level]
+            except KeyError:
+                self.connection.configure()
+            else:
+                self.connection.configure(level.options)
 
     # Methods to extend
     
@@ -342,12 +353,17 @@
     
     def onPlayerMoved(self, player, move):
         """Called by game.ChessPlayer"""
+        if self.__toEngineFd == None:
+            return
         isSelf = player is self and self.moving
         self.moving = False
         self.connection.reportMove(move.canMove, isSelf)
 
     def readyToMove(self):
         """Called by game.ChessPlayer"""
+        if self.__toEngineFd == None:
+            self.die()
+            return
         game = self.getGame()
         whiteTime = game.getWhite().getRemainingTime()
         blackTime = game.getBlack().getRemainingTime()
@@ -403,7 +419,11 @@
         (fromEngineOutput, fromEngineInput) = os.pipe()
 
         # Fork and execute the child
-        enginePID = os.fork()
+        try:
+            enginePID = os.fork()
+        except OSError, e:
+            print 'Monitor failed to fork: %s' % e.message
+            os._exit(1);
         if enginePID == 0:
             os.close(toApplicationFd)
             os.close(fromApplicationFd)            



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]