From 291d977ab570fdbf2e71b7eba1b8a6ccfd77037b Mon Sep 17 00:00:00 2001 From: Faik Uygur Date: Wed, 25 Oct 2006 13:27:39 +0000 Subject: [PATCH] * do not set to SIG_DFL, set it to what handler was used before. * api.finalize also is critical for system health. --- pisi/api.py | 3 ++- pisi/signalhandler.py | 42 ++++++++++++++++++++---------------------- 2 files changed, 22 insertions(+), 23 deletions(-) diff --git a/pisi/api.py b/pisi/api.py index 68dfef97..81a9c867 100644 --- a/pisi/api.py +++ b/pisi/api.py @@ -116,7 +116,7 @@ def init(database = True, write = True, def finalize(): if ctx.initialized: - + ctx.disable_keyboard_interrupts() if ctx.log: ctx.loghandler.flush() ctx.log.removeHandler(ctx.loghandler) @@ -145,6 +145,7 @@ def finalize(): ctx.ui.debug('PiSi API finalized') ctx.ui.close() ctx.initialized = False + ctx.enable_keyboard_interrupts() def list_installed(): '''returns a set of installed package names''' diff --git a/pisi/signalhandler.py b/pisi/signalhandler.py index 3e935b65..97f04d1f 100644 --- a/pisi/signalhandler.py +++ b/pisi/signalhandler.py @@ -16,39 +16,37 @@ exception = { signal.SIGINT:KeyboardInterrupt } +class Signal: + def __init__(self, sig): + self.signal = sig + self.oldhandler = signal.getsignal(sig) + self.pending = False + class SignalHandler: def __init__(self): - self.pending_signals = [] - self.disabled_signals = [] + self.signals = {} def signal_handler(self, sig, frame): signal.signal(sig, signal.SIG_IGN) - if sig not in self.pending_signals: - self.pending_signals.append(sig) + self.signals[sig].pending = True - def clear_pending_signal(self, sig): - if sig in self.pending_signals: - self.pending_signals.remove(sig) - def disable_signal(self, sig): - signal.signal(sig, self.signal_handler) - - if sig not in self.disabled_signals: - self.disabled_signals.append(sig) + if sig not in self.signals.keys(): + self.signals[sig] = Signal(sig) + signal.signal(sig, self.signal_handler) def enable_signal(self, sig): - signal.signal(sig, signal.SIG_DFL) - - if sig in self.disabled_signals: - self.disabled_signals.remove(sig) - - if sig in self.pending_signals: - self.clear_pending_signal(sig) - raise exception[sig] + if sig in self.signals.keys(): + oldhandler = self.signals[sig].oldhandler + pending = self.signals[sig].pending + del self.signals[sig] + signal.signal(sig, oldhandler) + if pending: + raise exception[sig] def signal_disabled(self, sig): - return sig in self.disabled_signals + return sig in self.signals.keys() def signal_pending(self, sig): - return sig in self.pending_signals + return self.signal_disabled(sig) and self.signals[sig].pending