From f33fc331cef379ded0196a16d035a156fc5213e4 Mon Sep 17 00:00:00 2001 From: Jari Sundell Date: Thu, 13 Mar 2025 14:15:12 +0100 Subject: [PATCH] Thread-safe improvements to dht/tracker code and reorganized thread objects. --- src/core/curl_socket.cc | 9 +++---- src/display/window_log.cc | 42 ++++---------------------------- src/main.cc | 4 ++-- src/rpc/scgi.cc | 44 ++++------------------------------ src/thread_base.h | 40 ++----------------------------- src/ui/element_log_complete.cc | 44 ++++------------------------------ 6 files changed, 23 insertions(+), 160 deletions(-) diff --git a/src/core/curl_socket.cc b/src/core/curl_socket.cc index ae4c4d39..b7b5af66 100644 --- a/src/core/curl_socket.cc +++ b/src/core/curl_socket.cc @@ -1,11 +1,13 @@ #include "config.h" +#include + #include #include #include #include -#include +#include #include "control.h" @@ -15,7 +17,7 @@ namespace core { int -CurlSocket::receive_socket(void* easy_handle, curl_socket_t fd, int what, void* userp, void* socketp) { +CurlSocket::receive_socket([[maybe_unused]] void* easy_handle, curl_socket_t fd, int what, void* userp, void* socketp) { CurlStack* stack = (CurlStack*)userp; CurlSocket* socket = (CurlSocket*)socketp; @@ -58,8 +60,7 @@ CurlSocket::receive_socket(void* easy_handle, curl_socket_t fd, int what, void* } CurlSocket::~CurlSocket() { - if (m_fileDesc != -1) - throw torrent::internal_error("CurlSocket::~CurlSocket() m_fileDesc != -1."); + assert(m_fileDesc == -1 && "CurlSocket::~CurlSocket() m_fileDesc != -1."); } void diff --git a/src/display/window_log.cc b/src/display/window_log.cc index d6146e8e..4b1e6c05 100644 --- a/src/display/window_log.cc +++ b/src/display/window_log.cc @@ -1,44 +1,8 @@ -// rTorrent - BitTorrent client -// Copyright (C) 2005-2011, Jari Sundell -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation; either version 2 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// In addition, as a special exception, the copyright holders give -// permission to link the code of portions of this program with the -// OpenSSL library under certain conditions as described in each -// individual source file, and distribute linked combinations -// including the two. -// -// You must obey the GNU General Public License in all respects for -// all of the code used other than OpenSSL. If you modify file(s) -// with this exception, you may extend this exception to your version -// of the file(s), but you are not obligated to do so. If you do not -// wish to do so, delete this exception statement from your version. -// If you delete this exception statement from all source files in the -// program, then also delete it here. -// -// Contact: Jari Sundell -// -// Skomakerveien 33 -// 3185 Skoppum, NORWAY - #include "config.h" #include #include -#include +#include #include "canvas.h" #include "utils.h" @@ -54,7 +18,9 @@ WindowLog::WindowLog(torrent::log_buffer* l) : unsigned int signal_index = torrent::main_thread()->signal_bitfield()->add_signal(std::bind(&WindowLog::receive_update, this)); - m_log->lock_and_set_update_slot(std::bind(&torrent::thread_base::send_event_signal, torrent::main_thread(), signal_index, false)); + m_log->lock_and_set_update_slot([signal_index]() { + torrent::main_thread()->send_event_signal(signal_index, false); + }); } WindowLog::~WindowLog() { diff --git a/src/main.cc b/src/main.cc index 0d9959c6..d7fba5b1 100644 --- a/src/main.cc +++ b/src/main.cc @@ -182,7 +182,7 @@ main(int argc, char** argv) { // platforms that do not properly pass signals to the target // threads. Use '--enable-interrupt-socket' when configuring // LibTorrent to enable this workaround. - if (torrent::thread_base::should_handle_sigusr1()) + if (torrent::utils::Thread::should_handle_sigusr1()) SignalHandler::set_handler(SIGUSR1, std::bind(&do_nothing)); torrent::log_add_group_output(torrent::LOG_NOTICE, "important"); @@ -457,7 +457,7 @@ main(int argc, char** argv) { rpc::commands.call_catch("event.system.startup_done", rpc::make_target(), "startup_done", "System startup_done event action failed: "); - torrent::thread_base::event_loop(torrent::main_thread()); + torrent::utils::Thread::event_loop(torrent::main_thread()); control->core()->download_list()->session_save(); control->cleanup(); diff --git a/src/rpc/scgi.cc b/src/rpc/scgi.cc index 361ca478..1c073c39 100644 --- a/src/rpc/scgi.cc +++ b/src/rpc/scgi.cc @@ -1,39 +1,3 @@ -// rTorrent - BitTorrent client -// Copyright (C) 2005-2011, Jari Sundell -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation; either version 2 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// In addition, as a special exception, the copyright holders give -// permission to link the code of portions of this program with the -// OpenSSL library under certain conditions as described in each -// individual source file, and distribute linked combinations -// including the two. -// -// You must obey the GNU General Public License in all respects for -// all of the code used other than OpenSSL. If you modify file(s) -// with this exception, you may extend this exception to your version -// of the file(s), but you are not obligated to do so. If you do not -// wish to do so, delete this exception statement from your version. -// If you delete this exception statement from all source files in the -// program, then also delete it here. -// -// Contact: Jari Sundell -// -// Skomakerveien 33 -// 3185 Skoppum, NORWAY - #include "config.h" #include "rpc/scgi_task.h" @@ -150,7 +114,7 @@ SCgi::event_read() { fd.close(); continue; } - + task->open(this, fd.get_fd()); } } @@ -168,7 +132,8 @@ SCgi::event_error() { bool SCgi::receive_call(SCgiTask* task, const char* buffer, uint32_t length) { bool result = false; - torrent::thread_base::acquire_global_lock(); + + torrent::utils::Thread::acquire_global_lock(); torrent::main_thread()->interrupt(); switch (task->content_type()) { @@ -178,8 +143,9 @@ SCgi::receive_call(SCgiTask* task, const char* buffer, uint32_t length) { case rpc::SCgiTask::ContentType::XML: result = rpc.process(RpcManager::RPCType::XML, buffer, length, [task](const char* b, uint32_t l) { return task->receive_write(b, l); }); break; + } - torrent::thread_base::release_global_lock(); + torrent::utils::Thread::release_global_lock(); return result; } diff --git a/src/thread_base.h b/src/thread_base.h index f8d7e855..cf825ab3 100644 --- a/src/thread_base.h +++ b/src/thread_base.h @@ -1,46 +1,10 @@ -// libTorrent - BitTorrent library -// Copyright (C) 2005-2011, Jari Sundell -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation; either version 2 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// In addition, as a special exception, the copyright holders give -// permission to link the code of portions of this program with the -// OpenSSL library under certain conditions as described in each -// individual source file, and distribute linked combinations -// including the two. -// -// You must obey the GNU General Public License in all respects for -// all of the code used other than OpenSSL. If you modify file(s) -// with this exception, you may extend this exception to your version -// of the file(s), but you are not obligated to do so. If you do not -// wish to do so, delete this exception statement from your version. -// If you delete this exception statement from all source files in the -// program, then also delete it here. -// -// Contact: Jari Sundell -// -// Skomakerveien 33 -// 3185 Skoppum, NORWAY - #ifndef RTORRENT_UTILS_THREAD_BASE_H #define RTORRENT_UTILS_THREAD_BASE_H #include #include #include -#include +#include #include "rak/priority_queue_default.h" #include "core/poll_manager.h" @@ -49,7 +13,7 @@ class thread_queue_hack; -class ThreadBase : public torrent::thread_base { +class ThreadBase : public torrent::utils::Thread { public: typedef rak::priority_queue_default priority_queue; typedef void (*thread_base_func)(ThreadBase*); diff --git a/src/ui/element_log_complete.cc b/src/ui/element_log_complete.cc index d2697824..d3607fda 100644 --- a/src/ui/element_log_complete.cc +++ b/src/ui/element_log_complete.cc @@ -1,44 +1,8 @@ -// rTorrent - BitTorrent client -// Copyright (C) 2005-2011, Jari Sundell -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation; either version 2 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// In addition, as a special exception, the copyright holders give -// permission to link the code of portions of this program with the -// OpenSSL library under certain conditions as described in each -// individual source file, and distribute linked combinations -// including the two. -// -// You must obey the GNU General Public License in all respects for -// all of the code used other than OpenSSL. If you modify file(s) -// with this exception, you may extend this exception to your version -// of the file(s), but you are not obligated to do so. If you do not -// wish to do so, delete this exception statement from your version. -// If you delete this exception statement from all source files in the -// program, then also delete it here. -// -// Contact: Jari Sundell -// -// Skomakerveien 33 -// 3185 Skoppum, NORWAY - #include "config.h" #include #include -#include +#include #include "display/frame.h" #include "display/manager.h" @@ -56,11 +20,13 @@ ElementLogComplete::ElementLogComplete(torrent::log_buffer* l) : unsigned int signal_index = torrent::main_thread()->signal_bitfield()->add_signal(std::bind(&ElementLogComplete::received_update, this)); - m_log->lock_and_set_update_slot(std::bind(&torrent::thread_base::send_event_signal, torrent::main_thread(), signal_index, false)); + m_log->lock_and_set_update_slot([signal_index]() { + torrent::main_thread()->send_event_signal(signal_index, false); + }); } void -ElementLogComplete::activate(display::Frame* frame, bool focus) { +ElementLogComplete::activate(display::Frame* frame, [[maybe_unused]] bool focus) { if (is_active()) throw torrent::internal_error("ui::ElementLogComplete::activate(...) is_active().");