summaryrefslogtreecommitdiff
path: root/sleekxmpp/xmlstream/xmlstream.py
diff options
context:
space:
mode:
authorLance Stout <lancestout@gmail.com>2010-12-21 11:33:40 -0500
committerLance Stout <lancestout@gmail.com>2010-12-21 11:33:40 -0500
commit3657bf66363844bf7351ea84279eeb74b0449d5f (patch)
treee3a89300ae19a3b9f78596f42a05a5926e3ddc1f /sleekxmpp/xmlstream/xmlstream.py
parentadade2e5eccf5a0c48b0b6541fc3d990d732710c (diff)
parentf97f6e5985b5781ce87a2095b4bf9cccb12ae978 (diff)
downloadslixmpp-3657bf66363844bf7351ea84279eeb74b0449d5f.tar.gz
slixmpp-3657bf66363844bf7351ea84279eeb74b0449d5f.tar.bz2
slixmpp-3657bf66363844bf7351ea84279eeb74b0449d5f.tar.xz
slixmpp-3657bf66363844bf7351ea84279eeb74b0449d5f.zip
Merge branch 'develop' into roster
Diffstat (limited to 'sleekxmpp/xmlstream/xmlstream.py')
-rw-r--r--sleekxmpp/xmlstream/xmlstream.py44
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