summaryrefslogtreecommitdiff
path: root/python/test/Ice/dispatcher/Dispatcher.py
diff options
context:
space:
mode:
Diffstat (limited to 'python/test/Ice/dispatcher/Dispatcher.py')
-rwxr-xr-xpython/test/Ice/dispatcher/Dispatcher.py62
1 files changed, 62 insertions, 0 deletions
diff --git a/python/test/Ice/dispatcher/Dispatcher.py b/python/test/Ice/dispatcher/Dispatcher.py
new file mode 100755
index 00000000000..1f4fa4ee1e4
--- /dev/null
+++ b/python/test/Ice/dispatcher/Dispatcher.py
@@ -0,0 +1,62 @@
+#!/usr/bin/env python
+# **********************************************************************
+#
+# Copyright (c) 2003-2017 ZeroC, Inc. All rights reserved.
+#
+# This copy of Ice is licensed to you under the terms described in the
+# ICE_LICENSE file included in this distribution.
+#
+# **********************************************************************
+
+import Ice, os, sys, traceback, time, threading
+
+def test(b):
+ if not b:
+ raise RuntimeError('test assertion failed')
+
+class Dispatcher(Ice.Dispatcher):
+ def __init__(self):
+ self._calls = []
+ self._terminated = False
+ self._cond = threading.Condition()
+ self._thread = threading.Thread(target=self.run)
+ self._thread.start()
+ Dispatcher._instance = self
+
+ def dispatch(self, call, con):
+ with self._cond:
+ self._calls.append(call)
+ if len(self._calls) == 1:
+ self._cond.notify()
+
+ def run(self):
+ while True:
+ call = None
+ with self._cond:
+ while not self._terminated and len(self._calls) == 0:
+ self._cond.wait()
+ if len(self._calls) > 0:
+ call = self._calls.pop(0)
+ elif self._terminated:
+ # Terminate only once all calls are dispatched.
+ return
+
+ if call:
+ try:
+ call()
+ except:
+ # Exceptions should never propagate here.
+ test(False)
+
+ @staticmethod
+ def terminate():
+ with Dispatcher._instance._cond:
+ Dispatcher._instance._terminated = True
+ Dispatcher._instance._cond.notify()
+
+ Dispatcher._instance._thread.join()
+ Dispatcher._instance = None
+
+ @staticmethod
+ def isDispatcherThread():
+ return threading.current_thread() == Dispatcher._instance._thread