Skip to content

Commit

Permalink
Merge pull request #3659 from devos50/fix_memory_leaks
Browse files Browse the repository at this point in the history
Fixed memory leaks in GUI and Tribler Core
  • Loading branch information
xoriole committed Jun 1, 2018
2 parents 231125c + a9d6248 commit a088d01
Show file tree
Hide file tree
Showing 19 changed files with 57 additions and 46 deletions.
1 change: 1 addition & 0 deletions Tribler/Core/APIImplementation/LaunchManyCore.py
Original file line number Diff line number Diff line change
Expand Up @@ -205,6 +205,7 @@ def register(self, session, session_lock):

working_directory = unicode(self.session.config.get_state_dir())
self.dispersy = Dispersy(dispersy_endpoint, working_directory)
self.dispersy.statistics.enable_debug_statistics(False)

# register TFTP service
from Tribler.Core.TFTP.handler import TftpHandler
Expand Down
16 changes: 9 additions & 7 deletions Tribler/Core/TorrentChecker/session.py
Original file line number Diff line number Diff line change
Expand Up @@ -462,14 +462,16 @@ def generate_transaction_id(self):
self.transaction_id = transaction_id
break

@staticmethod
def remove_transaction_id(session):
def remove_transaction_id(self):
"""
Removes an session and its corresponding id from the _active_session_dict set.
Removes an session and its corresponding id from the _active_session_dict set and the socket manager.
:param session: The session that needs to be removed from the set.
"""
if session in UdpTrackerSession._active_session_dict:
del UdpTrackerSession._active_session_dict[session]
if self in UdpTrackerSession._active_session_dict:
del UdpTrackerSession._active_session_dict[self]

if self.transaction_id in self.socket_mgr.tracker_sessions:
self.socket_mgr.tracker_sessions.pop(self.transaction_id)

@inlineCallbacks
def cleanup(self):
Expand All @@ -478,7 +480,7 @@ def cleanup(self):
:return: A deferred that fires once the cleanup is done.
"""
yield super(UdpTrackerSession, self).cleanup()
UdpTrackerSession.remove_transaction_id(self)
self.remove_transaction_id()
# Cleanup deferred that fires when everything has been cleaned
# Cancel the resolving ip deferred.
self.ip_resolve_deferred = None
Expand Down Expand Up @@ -632,7 +634,7 @@ def handle_scrape_response(self, response):
response_list.append({'infohash': infohash.encode('hex'), 'seeders': complete, 'leechers': incomplete})

# close this socket and remove its transaction ID from the list
UdpTrackerSession.remove_transaction_id(self)
self.remove_transaction_id()
self._is_finished = True

if self.result_deferred and not self.result_deferred.called:
Expand Down
1 change: 0 additions & 1 deletion Tribler/Test/Community/Tunnel/test_community.py
Original file line number Diff line number Diff line change
Expand Up @@ -116,7 +116,6 @@ def test_readd_bittorrent_peers(self):

self.assertNotIn(mock_torrent, self.nodes[0].overlay.bittorrent_peers)

@blocking_call_on_reactor_thread
def test_remove_circuit(self):
"""
Test removing a circuit
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,9 @@
class FakeUdpSocketManager(object):
transport = 1

def __init__(self):
self.tracker_sessions = {}

def send_request(self, *args):
pass

Expand Down
24 changes: 14 additions & 10 deletions Tribler/community/triblertunnel/community.py
Original file line number Diff line number Diff line change
Expand Up @@ -324,14 +324,6 @@ def remove_circuit(self, circuit_id, additional_info='', remove_now=False, destr
if self.tribler_session:
self.tribler_session.notifier.notify(NTFY_TUNNEL, NTFY_REMOVE, circuit, circuit.sock_addr)

affected_peers = self.dispatcher.circuit_dead(circuit)
ltmgr = self.tribler_session.lm.ltmgr \
if self.tribler_session and self.tribler_session.config.get_libtorrent_enabled() else None
if ltmgr:
for d, s in ltmgr.torrents.values():
if s == ltmgr.get_session(d.get_hops()):
d.get_handle().addCallback(lambda handle: self.update_torrent(affected_peers, handle, d))

circuit_peer = self.get_peer_from_address(circuit.sock_addr)
if circuit.bytes_down >= 1024 * 1024 and self.triblerchain_community and circuit_peer:
# We should perform a payout of the removed circuit.
Expand All @@ -347,9 +339,21 @@ def remove_circuit(self, circuit_id, additional_info='', remove_now=False, destr
self.do_payout(circuit_peer, circuit_id, circuit.bytes_down * (circuit.goal_hops * 2 - 1),
circuit.bytes_down)

def update_torrents(_):
affected_peers = self.dispatcher.circuit_dead(circuit)
ltmgr = self.tribler_session.lm.ltmgr \
if self.tribler_session and self.tribler_session.config.get_libtorrent_enabled() else None
if ltmgr:
for d, s in ltmgr.torrents.values():
if s == ltmgr.get_session(d.get_hops()):
d.get_handle().addCallback(lambda handle, download=d:
self.update_torrent(affected_peers, handle, download))

# Now we actually remove the circuit
super(TriblerTunnelCommunity, self).remove_circuit(circuit_id, additional_info=additional_info,
remove_now=remove_now, destroy=destroy)
remove_deferred = super(TriblerTunnelCommunity, self)\
.remove_circuit(circuit_id, additional_info=additional_info, remove_now=remove_now, destroy=destroy)
remove_deferred.addCallback(update_torrents)
return remove_deferred

def remove_relay(self, circuit_id, additional_info='', remove_now=False, destroy=False, got_destroy_from=None,
both_sides=True):
Expand Down
4 changes: 2 additions & 2 deletions TriblerGUI/dialogs/confirmationdialog.py
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ def show_error(cls, window, title, error_text):
error_dialog = ConfirmationDialog(window, title, error_text, [('CLOSE', BUTTON_TYPE_NORMAL)])

def on_close():
error_dialog.setParent(None)
error_dialog.close_dialog()

error_dialog.button_clicked.connect(on_close)
error_dialog.show()
Expand All @@ -57,7 +57,7 @@ def show_message(cls, window, title, message_text, button_text):
error_dialog = ConfirmationDialog(window, title, message_text, [(button_text, BUTTON_TYPE_NORMAL)])

def on_close():
error_dialog.setParent(None)
error_dialog.close_dialog()

error_dialog.button_clicked.connect(on_close)
error_dialog.show()
Expand Down
4 changes: 4 additions & 0 deletions TriblerGUI/dialogs/dialogcontainer.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,10 @@ def paintEvent(self, _):

def close_dialog(self):
self.setParent(None)
try:
self.deleteLater()
except RuntimeError:
pass

def on_main_window_resize(self):
if not self.parentWidget():
Expand Down
1 change: 0 additions & 1 deletion TriblerGUI/dialogs/startdownloaddialog.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,6 @@ def __init__(self, parent, download_uri):

self.download_uri = download_uri
self.has_metainfo = False
gui_settings = self.window().gui_settings

uic.loadUi(get_ui_file_path('startdownloaddialog.ui'), self.dialog_widget)

Expand Down
2 changes: 1 addition & 1 deletion TriblerGUI/tribler_request_manager.py
Original file line number Diff line number Diff line change
Expand Up @@ -273,7 +273,7 @@ def show_error(self, error_text):
main_text, [('CLOSE', BUTTON_TYPE_NORMAL)])

def on_close():
error_dialog.setParent(None)
error_dialog.close_dialog()

error_dialog.button_clicked.connect(on_close)
error_dialog.show()
Expand Down
11 changes: 5 additions & 6 deletions TriblerGUI/tribler_window.py
Original file line number Diff line number Diff line change
Expand Up @@ -417,7 +417,7 @@ def on_new_version_dialog_done(self, version, action):
import webbrowser
webbrowser.open("https://tribler.org")

self.new_version_dialog.setParent(None)
self.new_version_dialog.close_dialog()
self.new_version_dialog = None

def on_search_text_change(self, text):
Expand Down Expand Up @@ -557,8 +557,7 @@ def start_download_from_uri(self, uri):
if get_gui_setting(self.gui_settings, "ask_download_settings", True, is_bool=True):
# Clear any previous dialog if exists
if self.dialog:
self.dialog.button_clicked.disconnect()
self.dialog.setParent(None)
self.dialog.close_dialog()
self.dialog = None

self.dialog = StartDownloadDialog(self, self.download_uri)
Expand Down Expand Up @@ -596,7 +595,7 @@ def on_start_download_action(self, action):
logging.exception("Error while trying to download. Either dialog or dialog.dialog_widget is None")

self.dialog.request_mgr.cancel_request() # To abort the torrent info request
self.dialog.setParent(None)
self.dialog.close_dialog()
self.dialog = None
self.start_download_dialog_active = False

Expand Down Expand Up @@ -630,7 +629,7 @@ def on_confirm_add_directory_dialog(self, action):
self.tribler_settings['download_defaults']['saveas'], [], 0)

if self.dialog:
self.dialog.setParent(None)
self.dialog.close_dialog()
self.dialog = None

def on_add_torrent_from_url(self):
Expand All @@ -651,7 +650,7 @@ def on_torrent_from_url_dialog_done(self, action):
uri = self.dialog.dialog_widget.dialog_input.text()

# Remove first dialog
self.dialog.setParent(None)
self.dialog.close_dialog()
self.dialog = None

if action == 0:
Expand Down
2 changes: 1 addition & 1 deletion TriblerGUI/widgets/createtorrentpage.py
Original file line number Diff line number Diff line change
Expand Up @@ -94,7 +94,7 @@ def on_create_clicked(self):
self.window().edit_channel_create_torrent_progress_label.show()

def on_dialog_ok_clicked(self, _):
self.dialog.setParent(None)
self.dialog.close_dialog()
self.dialog = None

def on_torrent_created(self, result):
Expand Down
4 changes: 2 additions & 2 deletions TriblerGUI/widgets/downloadspage.py
Original file line number Diff line number Diff line change
Expand Up @@ -323,7 +323,7 @@ def on_remove_download_dialog(self, action):
self.request_mgr.perform_request("downloads/%s" % infohash, self.on_download_removed,
method='DELETE', data="remove_data=%d" % action)

self.dialog.setParent(None)
self.dialog.close_dialog()
self.dialog = None

def on_download_removed(self, json_result):
Expand Down Expand Up @@ -378,7 +378,7 @@ def on_export_download_dialog_done(self, action):
self.request_mgr.download_file("downloads/%s/torrent" % self.selected_item.download_info['infohash'],
lambda data: self.on_export_download_request_done(filename, data))

self.dialog.setParent(None)
self.dialog.close_dialog()
self.dialog = None

def on_export_download_request_done(self, filename, data):
Expand Down
14 changes: 7 additions & 7 deletions TriblerGUI/widgets/editchannelpage.py
Original file line number Diff line number Diff line change
Expand Up @@ -275,7 +275,7 @@ def on_torrent_from_url_dialog_done(self, action):
(self.channel_overview['identifier'], url),
self.on_torrent_to_channel_added, method='PUT')

self.dialog.setParent(None)
self.dialog.close_dialog()
self.dialog = None

def on_torrent_to_channel_added(self, result):
Expand Down Expand Up @@ -340,7 +340,7 @@ def on_playlist_torrent_remove_selected_action(self, item, action):
result, item.torrent_info),
method='DELETE')

self.dialog.setParent(None)
self.dialog.close_dialog()
self.dialog = None

def on_playlist_torrent_removed(self, result, torrent):
Expand Down Expand Up @@ -431,7 +431,7 @@ def on_playlist_remove_selected_action(self, item, action):
item.playlist_info['id']),
self.on_playlist_removed, method='DELETE')

self.dialog.setParent(None)
self.dialog.close_dialog()
self.dialog = None

def on_playlist_removed(self, json_result):
Expand All @@ -458,7 +458,7 @@ def on_torrents_remove_selected_action(self, action, items):
infohash),
self.on_torrent_removed, method='DELETE')

self.dialog.setParent(None)
self.dialog.close_dialog()
self.dialog = None

def on_torrent_removed(self, json_result):
Expand All @@ -477,7 +477,7 @@ def on_torrents_remove_all_action(self, action):

self.window().edit_channel_torrents_list.set_data_items([])

self.dialog.setParent(None)
self.dialog.close_dialog()
self.dialog = None

def clicked_tab_button(self, tab_button_name):
Expand Down Expand Up @@ -516,7 +516,7 @@ def on_rss_feed_dialog_added(self, action):
(self.channel_overview["identifier"], url),
self.on_rss_feed_added, method='PUT')

self.dialog.setParent(None)
self.dialog.close_dialog()
self.dialog = None

def on_rss_feed_added(self, json_result):
Expand All @@ -542,7 +542,7 @@ def on_rss_feed_dialog_removed(self, action):
(self.channel_overview["identifier"], url),
self.on_rss_feed_removed, method='DELETE')

self.dialog.setParent(None)
self.dialog.close_dialog()
self.dialog = None

def on_rss_feed_removed(self, json_result):
Expand Down
2 changes: 1 addition & 1 deletion TriblerGUI/widgets/marketorderspage.py
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,7 @@ def on_confirm_cancel_order(self, action):
self.request_mgr.perform_request("market/orders/%s/cancel" % self.selected_item.order['order_number'],
self.on_order_cancelled, method='POST')

self.dialog.setParent(None)
self.dialog.close_dialog()
self.dialog = None

def on_order_cancelled(self, response):
Expand Down
4 changes: 2 additions & 2 deletions TriblerGUI/widgets/marketpage.py
Original file line number Diff line number Diff line change
Expand Up @@ -244,7 +244,7 @@ def on_iom_input(self, action):
self.request_mgr = TriblerRequestManager()
self.request_mgr.perform_request("iominput", None, data=urlencode(post_data), method='POST')

self.dialog.setParent(None)
self.dialog.close_dialog()
self.dialog = None

def create_order(self, is_ask, price, price_type, quantity, quantity_type):
Expand Down Expand Up @@ -333,7 +333,7 @@ def on_new_order_action(self, action):
self.create_order(self.dialog.is_ask, self.dialog.price, self.dialog.price_type,
self.dialog.quantity, self.dialog.quantity_type)

self.dialog.setParent(None)
self.dialog.close_dialog()
self.dialog = None

def on_ask_timeout(self, ask):
Expand Down
4 changes: 2 additions & 2 deletions TriblerGUI/widgets/marketwalletspage.py
Original file line number Diff line number Diff line change
Expand Up @@ -178,7 +178,7 @@ def on_create_btc_wallet_dialog_done(self, action, wallet_id):
password = self.dialog.dialog_widget.dialog_input.text()

if action == 1: # Remove the dialog right now
self.dialog.setParent(None)
self.dialog.close_dialog()
self.dialog = None
elif action == 0:
self.dialog.buttons[0].setEnabled(False)
Expand All @@ -191,6 +191,6 @@ def on_create_btc_wallet_dialog_done(self, action, wallet_id):

def on_wallet_created(self, response):
if self.dialog:
self.dialog.setParent(None)
self.dialog.close_dialog()
self.dialog = None
self.load_wallets()
2 changes: 1 addition & 1 deletion TriblerGUI/widgets/settingspage.py
Original file line number Diff line number Diff line change
Expand Up @@ -429,5 +429,5 @@ def on_settings_saved(self, _):

def on_dialog_cancel_clicked(self, _):
self.window().settings_save_button.setEnabled(True)
self.saved_dialog.setParent(None)
self.saved_dialog.close_dialog()
self.saved_dialog = None
2 changes: 1 addition & 1 deletion TriblerGUI/widgets/subscribedchannelspage.py
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ def on_subscription_added(self, action):
self.request_mgr.perform_request("channels/subscribed/%s" % self.dialog.dialog_widget.dialog_input.text(),
self.on_channel_subscribed, method='PUT')

self.dialog.setParent(None)
self.dialog.close_dialog()
self.dialog = None

def on_channel_subscribed(self, _):
Expand Down

0 comments on commit a088d01

Please sign in to comment.