Skip to content
Snippets Groups Projects
Commit 460aa90d authored by psychocrypt's avatar psychocrypt
Browse files

github annotations

- reformat `read_write_lock.h`
- fix spelling issue
- move job id increase of the write to the buttom
parent 0f96f51c
No related branches found
No related tags found
No related merge requests found
......@@ -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
-------------------------------------------------------------------------
......
......@@ -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();
}
......
......@@ -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_
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment