Signed-off-by: Mike O'Connor <stew@vireo.org>
"""
def __init__(self):
self.next_in_line = None
"""
def __init__(self):
self.next_in_line = None
- self.next_lock = threading.Condition()
+ self.read_lock = threading.Condition()
+ self.write_lock = threading.Condition()
self.die = False
def plsDie(self):
self.die = True
self.die = False
def plsDie(self):
self.die = True
- self.next_lock.notify()
+ self.write_lock.acquire()
+ self.write_lock.notifyAll()
+ self.write_lock.release()
+
+ self.read_lock.acquire()
+ self.read_lock.notifyAll()
+ self.read_lock.release()
- self.next_lock.acquire()
+ self.write_lock.acquire()
while self.next_in_line:
if self.die:
return
while self.next_in_line:
if self.die:
return
assert( not self.next_in_line )
self.next_in_line = next
assert( not self.next_in_line )
self.next_in_line = next
- self.next_lock.notifyAll()
- self.next_lock.release()
+ self.write_lock.release()
+ self.read_lock.acquire()
+ self.read_lock.notify()
+ self.read_lock.release()
- self.next_lock.acquire()
+ self.read_lock.acquire()
while not self.next_in_line:
if self.die:
return
while not self.next_in_line:
if self.die:
return
result = self.next_in_line
self.next_in_line = None
result = self.next_in_line
self.next_in_line = None
- self.next_lock.notifyAll()
- self.next_lock.release()
+ self.read_lock.release()
+ self.write_lock.acquire()
+ self.write_lock.notify()
+ self.write_lock.release()
if isinstance(result, EndOfChanges):
return None
if isinstance(result, EndOfChanges):
return None