X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=qchess%2Fsrc%2Fplayer.py;h=346674b227bc9296ade7bba59a19945733ceb555;hb=52068b63d49f02f4455a4415356ecfe38db72f59;hp=1f40066c1651d86b0518c863c2536202aec11259;hpb=9b5054e5a06872ae85aca693079c17a0cd40c339;p=progcomp2013.git diff --git a/qchess/src/player.py b/qchess/src/player.py index 1f40066..346674b 100644 --- a/qchess/src/player.py +++ b/qchess/src/player.py @@ -38,10 +38,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 +56,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 +83,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