aboutsummaryrefslogtreecommitdiff
path: root/rpkid
diff options
context:
space:
mode:
authorRob Austein <sra@hactrn.net>2009-05-04 19:51:25 +0000
committerRob Austein <sra@hactrn.net>2009-05-04 19:51:25 +0000
commit8b02cc3b7a66caa972f2ff571fc52daec2088138 (patch)
tree68c336fd152a039b624ba0a7a3d8c7bc01988d12 /rpkid
parent2271be2ab671d8d67602a6957d358ac5bebd9ad7 (diff)
Move signal wrapper to rpki.async.event_loop().
svn path=/rpkid/rpki/async.py; revision=2397
Diffstat (limited to 'rpkid')
-rw-r--r--rpkid/rpki/async.py25
1 files changed, 18 insertions, 7 deletions
diff --git a/rpkid/rpki/async.py b/rpkid/rpki/async.py
index 12e45ffd..164e0102 100644
--- a/rpkid/rpki/async.py
+++ b/rpkid/rpki/async.py
@@ -18,7 +18,7 @@ OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
PERFORMANCE OF THIS SOFTWARE.
"""
-import asyncore
+import asyncore, signal
import rpki.log, rpki.sundial
class iterator(object):
@@ -135,7 +135,7 @@ class timer(object):
cls.queue.pop(0).handler()
def __repr__(self):
- return "<%s %s>" % (self.__class__.__name__, repr(self.when))
+ return "<%s %r %r>" % (self.__class__.__name__, self.when, self.handler)
@classmethod
def seconds_until_wakeup(cls):
@@ -167,8 +167,19 @@ class timer(object):
while cls.queue:
cls.queue.pop(0).cancel()
-def event_loop():
- """Replacement for asyncore.loop(), adding timer support."""
- while asyncore.socket_map:
- asyncore.poll(timer.seconds_until_wakeup(), asyncore.socket_map)
- timer.runq()
+def _raiseExitNow(signum, frame):
+ """Signal handler for event_loop()."""
+ raise asyncore.ExitNow
+
+def event_loop(catch_signals = (signal.SIGINT, signal.SIGTERM)):
+ """Replacement for asyncore.loop(), adding timer and signal support."""
+ try:
+ old_signal_handlers = tuple((sig, signal.signal(sig, _raiseExitNow)) for sig in catch_signals)
+ while asyncore.socket_map or timer.queue:
+ asyncore.poll(timer.seconds_until_wakeup(), asyncore.socket_map)
+ timer.runq()
+ except asyncore.ExitNow:
+ pass
+ finally:
+ for sig, handler in old_signal_handlers:
+ signal.signal(sig, handler)