summaryrefslogtreecommitdiff
path: root/lib/git/async/util.py
diff options
context:
space:
mode:
authorSebastian Thiel <byronimo@gmail.com>2010-06-09 11:28:37 +0200
committerSebastian Thiel <byronimo@gmail.com>2010-06-09 11:28:37 +0200
commitf2c8d26d3b25b864ad48e6de018757266b59f708 (patch)
tree4c455469b09e049ff8e29e6166bc2118356dc9cd /lib/git/async/util.py
parent15941ca090a2c3c987324fc911bbc6f89e941c47 (diff)
downloadgitpython-f2c8d26d3b25b864ad48e6de018757266b59f708.tar.gz
thread: fixed initialization problem if an empty iterable was handed in
queue: Queue now derives from deque directly, which safes one dict lookup as the queue does not need to be accessed through self anymore pool test improved to better verify threads are started correctly
Diffstat (limited to 'lib/git/async/util.py')
-rw-r--r--lib/git/async/util.py19
1 files changed, 8 insertions, 11 deletions
diff --git a/lib/git/async/util.py b/lib/git/async/util.py
index dff38f58..b5e1a0c0 100644
--- a/lib/git/async/util.py
+++ b/lib/git/async/util.py
@@ -10,7 +10,6 @@ from threading import (
)
from Queue import (
- Queue,
Empty,
)
@@ -171,15 +170,14 @@ class HSCondition(object):
class ReadOnly(Exception):
"""Thrown when trying to write to a read-only queue"""
-class AsyncQueue(Queue):
+class AsyncQueue(deque):
"""A queue using different condition objects to gain multithreading performance.
Additionally it has a threadsafe writable flag, which will alert all readers
that there is nothing more to get here.
All default-queue code was cleaned up for performance."""
- __slots__ = ('mutex', 'not_empty', 'queue', '_writable')
+ __slots__ = ('mutex', 'not_empty', '_writable')
def __init__(self, maxsize=0):
- self.queue = deque()
self.mutex = Lock()
self.not_empty = HSCondition(self.mutex)
self._writable = True
@@ -187,7 +185,7 @@ class AsyncQueue(Queue):
def qsize(self):
self.mutex.acquire()
try:
- return len(self.queue)
+ return len(self)
finally:
self.mutex.release()
@@ -218,7 +216,7 @@ class AsyncQueue(Queue):
def empty(self):
self.mutex.acquire()
try:
- return not len(self.queue)
+ return not len(self)
finally:
self.mutex.release()
@@ -228,21 +226,20 @@ class AsyncQueue(Queue):
self.mutex.release()
raise ReadOnly
# END handle read-only
- self.queue.append(item)
+ self.append(item)
self.mutex.release()
self.not_empty.notify()
def get(self, block=True, timeout=None):
self.mutex.acquire()
- q = self.queue
try:
if block:
if timeout is None:
- while not len(q) and self._writable:
+ while not len(self) and self._writable:
self.not_empty.wait()
else:
endtime = _time() + timeout
- while not len(q) and self._writable:
+ while not len(self) and self._writable:
remaining = endtime - _time()
if remaining <= 0.0:
raise Empty
@@ -252,7 +249,7 @@ class AsyncQueue(Queue):
# can throw if we woke up because we are not writable anymore
try:
- return q.popleft()
+ return self.popleft()
except IndexError:
raise Empty
# END handle unblocking reason