Browse Source

github annotations

- reformat `read_write_lock.h`
- fix spelling issue
- move job id increase of the write to the buttom
tags/2.4.4^2
psychocrypt 4 years ago
parent
commit
460aa90d25
3 changed files with 63 additions and 53 deletions
  1. +1
    -1
      THIRD-PARTY-LICENSES
  2. +3
    -3
      xmrstak/backend/globalStates.cpp
  3. +59
    -49
      xmrstak/cpputil/read_write_lock.h

+ 1
- 1
THIRD-PARTY-LICENSES View File

@@ -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

-------------------------------------------------------------------------



+ 3
- 3
xmrstak/backend/globalStates.cpp View File

@@ -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();
}


+ 59
- 49
xmrstak/cpputil/read_write_lock.h View File

@@ -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_

Loading…
Cancel
Save