+
+
+
+def open_fifo(name, mode, timeout=None):
+ if timeout == None:
+ return open(name, mode)
+
+
+ class Worker(threading.Thread):
+ def __init__(self):
+ threading.Thread.__init__(self)
+ self.result = None
+
+
+ def run(self):
+ self.result = open(name, mode)
+
+
+ w = Worker()
+ w.start()
+
+ start = time.time()
+ while time.time() - start < timeout:
+ if w.is_alive() == False:
+ w.join()
+ 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")
+
+ #sys.stderr.write("Opened other end!\n")
+ while w.is_alive():
+ time.sleep(0.1)
+
+ w.join()
+ f.close()
+ w.result.close()
+ raise Exception("FIFO_TIMEOUT")
+ else:
+ w.join()
+ return w.result
+