diff options
author | Lance Stout <lancestout@gmail.com> | 2010-12-21 11:33:40 -0500 |
---|---|---|
committer | Lance Stout <lancestout@gmail.com> | 2010-12-21 11:33:40 -0500 |
commit | 3657bf66363844bf7351ea84279eeb74b0449d5f (patch) | |
tree | e3a89300ae19a3b9f78596f42a05a5926e3ddc1f /sleekxmpp/xmlstream | |
parent | adade2e5eccf5a0c48b0b6541fc3d990d732710c (diff) | |
parent | f97f6e5985b5781ce87a2095b4bf9cccb12ae978 (diff) | |
download | slixmpp-3657bf66363844bf7351ea84279eeb74b0449d5f.tar.gz slixmpp-3657bf66363844bf7351ea84279eeb74b0449d5f.tar.bz2 slixmpp-3657bf66363844bf7351ea84279eeb74b0449d5f.tar.xz slixmpp-3657bf66363844bf7351ea84279eeb74b0449d5f.zip |
Merge branch 'develop' into roster
Diffstat (limited to 'sleekxmpp/xmlstream')
-rw-r--r-- | sleekxmpp/xmlstream/xmlstream.py | 44 |
1 files changed, 25 insertions, 19 deletions
diff --git a/sleekxmpp/xmlstream/xmlstream.py b/sleekxmpp/xmlstream/xmlstream.py index 9e91b5d8..d5c1043b 100644 --- a/sleekxmpp/xmlstream/xmlstream.py +++ b/sleekxmpp/xmlstream/xmlstream.py @@ -16,7 +16,6 @@ import sys import threading import time import types -import signal try: import queue except ImportError: @@ -209,24 +208,6 @@ class XMLStream(object): self.auto_reconnect = True self.is_client = False - try: - if hasattr(signal, 'SIGHUP'): - signal.signal(signal.SIGHUP, self._handle_kill) - if hasattr(signal, 'SIGTERM'): - # Used in Windows - signal.signal(signal.SIGTERM, self._handle_kill) - except: - log.debug("Can not set interrupt signal handlers. " + \ - "SleekXMPP is not running from a main thread.") - - def _handle_kill(self, signum, frame): - """ - Capture kill event and disconnect cleanly after first - spawning the "killed" event. - """ - self.event("killed", direct=True) - self.disconnect() - def new_id(self): """ Generate and return a new stream ID in hexadecimal form. @@ -701,10 +682,12 @@ class XMLStream(object): Event handlers and the send queue will be threaded regardless of this parameter's value. """ + self._thread_excepthook() self.scheduler.process(threaded=True) def start_thread(name, target): self.__thread[name] = threading.Thread(name=name, target=target) + self.__thread[name].daemon = True self.__thread[name].start() for t in range(0, HANDLER_THREADS): @@ -972,3 +955,26 @@ class XMLStream(object): self.disconnect() self.event_queue.put(('quit', None, None)) return + + def _thread_excepthook(self): + """ + If a threaded event handler raises an exception, there is no way to + catch it except with an excepthook. Currently, each thread has its own + excepthook, but ideally we could use the main sys.excepthook. + + Modifies threading.Thread to use sys.excepthook when an exception + is not caught. + """ + init_old = threading.Thread.__init__ + def init(self, *args, **kwargs): + init_old(self, *args, **kwargs) + run_old = self.run + def run_with_except_hook(*args, **kw): + try: + run_old(*args, **kw) + except (KeyboardInterrupt, SystemExit): + raise + except: + sys.excepthook(*sys.exc_info()) + self.run = run_with_except_hook + threading.Thread.__init__ = init |