summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorelie <elie>2005-07-25 15:08:36 +0000
committerelie <elie>2005-07-25 15:08:36 +0000
commitababd1701bb518c5b63d81b899766e3804ff7327 (patch)
tree7e8529ea5646dd2ee3017065052ae5515c292a65
parentfbad8ff4ac4f9116b35db67b3afe227bdc54a193 (diff)
downloadpysnmp-ababd1701bb518c5b63d81b899766e3804ff7327.tar.gz
AbstractTransportDispatcher.runDispatcher() now runs only when 1) unsent data
remains in buffers or 2) any app registers a job at dispatcher (e.g. it waits for data to arrive). Otherwise, runDispatcher() terminates.
-rw-r--r--pysnmp/carrier/asynsock/dispatch.py10
-rw-r--r--pysnmp/carrier/base.py22
2 files changed, 22 insertions, 10 deletions
diff --git a/pysnmp/carrier/asynsock/dispatch.py b/pysnmp/carrier/asynsock/dispatch.py
index eca5466..c206087 100644
--- a/pysnmp/carrier/asynsock/dispatch.py
+++ b/pysnmp/carrier/asynsock/dispatch.py
@@ -45,9 +45,13 @@ class AsynsockDispatcher(base.AbstractTransportDispatcher):
self.getTransport(tDomain).unregisterSocket(self.__sockMap)
base.AbstractTransportDispatcher.unregisterTransport(self, tDomain)
+ def transportsAreWorking(self):
+ for transport in self.__sockMap.values():
+ if transport.writable():
+ return 1
+ return 0
+
def runDispatcher(self):
- while 1:
+ while self.jobsArePending() or self.transportsAreWorking():
poll(self.timeout, self.__sockMap)
self.handleTimerTick(time())
- if not self._doDispatchFlag:
- break
diff --git a/pysnmp/carrier/base.py b/pysnmp/carrier/base.py
index 9a4fa6f..b853e3f 100644
--- a/pysnmp/carrier/base.py
+++ b/pysnmp/carrier/base.py
@@ -3,8 +3,8 @@ from pysnmp.carrier import error
class AbstractTransportDispatcher:
def __init__(self):
- self._doDispatchFlag = 1
self.__transports = {}
+ self.__jobs = {}
self.__recvCbFun = self.__timerCbFun = None
def _cbFun(self, incomingTransport, transportAddress, incomingMessage):
@@ -79,14 +79,22 @@ class AbstractTransportDispatcher:
if self.__timerCbFun:
self.__timerCbFun(timeNow)
- def runDispatcher(self, timeout=0.0):
- raise error.CarrierError('Method not implemented')
+ def jobStarted(self, jobId):
+ self.__jobs[jobId] = self.__jobs.get(jobId, 0) + 1
+
+ def jobFinished(self, jobId):
+ self.__jobs[jobId] = self.__jobs[jobId] - 1
+ if self.__jobs[jobId] == 0:
+ del self.__jobs[jobId]
- def startDispatcher(self):
- self._doDispatchFlag = 1
+ def jobsArePending(self):
+ if self.__jobs:
+ return 1
+ else:
+ return 0
- def stopDispatcher(self):
- self._doDispatchFlag = 0
+ def runDispatcher(self, timeout=0.0):
+ raise error.CarrierError('Method not implemented')
def closeDispatcher(self):
for tDomain in self.__transports.keys():