From b29cf2f08b8f83a280ceb42b9852ec309a3a481f Mon Sep 17 00:00:00 2001 From: Intel Date: Tue, 13 May 2014 16:19:01 -0400 Subject: [PATCH] Added mutexes for shared access variables --- src/server/poolserver/Stratum/Server.cpp | 2 ++ src/server/poolserver/Stratum/Server.h | 18 +++++++++++++++++- 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/src/server/poolserver/Stratum/Server.cpp b/src/server/poolserver/Stratum/Server.cpp index c9527d5..a8cea01 100644 --- a/src/server/poolserver/Stratum/Server.cpp +++ b/src/server/poolserver/Stratum/Server.cpp @@ -16,6 +16,7 @@ namespace Stratum void Server::SendToAll(JSON msg) { + boost::lock_guard guard(_mtxClients); std::set::iterator it; for (it = _clients.begin(); it != _clients.end(); ++it) _io_service.post(boost::bind(&Client::SendMessage, (*it), msg)); @@ -23,6 +24,7 @@ namespace Stratum void Server::SendBlockTmpl(bool resetWork) { + boost::lock_guard guard(_mtxClients); std::set::iterator it; for (it = _clients.begin(); it != _clients.end(); ++it) _io_service.post(boost::bind(&Client::SendJob, (*it), resetWork)); diff --git a/src/server/poolserver/Stratum/Server.h b/src/server/poolserver/Stratum/Server.h index 208b10d..a6e9085 100644 --- a/src/server/poolserver/Stratum/Server.h +++ b/src/server/poolserver/Stratum/Server.h @@ -71,6 +71,7 @@ namespace Stratum // Returns new extranonce uint32 GetExtranonce() { + boost::lock_guard guard(_mtxExtranonce); return _extranonce++; } @@ -100,7 +101,10 @@ namespace Stratum // Disconnects client void Disconnect(ClientPtr client) { + _mtxClients.lock(); _clients.erase(client); + _mtxClients.unlock(); + client->CloseSocket(); sLog.Info(LOG_STRATUM, "Stratum client disconnected from %s. Total clients: %u", asio::ip::address_v4(client->GetIP()).to_string().c_str(), _clients.size()); } @@ -110,11 +114,15 @@ namespace Stratum BanInfo ban; ban.ip = ip; ban.timestamp = Util::Date() + time; + + _mtxBans.lock(); _bans.push_back(ban); + _mtxBans.unlock(); } bool IsBanned(uint32 ip) { + boost::lock_guard guard(_mtxBans); for (int i = 0; i < _bans.size(); ++i) { if (_bans[i].ip == ip) { if (_bans[i].timestamp > Util::Date()) @@ -137,7 +145,10 @@ namespace Stratum { if (!error) { if (client->Start()) { + _mtxClients.lock(); _clients.insert(client); + _mtxClients.unlock(); + sLog.Info(LOG_STRATUM, "New stratum client accepted from %s. Total clients: %u", asio::ip::address_v4(client->GetIP()).to_string().c_str(), _clients.size()); } } else { @@ -154,13 +165,18 @@ namespace Stratum // Clients std::set _clients; - std::vector _bans; + boost::mutex _mtxClients; uint64 _clientId; + // Bands + std::vector _bans; + boost::mutex _mtxBans; + // Work Bitcoin::BlockPtr _currentWork; boost::mutex _mtxCurrentWork; uint32 _extranonce; + boost::mutex _mtxExtranonce; }; }