summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--THIRD-PARTY-LICENSES2
-rw-r--r--xmrstak/backend/globalStates.cpp6
-rw-r--r--xmrstak/cpputil/read_write_lock.h108
3 files changed, 63 insertions, 53 deletions
diff --git a/THIRD-PARTY-LICENSES b/THIRD-PARTY-LICENSES
index e3f574f..284b268 100644
--- a/THIRD-PARTY-LICENSES
+++ b/THIRD-PARTY-LICENSES
@@ -5,7 +5,7 @@ This application bundles the following third-party software in accordance with t
Package: Original NVidia mining code
Authors: tsiv and KlausT
License: GNU GPLv3
-Notes: Improvements are (c) of Xmr-Stak team team and are covered by GNU GPLv3
+Notes: Improvements are (c) of Xmr-Stak team and are covered by GNU GPLv3
-------------------------------------------------------------------------
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