X-Git-Url: https://git.ucc.asn.au/?p=progcomp2013.git;a=blobdiff_plain;f=qchess%2Fqchess.py;h=092a121dedd871abede9903298d324cdf4f247fd;hp=0ff4209a0d2f194530fcda22bc02dd449689d79e;hb=e9e685cd5fa0c4f068df2431232b7c2250ffd0ed;hpb=9b5054e5a06872ae85aca693079c17a0cd40c339 diff --git a/qchess/qchess.py b/qchess/qchess.py index 0ff4209..092a121 100755 --- a/qchess/qchess.py +++ b/qchess/qchess.py @@ -663,10 +663,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() @@ -676,16 +681,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(): @@ -697,6 +708,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 @@ -1792,7 +1805,7 @@ class GameThread(StoppableThread): except Exception,e: #if False: result = e.message - #sys.stderr.write(result + "\n") + sys.stderr.write("qchess.py exception: "+result + "\n") self.stop() @@ -2974,4 +2987,4 @@ if __name__ == "__main__": # --- main.py --- # -# EOF - created from make on Sun May 19 00:54:03 WST 2013 +# EOF - created from make on Sun May 19 12:36:10 WST 2013