summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndrew Resch <andrewresch@gmail.com>2009-03-05 00:28:34 +0000
committerAndrew Resch <andrewresch@gmail.com>2009-03-05 00:28:34 +0000
commit8001d5e16507fd702ace5cca8a32f5a23f77363d (patch)
treecc5ac2b1b578eeabb0aa7ba984879060981edb67
parent9728d1d8318a1d77bbecfea13c2007810c1527e8 (diff)
downloaddeluge-8001d5e16507fd702ace5cca8a32f5a23f77363d.tar.gz
deluge-8001d5e16507fd702ace5cca8a32f5a23f77363d.tar.bz2
deluge-8001d5e16507fd702ace5cca8a32f5a23f77363d.zip
Change SignalReceiver to use non-blocking socket
-rw-r--r--ChangeLog1
-rw-r--r--deluge/ui/signalreceiver.py55
2 files changed, 17 insertions, 39 deletions
diff --git a/ChangeLog b/ChangeLog
index 71039910b..fa05f330b 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -9,6 +9,7 @@
* Fix the allocate mode not being preserved when selecting different torrents in addtorrentdialog
* Fix #655 issue where default torrent options wouldn't be set for new torrents added to the addtorrentdialog
* Fix #817 email notifications fail to substitute format strings
+ * Change SignalReceiver to use non-blocking socket
=== Deluge 1.1.3 - (15 February 2009) ===
==== Core ====
diff --git a/deluge/ui/signalreceiver.py b/deluge/ui/signalreceiver.py
index 4353e5b59..d7fd8b6c4 100644
--- a/deluge/ui/signalreceiver.py
+++ b/deluge/ui/signalreceiver.py
@@ -45,7 +45,6 @@ class SignalReceiver(ThreadingMixIn, SimpleXMLRPCServer.SimpleXMLRPCServer):
# Set to true so that the receiver thread will exit
self.signals = {}
- self.emitted_signals = []
self.remote = False
@@ -78,10 +77,20 @@ class SignalReceiver(ThreadingMixIn, SimpleXMLRPCServer.SimpleXMLRPCServer):
# Register the emit_signal function
self.register_function(self.emit_signal)
+ self.socket.setblocking(False)
+
+ gobject.io_add_watch(self.socket.fileno(), gobject.IO_IN | gobject.IO_OUT | gobject.IO_PRI | gobject.IO_ERR | gobject.IO_HUP, self._on_socket_activity)
+ #gobject.timeout_add(50, self.handle_signals)
+
+ def _on_socket_activity(self, source, condition):
+ """This gets called when there is activity on the socket, ie, data to read
+ or to write."""
+ self.handle_request()
+ return True
+
def shutdown(self):
"""Shutdowns receiver thread"""
log.debug("Shutting down signalreceiver")
- self._shutdown = True
# De-register with the daemon so it doesn't try to send us more signals
try:
client.deregister_client()
@@ -89,11 +98,6 @@ class SignalReceiver(ThreadingMixIn, SimpleXMLRPCServer.SimpleXMLRPCServer):
except Exception, e:
log.debug("Unable to deregister client from server: %s", e)
- self.socket.shutdown(socket.SHUT_RDWR)
- log.debug("Joining listening thread..")
- self.listening_thread.join(1.0)
- return
-
def set_remote(self, remote):
self.remote = remote
self.start_server(self.port)
@@ -101,46 +105,20 @@ class SignalReceiver(ThreadingMixIn, SimpleXMLRPCServer.SimpleXMLRPCServer):
def run(self):
"""This gets called when we start the thread"""
# Register the signal receiver with the core
- self._shutdown = False
client.register_client(str(self.port))
- self.listening_thread = threading.Thread(target=self.handle_thread)
-
- gobject.timeout_add(50, self.handle_signals)
-
- try:
- self.listening_thread.start()
- except Exception, e:
- log.debug("Thread: %s", e)
-
- def handle_thread(self):
- try:
- while not self._shutdown:
- self.handle_request()
- self._shutdown = False
- except Exception, e:
- log.debug("handle_thread: %s", e)
-
def get_port(self):
"""Get the port that the SignalReceiver is listening on"""
return self.port
def emit_signal(self, signal, *data):
"""Exported method used by the core to emit a signal to the client"""
- self.emitted_signals.append((signal, data))
- return
-
- def handle_signals(self):
- for signal, data in self.emitted_signals:
- try:
- for callback in self.signals[signal]:
- gobject.idle_add(callback, *data)
-
- except Exception, e:
- log.warning("Unable to call callback for signal %s: %s", signal, e)
+ try:
+ for callback in self.signals[signal]:
+ gobject.idle_add(callback, *data)
- self.emitted_signals = []
- return True
+ except Exception, e:
+ log.warning("Unable to call callback for signal %s: %s", signal, e)
def connect_to_signal(self, signal, callback):
"""Connect to a signal"""
@@ -149,4 +127,3 @@ class SignalReceiver(ThreadingMixIn, SimpleXMLRPCServer.SimpleXMLRPCServer):
self.signals[signal].append(callback)
except KeyError:
self.signals[signal] = [callback]
-