jp (base): added quitFromSignal method to quit from signal handler with errcode without traceback, and addOnQuitCallback to manage cleaning callbacks
This commit is contained in:
parent
0c5bf88da0
commit
8477d22012
1 changed files with 32 additions and 0 deletions
|
|
@ -106,6 +106,19 @@ class Jp(object):
|
|||
def progress_id(self, value):
|
||||
self._progress_id = value
|
||||
|
||||
|
||||
def addOnQuitCallback(self, callback, *args, **kwargs):
|
||||
"""Add a callback which will be called on quit command
|
||||
|
||||
@param callback(callback): method to call
|
||||
"""
|
||||
try:
|
||||
callbacks_list = self._onQuitCallbacks
|
||||
except AttributeError:
|
||||
callbacks_list = self._onQuitCallbacks = []
|
||||
finally:
|
||||
callbacks_list.append((callback, args, kwargs))
|
||||
|
||||
def _make_parents(self):
|
||||
self.parents = {}
|
||||
|
||||
|
|
@ -182,7 +195,26 @@ class Jp(object):
|
|||
except AttributeError:
|
||||
pass
|
||||
|
||||
def quitFromSignal(self, errcode=0):
|
||||
"""Same as self.quit, but from a signal handler
|
||||
|
||||
/!\: return must be used after calling this method !
|
||||
"""
|
||||
assert self.need_loop
|
||||
# XXX: python-dbus will show a traceback if we exit in a signal handler with an error code
|
||||
# so we use this little timeout trick to avoid it
|
||||
GLib.timeout_add(0, self.quit, errcode)
|
||||
|
||||
def quit(self, errcode=0):
|
||||
# first the onQuitCallbacks
|
||||
try:
|
||||
callbacks_list = self._onQuitCallbacks
|
||||
except AttributeError:
|
||||
pass
|
||||
else:
|
||||
for callback, args, kwargs in callbacks_list:
|
||||
callback(*args, **kwargs)
|
||||
|
||||
self.stop_loop()
|
||||
if errcode:
|
||||
sys.exit(errcode)
|
||||
|
|
|
|||
Loading…
Reference in a new issue