From 7986321a526ccd7efcb0a2c46341de282c7cb764 Mon Sep 17 00:00:00 2001 From: SChernykh Date: Thu, 31 Aug 2023 17:11:12 +0200 Subject: [PATCH] Fixed console commands startup --- src/console_commands.cpp | 75 ++++++++++++++++++++++++---------------- src/tcp_server.cpp | 7 +++- src/tcp_server.h | 1 + 3 files changed, 52 insertions(+), 31 deletions(-) diff --git a/src/console_commands.cpp b/src/console_commands.cpp index 041d218..8c82068 100644 --- a/src/console_commands.cpp +++ b/src/console_commands.cpp @@ -47,30 +47,6 @@ ConsoleCommands::ConsoleCommands(p2pool* pool) LOGINFO(3, "uv_guess_handle returned " << static_cast(stdin_type)); if (stdin_type != UV_TTY && stdin_type != UV_NAMED_PIPE) { LOGERR(1, "tty or named pipe is not available"); - throw std::exception(); - } - - std::random_device rd; - - for (int i = 0; i < 10; ++i) { - if (start_listening(false, "127.0.0.1", 49152 + (rd() % 16384))) { - break; - } - } - - if (m_listenPort < 0) { - LOGERR(1, "failed to listen on TCP port"); - throw std::exception(); - } - - if (m_pool->api() && m_pool->params().m_localStats) { - m_pool->api()->set(p2pool_api::Category::LOCAL, "console", - [stdin_type, this](log::Stream& s) - { - s << "{\"mode\":" << ((stdin_type == UV_TTY) ? "\"tty\"" : "\"pipe\"") - << ",\"tcp_port\":" << m_listenPort - << "}"; - }); } int err; @@ -84,7 +60,7 @@ ConsoleCommands::ConsoleCommands(p2pool* pool) } m_stdin_handle = reinterpret_cast(&m_tty); } - else { + else if (stdin_type == UV_NAMED_PIPE) { LOGINFO(3, "processing stdin as UV_NAMED_PIPE"); err = uv_pipe_init(&m_loop, &m_stdin_pipe, 0); if (err) { @@ -98,19 +74,56 @@ ConsoleCommands::ConsoleCommands(p2pool* pool) throw std::exception(); } } - m_stdin_handle->data = this; - err = uv_read_start(m_stdin_handle, allocCallback, stdinReadCallback); - if (err) { - LOGERR(1, "uv_read_start failed, error " << uv_err_name(err)); + if (m_stdin_handle) { + m_stdin_handle->data = this; + err = uv_read_start(m_stdin_handle, allocCallback, stdinReadCallback); + if (err) { + LOGERR(1, "uv_read_start failed, error " << uv_err_name(err)); + throw std::exception(); + } + } + + std::random_device rd; + + for (int i = 0; i < 10; ++i) { + if (start_listening(false, "127.0.0.1", 49152 + (rd() % 16384))) { + break; + } + } + + if (m_listenPort < 0) { + LOGERR(1, "failed to listen on TCP port"); throw std::exception(); } + if (m_pool->api() && m_pool->params().m_localStats) { + m_pool->api()->set(p2pool_api::Category::LOCAL, "console", + [stdin_type, this](log::Stream& s) + { + s << "{\"mode\":\""; + + if (stdin_type == UV_TTY) { + s << "tty"; + } + else if (stdin_type == UV_NAMED_PIPE) { + s << "pipe"; + } + else { + s << static_cast(stdin_type); + } + + s << "\",\"tcp_port\":" << m_listenPort << '}'; + }); + } + err = uv_thread_create(&m_loopThread, loop, this); if (err) { LOGERR(1, "failed to start event loop thread, error " << uv_err_name(err)); throw std::exception(); } + + m_loopThreadCreated = true; } ConsoleCommands::~ConsoleCommands() @@ -120,7 +133,9 @@ ConsoleCommands::~ConsoleCommands() void ConsoleCommands::on_shutdown() { - uv_close(reinterpret_cast(m_stdin_handle), nullptr); + if (m_stdin_handle) { + uv_close(reinterpret_cast(m_stdin_handle), nullptr); + } } const char* ConsoleCommands::get_log_category() const diff --git a/src/tcp_server.cpp b/src/tcp_server.cpp index 8e0793e..becd7e5 100644 --- a/src/tcp_server.cpp +++ b/src/tcp_server.cpp @@ -27,6 +27,7 @@ TCPServer::TCPServer(int default_backlog, allocate_client_callback allocate_new_ : m_allocateNewClient(allocate_new_client) , m_defaultBacklog(default_backlog) , m_loopThread{} + , m_loopThreadCreated(false) #ifdef WITH_UPNP , m_portMapping(0) #endif @@ -250,6 +251,8 @@ void TCPServer::start_listening(const std::string& listen_addresses, bool upnp) LOGERR(1, "failed to start event loop thread, error " << uv_err_name(err)); PANIC_STOP(); } + + m_loopThreadCreated = true; } bool TCPServer::connect_to_peer(bool is_v6, const char* ip, int port) @@ -473,7 +476,9 @@ void TCPServer::shutdown_tcp() } #endif - uv_thread_join(&m_loopThread); + if (m_loopThreadCreated) { + uv_thread_join(&m_loopThread); + } uv_mutex_destroy(&m_bansLock); diff --git a/src/tcp_server.h b/src/tcp_server.h index 20c7d53..489bc85 100644 --- a/src/tcp_server.h +++ b/src/tcp_server.h @@ -149,6 +149,7 @@ protected: int m_defaultBacklog; uv_thread_t m_loopThread; + std::atomic m_loopThreadCreated; static void loop(void* data);