* 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():
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'''
+18 -20
View File
@@ -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)
def clear_pending_signal(self, sig):
if sig in self.pending_signals:
self.pending_signals.remove(sig)
self.signals[sig].pending = True
def disable_signal(self, sig):
if sig not in self.signals.keys():
self.signals[sig] = Signal(sig)
signal.signal(sig, self.signal_handler)
if sig not in self.disabled_signals:
self.disabled_signals.append(sig)
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)
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