From 084077861352169e8feaf4faf474835a01b37749 Mon Sep 17 00:00:00 2001 From: psychocrypt Date: Tue, 2 Apr 2019 20:40:17 +0200 Subject: [PATCH] concurrent hash rate calculation Allow that the web interface/json api and the command line view can create the hash rate statistics concurrent. --- xmrstak/misc/telemetry.cpp | 10 ++++++---- xmrstak/misc/telemetry.hpp | 4 +++- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/xmrstak/misc/telemetry.cpp b/xmrstak/misc/telemetry.cpp index 16ecaa6f6..75fb4f434 100644 --- a/xmrstak/misc/telemetry.cpp +++ b/xmrstak/misc/telemetry.cpp @@ -23,6 +23,7 @@ #include "telemetry.hpp" #include "xmrstak/net/msgstruct.hpp" +#include "xmrstak/cpputil/read_write_lock.h" #include #include @@ -36,7 +37,7 @@ telemetry::telemetry(size_t iThd) ppHashCounts = new uint64_t*[iThd]; ppTimestamps = new uint64_t*[iThd]; iBucketTop = new uint32_t[iThd]; - mtx = new std::mutex[iThd]; + mtx = new ::cpputil::RWLock[iThd]; for(size_t i = 0; i < iThd; i++) { @@ -57,7 +58,7 @@ double telemetry::calc_telemetry_data(size_t iLastMillisec, size_t iThread) uint64_t iLatestHashCnt = 0; bool bHaveFullSet = false; - std::unique_lock lk(mtx[iThread]); + mtx[iThread].ReadLock(); uint64_t iTimeNow = get_timestamp_ms(); //Start at 1, buckettop points to next empty @@ -83,7 +84,7 @@ double telemetry::calc_telemetry_data(size_t iLastMillisec, size_t iThread) iEarliestStamp = ppTimestamps[iThread][idx]; iEarliestHashCnt = ppHashCounts[iThread][idx]; } - lk.unlock(); + mtx[iThread].UnLock(); if(!bHaveFullSet || iEarliestStamp == 0 || iLatestStamp == 0) return nan(""); @@ -102,12 +103,13 @@ double telemetry::calc_telemetry_data(size_t iLastMillisec, size_t iThread) void telemetry::push_perf_value(size_t iThd, uint64_t iHashCount, uint64_t iTimestamp) { - std::unique_lock lk(mtx[iThd]); + mtx[iThd].WriteLock(); size_t iTop = iBucketTop[iThd]; ppHashCounts[iThd][iTop] = iHashCount; ppTimestamps[iThd][iTop] = iTimestamp; iBucketTop[iThd] = (iTop + 1) & iBucketMask; + mtx[iThd].UnLock(); } } // namespace xmrstak diff --git a/xmrstak/misc/telemetry.hpp b/xmrstak/misc/telemetry.hpp index 2ab2a9e5f..a7b77c287 100644 --- a/xmrstak/misc/telemetry.hpp +++ b/xmrstak/misc/telemetry.hpp @@ -1,5 +1,7 @@ #pragma once +#include "xmrstak/cpputil/read_write_lock.h" + #include #include #include @@ -15,7 +17,7 @@ class telemetry double calc_telemetry_data(size_t iLastMillisec, size_t iThread); private: - std::mutex* mtx; + ::cpputil::RWLock* mtx; constexpr static size_t iBucketSize = 2 << 11; //Power of 2 to simplify calculations constexpr static size_t iBucketMask = iBucketSize - 1; uint32_t* iBucketTop;