blob: ee79b6959e81c4023e9accbae5207925cfff458a [file] [log] [blame]
// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
#ifndef VM_COUNTERS_H_
#define VM_COUNTERS_H_
#include "platform/assert.h"
namespace dart {
struct Counter {
Counter() : name(NULL), value(0) {}
const char* name;
int64_t value;
};
// Light-weight stats counters for temporary experiments/debugging.
// A single statement is enough to add a counter:
// ...
// Isolate::Current()->counters()->Increment("allocated", size_in_bytes);
// ...
class Counters {
public:
Counters() : collision_(false) {}
// Adds 'delta' to the named counter. 'name' must be a literal string.
void Increment(const char* name, int64_t delta) {
Counter& counter =
counters_[reinterpret_cast<uword>(name) & (kSize - 1)];
if (counter.name != name && counter.name != NULL) {
collision_ = true;
}
counter.name = name;
counter.value += delta;
}
// Prints all counters to stderr.
~Counters();
private:
enum { kSize = 1024 };
COMPILE_ASSERT((0 == (kSize & (kSize - 1)))); // kSize is a power of 2.
Counter counters_[kSize];
bool collision_;
};
} // namespace dart
#endif // VM_COUNTERS_H_