gnome-games r7661 - in trunk/glchess/src/lib: . gtkui
- From: rancell svn gnome org
- To: svn-commits-list gnome org
- Subject: gnome-games r7661 - in trunk/glchess/src/lib: . gtkui
- Date: Wed, 14 May 2008 13:34:22 +0100 (BST)
Author: rancell
Date: Wed May 14 12:34:22 2008
New Revision: 7661
URL: http://svn.gnome.org/viewvc/gnome-games?rev=7661&view=rev
Log:
Handling dieing processes correctly
Modified:
trunk/glchess/src/lib/ai.py
trunk/glchess/src/lib/gtkui/gtkui.py
Modified: trunk/glchess/src/lib/ai.py
==============================================================================
--- trunk/glchess/src/lib/ai.py (original)
+++ trunk/glchess/src/lib/ai.py Wed May 14 12:34:22 2008
@@ -203,6 +203,14 @@
"""Called by uci.StateMachine"""
self.player.move(move)
+# Catch zombie processes
+def _cDied(sig, stackFrame):
+ try:
+ (pid, status) = os.waitpid(-1, os.WNOHANG)
+ except OSError:
+ pass
+signal.signal(signal.SIGCHLD, _cDied)
+
class Player(game.ChessPlayer):
"""
"""
@@ -228,20 +236,6 @@
# Store the file descripter for reading/writing
self.__toEngineFd = toManagerInput
self.__fromEngineFd = fromManagerOutput
-
- # Catch if the child dies
- self.__pid = None
- def cDied(sig, stackFrame):
- try:
- (pid, status) = os.waitpid(-1, os.WNOHANG)
- except OSError:
- pass
- else:
- # If unexpected then AI has died
- if pid == self.__pid and self.__fromEngineFd != None:
- print 'Monitor died'
- self._die()
- signal.signal(signal.SIGCHLD, cDied)
# Fork off a child process to manage the engine
self.__pid = os.fork()
@@ -293,7 +287,7 @@
return self.__fromEngineFd
def read(self):
- """Read an process data from the engine.
+ """Read and process data from the engine.
This is non-blocking.
"""
@@ -303,8 +297,8 @@
return False
# Check if data is available
- (rlist, _, _) = select.select([self.__fromEngineFd], [], [], 0)
- if len(rlist) == 0:
+ (rlist, _, xlist) = select.select([self.__fromEngineFd], [], [self.__fromEngineFd], 0)
+ if (len(rlist) + len(xlist)) == 0:
return True
# Read a chunk and process
@@ -411,6 +405,8 @@
# Fork and execute the child
enginePID = os.fork()
if enginePID == 0:
+ os.close(toApplicationFd)
+ os.close(fromApplicationFd)
os.close(toEngineInput)
os.close(fromEngineOutput)
self._runEngine(toEngineOutput, fromEngineInput)
Modified: trunk/glchess/src/lib/gtkui/gtkui.py
==============================================================================
--- trunk/glchess/src/lib/gtkui/gtkui.py (original)
+++ trunk/glchess/src/lib/gtkui/gtkui.py Wed May 14 12:34:22 2008
@@ -289,7 +289,7 @@
def watchFileDescriptor(self, fd):
"""Extends ui.UI"""
- self._watches[fd] = gobject.io_add_watch(fd, gobject.IO_IN | gobject.IO_HUP, self.__readData)
+ self._watches[fd] = gobject.io_add_watch(fd, gobject.IO_IN | gobject.IO_PRI | gobject.IO_HUP | gobject.IO_ERR, self.__readData)
def unwatchFileDescriptor(self, fd):
"""Extends ui.UI"""
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]