summaryrefslogtreecommitdiffstats
path: root/xmrstak
diff options
context:
space:
mode:
authorpsychocrypt <psychocryptHPC@gmail.com>2018-05-04 20:18:48 +0200
committerTimothy Pearson <tpearson@raptorengineering.com>2018-06-04 21:07:11 +0000
commit3989c6cc041859d11316da4933ae499b7515fc9f (patch)
tree0b5006c3349758caf95b761de4ca3009edf23e03 /xmrstak
parentc68e94fb7e18d988aeed3924e505d9ccec87363f (diff)
downloadxmr-stak-3989c6cc041859d11316da4933ae499b7515fc9f.zip
xmr-stak-3989c6cc041859d11316da4933ae499b7515fc9f.tar.gz
github annotations
- reformat `read_write_lock.h` - fix spelling issue - move job id increase of the write to the buttom
Diffstat (limited to 'xmrstak')
-rw-r--r--xmrstak/backend/globalStates.cpp6
-rw-r--r--xmrstak/cpputil/read_write_lock.h108
2 files changed, 62 insertions, 52 deletions
diff --git a/xmrstak/backend/globalStates.cpp b/xmrstak/backend/globalStates.cpp
index 8de6bfe..9f41be2 100644
--- a/xmrstak/backend/globalStates.cpp
+++ b/xmrstak/backend/globalStates.cpp
@@ -46,9 +46,6 @@ void globalStates::consume_work( miner_work& threadWork, uint64_t& currentJobId)
void globalStates::switch_work(miner_work& pWork, pool_data& dat)
{
jobLock.WriteLock();
-
- // this notifies all threads that the job has changed
- iGlobalJobNo++;
size_t xid = dat.pool_id;
dat.pool_id = pool_id;
@@ -61,6 +58,9 @@ void globalStates::switch_work(miner_work& pWork, pool_data& dat)
*/
dat.iSavedNonce = iGlobalNonce.exchange(dat.iSavedNonce, std::memory_order_relaxed);
oGlobalWork = pWork;
+
+ // this notifies all threads that the job has changed
+ iGlobalJobNo++;
jobLock.UnLock();
}
diff --git a/xmrstak/cpputil/read_write_lock.h b/xmrstak/cpputil/read_write_lock.h
index 41ebc69..9139dfd 100644
--- a/xmrstak/cpputil/read_write_lock.h
+++ b/xmrstak/cpputil/read_write_lock.h
@@ -21,66 +21,76 @@
* SOFTWARE.
*/
-#ifndef CPPUTIL_READ_WRITE_LOCK_H_
-#define CPPUTIL_READ_WRITE_LOCK_H_
+#pragma once
#include <mutex>
#include <condition_variable>
-namespace cpputil {
+namespace cpputil
+{
-class RWLock {
+class RWLock
+{
public:
- RWLock() : status_(0), waiting_readers_(0), waiting_writers_(0) {}
- RWLock(const RWLock&) = delete;
- RWLock(RWLock&&) = delete;
- RWLock& operator = (const RWLock&) = delete;
- RWLock& operator = (RWLock&&) = delete;
+ RWLock() : status_(0), waiting_readers_(0), waiting_writers_(0) {}
+ RWLock(const RWLock&) = delete;
+ RWLock(RWLock&&) = delete;
+ RWLock& operator = (const RWLock&) = delete;
+ RWLock& operator = (RWLock&&) = delete;
- void ReadLock() {
- std::unique_lock<std::mutex> lck(mtx_);
- waiting_readers_ += 1;
- read_cv_.wait(lck, [&]() { return waiting_writers_ == 0 && status_ >= 0; });
- waiting_readers_ -= 1;
- status_ += 1;
- }
+ void ReadLock()
+ {
+ std::unique_lock<std::mutex> lck(mtx_);
+ waiting_readers_ += 1;
+ read_cv_.wait(lck, [&]() { return waiting_writers_ == 0 && status_ >= 0; });
+ waiting_readers_ -= 1;
+ status_ += 1;
+ }
- void WriteLock() {
- std::unique_lock<std::mutex> lck(mtx_);
- waiting_writers_ += 1;
- write_cv_.wait(lck, [&]() { return status_ == 0; });
- waiting_writers_ -= 1;
- status_ = -1;
- }
+ void WriteLock()
+ {
+ std::unique_lock<std::mutex> lck(mtx_);
+ waiting_writers_ += 1;
+ write_cv_.wait(lck, [&]() { return status_ == 0; });
+ waiting_writers_ -= 1;
+ status_ = -1;
+ }
- void UnLock() {
- std::unique_lock<std::mutex> lck(mtx_);
- if (status_ == -1) {
- status_ = 0;
- } else {
- status_ -= 1;
- }
- if (waiting_writers_ > 0) {
- if (status_ == 0) {
- write_cv_.notify_one();
- }
- } else {
- read_cv_.notify_all();
- }
- }
+ void UnLock()
+ {
+ std::unique_lock<std::mutex> lck(mtx_);
+ if (status_ == -1) {
+ status_ = 0;
+ }
+ else
+ {
+ status_ -= 1;
+ }
+ if (waiting_writers_ > 0)
+ {
+ if (status_ == 0)
+ {
+ write_cv_.notify_one();
+ }
+ }
+ else
+ {
+ read_cv_.notify_all();
+ }
+ }
private:
- // -1 : one writer
- // 0 : no reader and no writer
- // n > 0 : n reader
- int32_t status_;
- int32_t waiting_readers_;
- int32_t waiting_writers_;
- std::mutex mtx_;
- std::condition_variable read_cv_;
- std::condition_variable write_cv_;
+ /** status of the lock
+ * -1 : one writer
+ * 0 : no reader and no writer
+ * n > 0 : n reader
+ */
+ int32_t status_;
+ int32_t waiting_readers_;
+ int32_t waiting_writers_;
+ std::mutex mtx_;
+ std::condition_variable read_cv_;
+ std::condition_variable write_cv_;
};
} // namespace cpputil
-
-#endif // CPPUTIL_READ_WRITE_LOCK_H_
OpenPOWER on IntegriCloud