[Neo-report] r1775 vincent - in /trunk/neo: dispatcher.py tests/testDispatcher.py
nobody at svn.erp5.org
nobody at svn.erp5.org
Tue Feb 16 17:22:16 CET 2010
Author: vincent
Date: Tue Feb 16 17:22:13 2010
New Revision: 1775
Log:
Add a method on dispatcher to know if a given queue is registered to it.
Modified:
trunk/neo/dispatcher.py
trunk/neo/tests/testDispatcher.py
Modified: trunk/neo/dispatcher.py
==============================================================================
--- trunk/neo/dispatcher.py [iso-8859-1] (original)
+++ trunk/neo/dispatcher.py [iso-8859-1] Tue Feb 16 17:22:13 2010
@@ -32,6 +32,7 @@
def __init__(self):
self.message_table = {}
+ self.queue_dict = {}
lock = Lock()
self.lock_acquire = lock.acquire
self.lock_release = lock.release
@@ -42,6 +43,7 @@
queue = self.message_table.get(id(conn), EMPTY).pop(msg_id, None)
if queue is None:
return False
+ self.queue_dict[id(queue)] -= 1
queue.put(data)
return True
@@ -49,6 +51,12 @@
def register(self, conn, msg_id, queue):
"""Register an expectation for a reply."""
self.message_table.setdefault(id(conn), {})[msg_id] = queue
+ queue_dict = self.queue_dict
+ key = id(queue)
+ try:
+ queue_dict[key] += 1
+ except KeyError:
+ queue_dict[key] = 1
def unregister(self, conn):
""" Unregister a connection and put fake packet in queues to unlock
@@ -59,13 +67,19 @@
finally:
self.lock_release()
notified_set = set()
+ queue_dict = self.queue_dict
for queue in message_table.itervalues():
queue_id = id(queue)
if queue_id not in notified_set:
queue.put((conn, None))
notified_set.add(queue_id)
+ queue_dict[queue_id] -= 1
def registered(self, conn):
"""Check if a connection is registered into message table."""
return len(self.message_table.get(id(conn), EMPTY)) != 0
+ @giant_lock
+ def pending(self, queue):
+ return not queue.empty() or self.queue_dict[id(queue)] > 0
+
Modified: trunk/neo/tests/testDispatcher.py
==============================================================================
--- trunk/neo/tests/testDispatcher.py [iso-8859-1] (original)
+++ trunk/neo/tests/testDispatcher.py [iso-8859-1] Tue Feb 16 17:22:13 2010
@@ -64,6 +64,49 @@
self.assertFalse(self.dispatcher.registered(conn1))
self.assertFalse(self.dispatcher.registered(conn2))
+ def testPending(self):
+ conn1 = object()
+ conn2 = object()
+ class Queue(object):
+ _empty = True
+
+ def empty(self):
+ return self._empty
+
+ def put(self, value):
+ pass
+ queue1 = Queue()
+ queue2 = Queue()
+ self.dispatcher.register(conn1, 1, queue1)
+ self.assertTrue(self.dispatcher.pending(queue1))
+ self.dispatcher.register(conn2, 2, queue1)
+ self.assertTrue(self.dispatcher.pending(queue1))
+ self.dispatcher.register(conn2, 3, queue2)
+ self.assertTrue(self.dispatcher.pending(queue1))
+ self.assertTrue(self.dispatcher.pending(queue2))
+
+ self.dispatcher.dispatch(conn1, 1, None)
+ self.assertTrue(self.dispatcher.pending(queue1))
+ self.assertTrue(self.dispatcher.pending(queue2))
+ self.dispatcher.dispatch(conn2, 2, None)
+ self.assertFalse(self.dispatcher.pending(queue1))
+ self.assertTrue(self.dispatcher.pending(queue2))
+
+ queue1._empty = False
+ self.assertTrue(self.dispatcher.pending(queue1))
+ queue1._empty = True
+
+ self.dispatcher.register(conn1, 4, queue1)
+ self.dispatcher.register(conn2, 5, queue1)
+ self.assertTrue(self.dispatcher.pending(queue1))
+ self.assertTrue(self.dispatcher.pending(queue2))
+
+ self.dispatcher.unregister(conn2)
+ self.assertTrue(self.dispatcher.pending(queue1))
+ self.assertFalse(self.dispatcher.pending(queue2))
+ self.dispatcher.unregister(conn1)
+ self.assertFalse(self.dispatcher.pending(queue1))
+ self.assertFalse(self.dispatcher.pending(queue2))
if __name__ == '__main__':
unittest.main()
More information about the Neo-report
mailing list