From 1dd06cc50954c0b8e952ed061da9f85433df222e Mon Sep 17 00:00:00 2001 From: SChernykh Date: Sat, 7 May 2022 11:00:29 +0200 Subject: [PATCH] Removed std::string to avoid memory allocation --- src/stratum_server.cpp | 31 ++++++++++++++++++------------- src/stratum_server.h | 5 +---- 2 files changed, 19 insertions(+), 17 deletions(-) diff --git a/src/stratum_server.cpp b/src/stratum_server.cpp index dbefd01..1dfd854 100644 --- a/src/stratum_server.cpp +++ b/src/stratum_server.cpp @@ -178,11 +178,13 @@ void StratumServer::on_block(const BlockTemplate& block) } } -bool StratumServer::get_custom_user(const char* s, std::string& user) +template +static bool get_custom_user(const char* s, char (&user)[N]) { - user.clear(); + size_t len = 0; + // Find first of '+' or '.', drop non-printable characters - while (s && (user.length() < 64)) { + while (s && (len < N - 1)) { const char c = *s; if (!c) { break; @@ -192,15 +194,16 @@ bool StratumServer::get_custom_user(const char* s, std::string& user) } // Limit to printable ASCII characters if (c >= ' ' && c <= '~') { - user += c; + user[len++] += c; } ++s; } + user[len] = '\0'; - return !user.empty(); + return (len > 0); } -bool StratumServer::get_custom_diff(const char* s, difficulty_type& diff) +static bool get_custom_diff(const char* s, difficulty_type& diff) { const char* diff_str = nullptr; @@ -250,7 +253,8 @@ bool StratumServer::on_login(StratumClient* client, uint32_t id, const char* log } if (get_custom_user(login, client->m_customUser)) { - LOGINFO(5, "client " << log::Gray() << static_cast(client->m_addrString) << " set custom user " << client->m_customUser); + const char* s = client->m_customUser; + LOGINFO(5, "client " << log::Gray() << static_cast(client->m_addrString) << " set custom user " << s); } uint32_t job_id; @@ -362,8 +366,8 @@ bool StratumServer::on_submit(StratumClient* client, uint32_t id, const char* jo } if (mainchain_diff.check_pow(resultHash)) { - const std::string& s = client->m_customUser; - LOGINFO(0, log::Green() << "client " << static_cast(client->m_addrString) << (!s.empty() ? " user " : "") << s << " found a mainchain block, submitting it"); + const char* s = client->m_customUser; + LOGINFO(0, log::Green() << "client " << static_cast(client->m_addrString) << (*s ? " user " : "") << s << " found a mainchain block, submitting it"); m_pool->submit_block_async(template_id, nonce, extra_nonce); block.update_tx_keys(); } @@ -458,7 +462,7 @@ void StratumServer::show_workers() LOGINFO(0, log::pad_right(static_cast(c->m_addrString), addr_len + 8) << log::pad_right(log::Duration(cur_time - c->m_connectedTime), 20) << log::pad_right(c->m_customDiff, 20) - << (c->m_rpcId ? c->m_customUser.data() : "not logged in") + << (c->m_rpcId ? c->m_customUser : "not logged in") ); ++n; } @@ -723,8 +727,8 @@ void StratumServer::on_share_found(uv_work_t* req) server->m_cumulativeFoundSharesDiff += diff; ++server->m_totalFoundShares; - const std::string& s = client->m_customUser; - LOGINFO(0, log::Green() << "SHARE FOUND: mainchain height " << height << ", diff " << sidechain_difficulty << ", client " << static_cast(client->m_addrString) << (!s.empty() ? " user " : "") << s << ", effort " << effort << '%'); + const char* s = client->m_customUser; + LOGINFO(0, log::Green() << "SHARE FOUND: mainchain height " << height << ", diff " << sidechain_difficulty << ", client " << static_cast(client->m_addrString) << (*s ? " user " : "") << s << ", effort " << effort << '%'); pool->submit_sidechain_block(share->m_templateId, share->m_nonce, share->m_extraNonce); } @@ -806,6 +810,7 @@ StratumServer::StratumClient::StratumClient() , m_jobs{} , m_perConnectionJobId(0) , m_customDiff{} + , m_customUser{} { uv_mutex_init_checked(&m_jobsLock); } @@ -823,7 +828,7 @@ void StratumServer::StratumClient::reset() memset(m_jobs, 0, sizeof(m_jobs)); m_perConnectionJobId = 0; m_customDiff = {}; - m_customUser.clear(); + memset(m_customUser, 0, sizeof(m_customUser)); } bool StratumServer::StratumClient::on_connect() diff --git a/src/stratum_server.h b/src/stratum_server.h index a5ab2c5..70ab944 100644 --- a/src/stratum_server.h +++ b/src/stratum_server.h @@ -65,7 +65,7 @@ public: uint32_t m_perConnectionJobId; difficulty_type m_customDiff; - std::string m_customUser; + char m_customUser[32]; }; bool on_login(StratumClient* client, uint32_t id, const char* login); @@ -80,9 +80,6 @@ public: private: void print_stratum_status() const; - static bool get_custom_diff(const char* s, difficulty_type& diff); - static bool get_custom_user(const char* s, std::string& user); - static void on_share_found(uv_work_t* req); static void on_after_share_found(uv_work_t* req, int status);