289b30715d
This commit converts the dependency management from Godeps to the vendor folder, also switching the tool from godep to trash. Since the upstream tool lacks a few features proposed via a few PRs, until those PRs are merged in (if), use github.com/karalabe/trash. You can update dependencies via trash --update. All dependencies have been updated to their latest version. Parts of the build system are reworked to drop old notions of Godeps and invocation of the go vet command so that it doesn't run against the vendor folder, as that will just blow up during vetting. The conversion drops OpenCL (and hence GPU mining support) from ethash and our codebase. The short reasoning is that there's noone to maintain and having opencl libs in our deps messes up builds as go install ./... tries to build them, failing with unsatisfied link errors for the C OpenCL deps. golang.org/x/net/context is not vendored in. We expect it to be fetched by the user (i.e. using go get). To keep ci.go builds reproducible the package is "vendored" in build/_vendor.
113 lines
2.5 KiB
Go
113 lines
2.5 KiB
Go
package metrics
|
|
|
|
import "sync/atomic"
|
|
|
|
// Counters hold an int64 value that can be incremented and decremented.
|
|
type Counter interface {
|
|
Clear()
|
|
Count() int64
|
|
Dec(int64)
|
|
Inc(int64)
|
|
Snapshot() Counter
|
|
}
|
|
|
|
// GetOrRegisterCounter returns an existing Counter or constructs and registers
|
|
// a new StandardCounter.
|
|
func GetOrRegisterCounter(name string, r Registry) Counter {
|
|
if nil == r {
|
|
r = DefaultRegistry
|
|
}
|
|
return r.GetOrRegister(name, NewCounter).(Counter)
|
|
}
|
|
|
|
// NewCounter constructs a new StandardCounter.
|
|
func NewCounter() Counter {
|
|
if UseNilMetrics {
|
|
return NilCounter{}
|
|
}
|
|
return &StandardCounter{0}
|
|
}
|
|
|
|
// NewRegisteredCounter constructs and registers a new StandardCounter.
|
|
func NewRegisteredCounter(name string, r Registry) Counter {
|
|
c := NewCounter()
|
|
if nil == r {
|
|
r = DefaultRegistry
|
|
}
|
|
r.Register(name, c)
|
|
return c
|
|
}
|
|
|
|
// CounterSnapshot is a read-only copy of another Counter.
|
|
type CounterSnapshot int64
|
|
|
|
// Clear panics.
|
|
func (CounterSnapshot) Clear() {
|
|
panic("Clear called on a CounterSnapshot")
|
|
}
|
|
|
|
// Count returns the count at the time the snapshot was taken.
|
|
func (c CounterSnapshot) Count() int64 { return int64(c) }
|
|
|
|
// Dec panics.
|
|
func (CounterSnapshot) Dec(int64) {
|
|
panic("Dec called on a CounterSnapshot")
|
|
}
|
|
|
|
// Inc panics.
|
|
func (CounterSnapshot) Inc(int64) {
|
|
panic("Inc called on a CounterSnapshot")
|
|
}
|
|
|
|
// Snapshot returns the snapshot.
|
|
func (c CounterSnapshot) Snapshot() Counter { return c }
|
|
|
|
// NilCounter is a no-op Counter.
|
|
type NilCounter struct{}
|
|
|
|
// Clear is a no-op.
|
|
func (NilCounter) Clear() {}
|
|
|
|
// Count is a no-op.
|
|
func (NilCounter) Count() int64 { return 0 }
|
|
|
|
// Dec is a no-op.
|
|
func (NilCounter) Dec(i int64) {}
|
|
|
|
// Inc is a no-op.
|
|
func (NilCounter) Inc(i int64) {}
|
|
|
|
// Snapshot is a no-op.
|
|
func (NilCounter) Snapshot() Counter { return NilCounter{} }
|
|
|
|
// StandardCounter is the standard implementation of a Counter and uses the
|
|
// sync/atomic package to manage a single int64 value.
|
|
type StandardCounter struct {
|
|
count int64
|
|
}
|
|
|
|
// Clear sets the counter to zero.
|
|
func (c *StandardCounter) Clear() {
|
|
atomic.StoreInt64(&c.count, 0)
|
|
}
|
|
|
|
// Count returns the current count.
|
|
func (c *StandardCounter) Count() int64 {
|
|
return atomic.LoadInt64(&c.count)
|
|
}
|
|
|
|
// Dec decrements the counter by the given amount.
|
|
func (c *StandardCounter) Dec(i int64) {
|
|
atomic.AddInt64(&c.count, -i)
|
|
}
|
|
|
|
// Inc increments the counter by the given amount.
|
|
func (c *StandardCounter) Inc(i int64) {
|
|
atomic.AddInt64(&c.count, i)
|
|
}
|
|
|
|
// Snapshot returns a read-only copy of the counter.
|
|
func (c *StandardCounter) Snapshot() Counter {
|
|
return CounterSnapshot(c.Count())
|
|
}
|