diff options
author | elie <elie> | 2005-07-25 15:08:36 +0000 |
---|---|---|
committer | elie <elie> | 2005-07-25 15:08:36 +0000 |
commit | ababd1701bb518c5b63d81b899766e3804ff7327 (patch) | |
tree | 7e8529ea5646dd2ee3017065052ae5515c292a65 | |
parent | fbad8ff4ac4f9116b35db67b3afe227bdc54a193 (diff) | |
download | pysnmp-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.py | 10 | ||||
-rw-r--r-- | pysnmp/carrier/base.py | 22 |
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(): |