Tidy website a bit
[progcomp2013.git] / qchess / src / player.py
index 1f40066..a574995 100644 (file)
@@ -26,6 +26,8 @@ class Player():
 
        def base_player(self):
                return self
+
+
        
 
 
@@ -38,10 +40,15 @@ def open_fifo(name, mode, timeout=None):
                def __init__(self):
                        threading.Thread.__init__(self)
                        self.result = None
+                       self.exception = None
 
                        
                def run(self):          
-                       self.result = open(name, mode)
+                       try:
+                               self.result = open(name, mode)
+                       except Exception, e:
+                               self.exception = e
+                               self.result = None
                
 
        w = Worker()
@@ -51,16 +58,22 @@ def open_fifo(name, mode, timeout=None):
        while time.time() - start < timeout:
                if w.is_alive() == False:
                        w.join()
+                       if w.exception != None:
+                               raise w.exception
                        return w.result
                time.sleep(0.1)
        
        
        if w.is_alive():
                #sys.stderr.write("FIFO_TIMEOUT!\n")
-               if mode == "r":
-                       f = open(name, "w")
-               else:
-                       f = open(name, "r")
+               # Recursive to deal with possible race condition
+               try:
+                       if mode == "r":
+                               f = open_fifo(name, "w", 1)
+                       else:
+                               f = open_fifo(name, "r", 1)
+               except:
+                       pass
                        
                #sys.stderr.write("Opened other end!\n")
                while w.is_alive():
@@ -72,6 +85,8 @@ def open_fifo(name, mode, timeout=None):
                raise Exception("FIFO_TIMEOUT")
        else:
                w.join()
+               if w.exception != None:
+                       raise w.exception
                return w.result
        
 
@@ -84,11 +99,17 @@ class FifoPlayer(Player):
                Player.__init__(self, name, colour)
                os.mkfifo(self.name+".in")
                os.mkfifo(self.name+".out")
-               
-               
-               
-               
-               
+                       
+
+               try:
+                       self.fifo_out = open_fifo(self.name+".out","w", FifoPlayer.timeout)
+               except:
+                       raise Exception("FIFO_TIMEOUT")
+               else:
+                       self.fifo_out.write("START "+colour+"\n")
+                       self.fifo_out.close()
+
+                               
        def update(self, result):
                sys.stderr.write("update fifo called\n")
                try:
@@ -134,15 +155,16 @@ class FifoPlayer(Player):
                try:
                        self.fifo_out = open_fifo(self.name+".out", "w", FifoPlayer.timeout)
                except:
-                       os.remove(self.name+".in")
-                       os.remove(self.name+".out")
-                       #raise Exception("FIFO_TIMEOUT")
-                       
+                       pass
                else:
                        self.fifo_out.write(result + "\n")
                        self.fifo_out.close()
+
+               try:
                        os.remove(self.name+".in")
                        os.remove(self.name+".out")
+               except OSError:
+                       pass
 
 # Player that runs from another process
 class ExternalAgent(Player):
@@ -150,6 +172,7 @@ class ExternalAgent(Player):
 
        def __init__(self, name, colour):
                Player.__init__(self, name, colour)
+               #raise Exception("waht")
                self.p = subprocess.Popen(name,bufsize=0,stdin=subprocess.PIPE, stdout=subprocess.PIPE, shell=True,universal_newlines=True)
                
                self.send_message(colour)
@@ -231,6 +254,7 @@ class HumanPlayer(Player):
        def __init__(self, name, colour):
                Player.__init__(self, name, colour)
                
+
        # Select your preferred account
        def select(self):
                if isinstance(graphics, GraphicsThread):
@@ -252,9 +276,11 @@ class HumanPlayer(Player):
                                sys.stdout.write("SELECTION?\n")
                                try:
                                        p = map(int, sys.stdin.readline().strip("\r\n ").split(" "))
+                                       return p
                                except:
                                        sys.stderr.write("ILLEGAL GIBBERISH\n")
                                        continue
+
        # It's your move captain
        def get_move(self):
                if isinstance(graphics, GraphicsThread):
@@ -270,6 +296,7 @@ class HumanPlayer(Player):
                                sys.stdout.write("MOVE?\n")
                                try:
                                        p = map(int, sys.stdin.readline().strip("\r\n ").split(" "))
+                                       return p
                                except:
                                        sys.stderr.write("ILLEGAL GIBBERISH\n")
                                        continue
@@ -296,7 +323,8 @@ class InternalAgent(Player):
 
                self.board = Board(style = "agent")
 
-
+       def argForm(self):
+               return "@internal:"+self.name
 
        def update(self, result):
                

UCC git Repository :: git.ucc.asn.au