From 5d2645df56909c5a2beddaee70d3e48799ed975e Mon Sep 17 00:00:00 2001 From: Mike O'Connor Date: Fri, 30 Oct 2009 15:38:18 +0100 Subject: [PATCH 1/1] split read and write locks Signed-off-by: Mike O'Connor --- dak/import_known_changes.py | 31 +++++++++++++++++++++---------- 1 file changed, 21 insertions(+), 10 deletions(-) diff --git a/dak/import_known_changes.py b/dak/import_known_changes.py index 0b238626..cdb1d3af 100755 --- a/dak/import_known_changes.py +++ b/dak/import_known_changes.py @@ -128,37 +128,48 @@ class OneAtATime(object): """ 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.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() def enqueue(self, next): - self.next_lock.acquire() + self.write_lock.acquire() while self.next_in_line: if self.die: return - self.next_lock.wait() + self.write_lock.wait() 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() def dequeue(self): - self.next_lock.acquire() + self.read_lock.acquire() while not self.next_in_line: if self.die: return - self.next_lock.wait() + self.read_lock.wait() 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 -- 2.39.2