* do not set to SIG_DFL, set it to what handler was used before.

* api.finalize also is critical for system health.
This commit is contained in:
Faik Uygur
2006-10-25 13:27:39 +00:00
parent f0a78b2d09
commit 291d977ab5
2 changed files with 22 additions and 23 deletions
+2 -1
View File
@@ -116,7 +116,7 @@ def init(database = True, write = True,
def finalize(): def finalize():
if ctx.initialized: if ctx.initialized:
ctx.disable_keyboard_interrupts()
if ctx.log: if ctx.log:
ctx.loghandler.flush() ctx.loghandler.flush()
ctx.log.removeHandler(ctx.loghandler) ctx.log.removeHandler(ctx.loghandler)
@@ -145,6 +145,7 @@ def finalize():
ctx.ui.debug('PiSi API finalized') ctx.ui.debug('PiSi API finalized')
ctx.ui.close() ctx.ui.close()
ctx.initialized = False ctx.initialized = False
ctx.enable_keyboard_interrupts()
def list_installed(): def list_installed():
'''returns a set of installed package names''' '''returns a set of installed package names'''
+18 -20
View File
@@ -16,39 +16,37 @@ exception = {
signal.SIGINT:KeyboardInterrupt signal.SIGINT:KeyboardInterrupt
} }
class Signal:
def __init__(self, sig):
self.signal = sig
self.oldhandler = signal.getsignal(sig)
self.pending = False
class SignalHandler: class SignalHandler:
def __init__(self): def __init__(self):
self.pending_signals = [] self.signals = {}
self.disabled_signals = []
def signal_handler(self, sig, frame): def signal_handler(self, sig, frame):
signal.signal(sig, signal.SIG_IGN) signal.signal(sig, signal.SIG_IGN)
if sig not in self.pending_signals: self.signals[sig].pending = True
self.pending_signals.append(sig)
def clear_pending_signal(self, sig):
if sig in self.pending_signals:
self.pending_signals.remove(sig)
def disable_signal(self, sig): def disable_signal(self, sig):
if sig not in self.signals.keys():
self.signals[sig] = Signal(sig)
signal.signal(sig, self.signal_handler) signal.signal(sig, self.signal_handler)
if sig not in self.disabled_signals:
self.disabled_signals.append(sig)
def enable_signal(self, sig): def enable_signal(self, sig):
signal.signal(sig, signal.SIG_DFL) if sig in self.signals.keys():
oldhandler = self.signals[sig].oldhandler
if sig in self.disabled_signals: pending = self.signals[sig].pending
self.disabled_signals.remove(sig) del self.signals[sig]
signal.signal(sig, oldhandler)
if sig in self.pending_signals: if pending:
self.clear_pending_signal(sig)
raise exception[sig] raise exception[sig]
def signal_disabled(self, sig): def signal_disabled(self, sig):
return sig in self.disabled_signals return sig in self.signals.keys()
def signal_pending(self, sig): def signal_pending(self, sig):
return sig in self.pending_signals return self.signal_disabled(sig) and self.signals[sig].pending