* 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:
+2
-1
@@ -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'''
|
||||||
|
|||||||
+20
-22
@@ -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):
|
||||||
signal.signal(sig, self.signal_handler)
|
if sig not in self.signals.keys():
|
||||||
|
self.signals[sig] = Signal(sig)
|
||||||
if sig not in self.disabled_signals:
|
signal.signal(sig, self.signal_handler)
|
||||||
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
|
||||||
|
|||||||
Reference in New Issue
Block a user