forked from OSchip/llvm-project
Use atomic operations when accessing statistics, and make the lazy initialization of statistics actually threadsafe.
llvm-svn: 74005
This commit is contained in:
parent
1fdf01026b
commit
ca8f986f63
|
@ -26,14 +26,16 @@
|
|||
#ifndef LLVM_ADT_STATISTIC_H
|
||||
#define LLVM_ADT_STATISTIC_H
|
||||
|
||||
#include "llvm/System/Atomic.h"
|
||||
|
||||
namespace llvm {
|
||||
|
||||
class Statistic {
|
||||
public:
|
||||
const char *Name;
|
||||
const char *Desc;
|
||||
unsigned Value : 31;
|
||||
bool Initialized : 1;
|
||||
unsigned Value;
|
||||
bool Initialized;
|
||||
|
||||
unsigned getValue() const { return Value; }
|
||||
const char *getName() const { return Name; }
|
||||
|
@ -47,19 +49,60 @@ public:
|
|||
|
||||
// Allow use of this class as the value itself.
|
||||
operator unsigned() const { return Value; }
|
||||
const Statistic &operator=(unsigned Val) { Value = Val; return init(); }
|
||||
const Statistic &operator++() { ++Value; return init(); }
|
||||
unsigned operator++(int) { init(); return Value++; }
|
||||
const Statistic &operator--() { --Value; return init(); }
|
||||
unsigned operator--(int) { init(); return Value--; }
|
||||
const Statistic &operator+=(const unsigned &V) { Value += V; return init(); }
|
||||
const Statistic &operator-=(const unsigned &V) { Value -= V; return init(); }
|
||||
const Statistic &operator*=(const unsigned &V) { Value *= V; return init(); }
|
||||
const Statistic &operator/=(const unsigned &V) { Value /= V; return init(); }
|
||||
const Statistic &operator=(unsigned Val) {
|
||||
Value = Val;
|
||||
return init();
|
||||
}
|
||||
|
||||
const Statistic &operator++() {
|
||||
sys::AtomicIncrement(&Value);
|
||||
return init();
|
||||
}
|
||||
|
||||
unsigned operator++(int) {
|
||||
init();
|
||||
unsigned OldValue = Value;
|
||||
sys::AtomicIncrement(&Value);
|
||||
return OldValue;
|
||||
}
|
||||
|
||||
const Statistic &operator--() {
|
||||
sys::AtomicDecrement(&Value);
|
||||
return init();
|
||||
}
|
||||
|
||||
unsigned operator--(int) {
|
||||
init();
|
||||
unsigned OldValue = Value;
|
||||
sys::AtomicDecrement(&Value);
|
||||
return OldValue;
|
||||
}
|
||||
|
||||
const Statistic &operator+=(const unsigned &V) {
|
||||
sys::AtomicAdd(&Value, V);
|
||||
return init();
|
||||
}
|
||||
|
||||
const Statistic &operator-=(const unsigned &V) {
|
||||
sys::AtomicAdd(&Value, -V);
|
||||
return init();
|
||||
}
|
||||
|
||||
const Statistic &operator*=(const unsigned &V) {
|
||||
sys::AtomicMul(&Value, V);
|
||||
return init();
|
||||
}
|
||||
|
||||
const Statistic &operator/=(const unsigned &V) {
|
||||
sys::AtomicDiv(&Value, V);
|
||||
return init();
|
||||
}
|
||||
|
||||
protected:
|
||||
Statistic &init() {
|
||||
if (!Initialized) RegisterStatistic();
|
||||
bool tmp = Initialized;
|
||||
sys::MemoryFence();
|
||||
if (!tmp) RegisterStatistic();
|
||||
return *this;
|
||||
}
|
||||
void RegisterStatistic();
|
||||
|
|
|
@ -66,10 +66,14 @@ void Statistic::RegisterStatistic() {
|
|||
// If stats are enabled, inform StatInfo that this statistic should be
|
||||
// printed.
|
||||
sys::ScopedLock Writer(&*StatLock);
|
||||
if (Enabled)
|
||||
StatInfo->addStatistic(this);
|
||||
// Remember we have been registered.
|
||||
Initialized = true;
|
||||
if (!Initialized) {
|
||||
if (Enabled)
|
||||
StatInfo->addStatistic(this);
|
||||
|
||||
sys::MemoryFence();
|
||||
// Remember we have been registered.
|
||||
Initialized = true;
|
||||
}
|
||||
}
|
||||
|
||||
namespace {
|
||||
|
|
Loading…
Reference in New Issue