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 | 91 +++++++++++++++++++++++----------------- src/tcp_server.cpp | 7 +++- src/tcp_server.h | 1 + 3 files changed, 60 insertions(+), 39 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,7 +47,41 @@ 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(); + } + + int err; + + if (stdin_type == UV_TTY) { + LOGINFO(3, "processing stdin as UV_TTY"); + err = uv_tty_init(&m_loop, &m_tty, 0, 1); + if (err) { + LOGERR(1, "uv_tty_init failed, error " << uv_err_name(err)); + throw std::exception(); + } + m_stdin_handle = reinterpret_cast(&m_tty); + } + 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) { + LOGERR(1, "uv_pipe_init failed, error " << uv_err_name(err)); + throw std::exception(); + } + m_stdin_handle = reinterpret_cast(&m_stdin_pipe); + err = uv_pipe_open(&m_stdin_pipe, 0); + if (err) { + LOGERR(1, "uv_pipe_open failed, error " << uv_err_name(err)); + throw std::exception(); + } + } + + 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; @@ -67,50 +101,29 @@ ConsoleCommands::ConsoleCommands(p2pool* pool) 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 - << "}"; + 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 << '}'; }); } - int err; - - if (stdin_type == UV_TTY) { - LOGINFO(3, "processing stdin as UV_TTY"); - err = uv_tty_init(&m_loop, &m_tty, 0, 1); - if (err) { - LOGERR(1, "uv_tty_init failed, error " << uv_err_name(err)); - throw std::exception(); - } - m_stdin_handle = reinterpret_cast(&m_tty); - } - else { - LOGINFO(3, "processing stdin as UV_NAMED_PIPE"); - err = uv_pipe_init(&m_loop, &m_stdin_pipe, 0); - if (err) { - LOGERR(1, "uv_pipe_init failed, error " << uv_err_name(err)); - throw std::exception(); - } - m_stdin_handle = reinterpret_cast(&m_stdin_pipe); - err = uv_pipe_open(&m_stdin_pipe, 0); - if (err) { - LOGERR(1, "uv_pipe_open failed, error " << uv_err_name(err)); - 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)); - throw std::exception(); - } - 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);