Skip to content

Commit

Permalink
Implement an AtomicTimer
Browse files Browse the repository at this point in the history
  • Loading branch information
str4d committed Mar 23, 2017
1 parent 3b11e24 commit 73bf85b
Show file tree
Hide file tree
Showing 2 changed files with 67 additions and 1 deletion.
39 changes: 39 additions & 0 deletions src/metrics.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,45 @@
#include <sys/ioctl.h>
#include <unistd.h>

void AtomicTimer::start()
{
std::unique_lock<std::mutex> lock(mtx);
if (threads < 1) {
start_time = GetTime();
}
++threads;
}

void AtomicTimer::stop()
{
std::unique_lock<std::mutex> lock(mtx);
// Ignore excess calls to stop()
if (threads > 0) {
--threads;
if (threads < 1) {
int64_t time_span = GetTime() - start_time;
total_time += time_span;
}
}
}

bool AtomicTimer::running()
{
std::unique_lock<std::mutex> lock(mtx);
return threads > 0;
}

double AtomicTimer::rate(const AtomicCounter& count)
{
std::unique_lock<std::mutex> lock(mtx);
int64_t duration = total_time;
if (threads > 0) {
// Timer is running, so get the latest count
duration += GetTime() - start_time;
}
return duration > 0 ? (double)count.get() / duration : 0;
}

CCriticalSection cs_metrics;

boost::synchronized_value<int64_t> nNodeStartTime;
Expand Down
29 changes: 28 additions & 1 deletion src/metrics.h
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
#include "uint256.h"

#include <atomic>
#include <mutex>
#include <string>

struct AtomicCounter {
Expand All @@ -20,11 +21,37 @@ struct AtomicCounter {
--value;
}

int get(){
int get() const {
return value.load();
}
};

class AtomicTimer {
private:
std::mutex mtx;
uint64_t threads;
int64_t start_time;
int64_t total_time;

public:
AtomicTimer() : threads(0), start_time(0), total_time(0) {}

/**
* Starts timing on first call, and counts the number of calls.
*/
void start();

/**
* Counts number of calls, and stops timing after it has been called as
* many times as start().
*/
void stop();

bool running();

double rate(const AtomicCounter& count);
};

extern AtomicCounter transactionsValidated;
extern AtomicCounter ehSolverRuns;
extern AtomicCounter solutionTargetChecks;
Expand Down

0 comments on commit 73bf85b

Please sign in to comment.