summaryrefslogtreecommitdiff
path: root/pysnmp/carrier/asyncore/dispatch.py
diff options
context:
space:
mode:
authorelie <elie>2015-07-05 14:22:26 +0000
committerelie <elie>2015-07-05 14:22:26 +0000
commitb2446e8a9841625abed2e0b67185751b7f17b208 (patch)
treecd5ea73f0a2b2ab49990d97db313d24c8f446052 /pysnmp/carrier/asyncore/dispatch.py
parentffc920b298fb7bd2caa403645431c45754e8c9af (diff)
downloadpysnmp-b2446e8a9841625abed2e0b67185751b7f17b208.tar.gz
- original asynsock transport and AsyncsockDispatcher renamed into
asyncore and AsyncoreDispatcher respectively to provide better hint to fellow devs on the underlying transport being used - backward compatibility preserved through dummy asynsock symbols
Diffstat (limited to 'pysnmp/carrier/asyncore/dispatch.py')
-rw-r--r--pysnmp/carrier/asyncore/dispatch.py42
1 files changed, 42 insertions, 0 deletions
diff --git a/pysnmp/carrier/asyncore/dispatch.py b/pysnmp/carrier/asyncore/dispatch.py
new file mode 100644
index 0000000..790152d
--- /dev/null
+++ b/pysnmp/carrier/asyncore/dispatch.py
@@ -0,0 +1,42 @@
+# Implements I/O over asynchronous sockets
+from time import time
+from sys import exc_info
+from traceback import format_exception
+from asyncore import socket_map
+from asyncore import loop
+from pysnmp.carrier.base import AbstractTransportDispatcher
+from pysnmp.error import PySnmpError
+
+class AsyncoreDispatcher(AbstractTransportDispatcher):
+ def __init__(self):
+ self.__sockMap = {} # use own map for MT safety
+ self.timeout = 0.5
+ AbstractTransportDispatcher.__init__(self)
+
+ def getSocketMap(self): return self.__sockMap
+ def setSocketMap(self, sockMap=socket_map): self.__sockMap = sockMap
+
+ def registerTransport(self, tDomain, t):
+ AbstractTransportDispatcher.registerTransport(self, tDomain, t)
+ t.registerSocket(self.__sockMap)
+
+ def unregisterTransport(self, tDomain):
+ self.getTransport(tDomain).unregisterSocket(self.__sockMap)
+ AbstractTransportDispatcher.unregisterTransport(self, tDomain)
+
+ def transportsAreWorking(self):
+ for transport in self.__sockMap.values():
+ if transport.writable():
+ return 1
+ return 0
+
+ def runDispatcher(self, timeout=0.0):
+ while self.jobsArePending() or self.transportsAreWorking():
+ try:
+ loop(timeout and timeout or self.timeout,
+ use_poll=True, map=self.__sockMap, count=1)
+ except KeyboardInterrupt:
+ raise
+ except:
+ raise PySnmpError('poll error: %s' % ';'.join(format_exception(*exc_info())))
+ self.handleTimerTick(time())