mirror of
https://git.deluge-torrent.org/deluge
synced 2025-08-04 15:38:43 +00:00
Change SignalReceiver to use non-blocking socket
This commit is contained in:
parent
9728d1d831
commit
8001d5e165
2 changed files with 17 additions and 39 deletions
|
@ -9,6 +9,7 @@
|
||||||
* Fix the allocate mode not being preserved when selecting different torrents in addtorrentdialog
|
* 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 #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
|
* Fix #817 email notifications fail to substitute format strings
|
||||||
|
* Change SignalReceiver to use non-blocking socket
|
||||||
|
|
||||||
=== Deluge 1.1.3 - (15 February 2009) ===
|
=== Deluge 1.1.3 - (15 February 2009) ===
|
||||||
==== Core ====
|
==== Core ====
|
||||||
|
|
|
@ -45,7 +45,6 @@ class SignalReceiver(ThreadingMixIn, SimpleXMLRPCServer.SimpleXMLRPCServer):
|
||||||
# Set to true so that the receiver thread will exit
|
# Set to true so that the receiver thread will exit
|
||||||
|
|
||||||
self.signals = {}
|
self.signals = {}
|
||||||
self.emitted_signals = []
|
|
||||||
|
|
||||||
self.remote = False
|
self.remote = False
|
||||||
|
|
||||||
|
@ -78,10 +77,20 @@ class SignalReceiver(ThreadingMixIn, SimpleXMLRPCServer.SimpleXMLRPCServer):
|
||||||
# Register the emit_signal function
|
# Register the emit_signal function
|
||||||
self.register_function(self.emit_signal)
|
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):
|
def shutdown(self):
|
||||||
"""Shutdowns receiver thread"""
|
"""Shutdowns receiver thread"""
|
||||||
log.debug("Shutting down signalreceiver")
|
log.debug("Shutting down signalreceiver")
|
||||||
self._shutdown = True
|
|
||||||
# De-register with the daemon so it doesn't try to send us more signals
|
# De-register with the daemon so it doesn't try to send us more signals
|
||||||
try:
|
try:
|
||||||
client.deregister_client()
|
client.deregister_client()
|
||||||
|
@ -89,11 +98,6 @@ class SignalReceiver(ThreadingMixIn, SimpleXMLRPCServer.SimpleXMLRPCServer):
|
||||||
except Exception, e:
|
except Exception, e:
|
||||||
log.debug("Unable to deregister client from server: %s", 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):
|
def set_remote(self, remote):
|
||||||
self.remote = remote
|
self.remote = remote
|
||||||
self.start_server(self.port)
|
self.start_server(self.port)
|
||||||
|
@ -101,46 +105,20 @@ class SignalReceiver(ThreadingMixIn, SimpleXMLRPCServer.SimpleXMLRPCServer):
|
||||||
def run(self):
|
def run(self):
|
||||||
"""This gets called when we start the thread"""
|
"""This gets called when we start the thread"""
|
||||||
# Register the signal receiver with the core
|
# Register the signal receiver with the core
|
||||||
self._shutdown = False
|
|
||||||
client.register_client(str(self.port))
|
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):
|
def get_port(self):
|
||||||
"""Get the port that the SignalReceiver is listening on"""
|
"""Get the port that the SignalReceiver is listening on"""
|
||||||
return self.port
|
return self.port
|
||||||
|
|
||||||
def emit_signal(self, signal, *data):
|
def emit_signal(self, signal, *data):
|
||||||
"""Exported method used by the core to emit a signal to the client"""
|
"""Exported method used by the core to emit a signal to the client"""
|
||||||
self.emitted_signals.append((signal, data))
|
try:
|
||||||
return
|
for callback in self.signals[signal]:
|
||||||
|
gobject.idle_add(callback, *data)
|
||||||
|
|
||||||
def handle_signals(self):
|
except Exception, e:
|
||||||
for signal, data in self.emitted_signals:
|
log.warning("Unable to call callback for signal %s: %s", signal, e)
|
||||||
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)
|
|
||||||
|
|
||||||
self.emitted_signals = []
|
|
||||||
return True
|
|
||||||
|
|
||||||
def connect_to_signal(self, signal, callback):
|
def connect_to_signal(self, signal, callback):
|
||||||
"""Connect to a signal"""
|
"""Connect to a signal"""
|
||||||
|
@ -149,4 +127,3 @@ class SignalReceiver(ThreadingMixIn, SimpleXMLRPCServer.SimpleXMLRPCServer):
|
||||||
self.signals[signal].append(callback)
|
self.signals[signal].append(callback)
|
||||||
except KeyError:
|
except KeyError:
|
||||||
self.signals[signal] = [callback]
|
self.signals[signal] = [callback]
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue