Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(566)

Unified Diff: src/counters.h

Issue 1695733002: [counters] Making counter properly reentrant. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@2016-02-09_recursive_counters_1681943002
Patch Set: Created 4 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/builtins.cc ('k') | src/counters.cc » ('j') | src/counters.cc » ('J')
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/counters.h
diff --git a/src/counters.h b/src/counters.h
index bf10a4ece0b298aa680a335b0064dffb5135ff44..533e26ea1212bacd30920011ee2d7de7ed1ae6b7 100644
--- a/src/counters.h
+++ b/src/counters.h
@@ -701,27 +701,60 @@ double AggregatedMemoryHistogram<Histogram>::Aggregate(double current_ms,
/* Total count of functions compiled using the baseline compiler. */ \
SC(total_baseline_compile_count, V8.TotalBaselineCompileCount)
-typedef struct RuntimeCallCounter {
+struct RuntimeCallCounter {
+ explicit RuntimeCallCounter(const char* name) : name(name) {}
+ void Reset();
+
+ const char* name;
int64_t count = 0;
base::TimeDelta time;
- RuntimeCallCounter* parent_counter;
+};
- void Reset();
-} RuntimeCallCounter;
+// TimerLink is used to keep track of the stack of currently active timers used
+// for RuntimeCallCounter.
+class TimerLink {
+ public:
+ TimerLink(RuntimeCallCounter* counter, TimerLink* parent)
+ : counter_(counter), parent_(parent) {}
+
+ inline void Start() {
+ timer_.Start();
+ counter_->count++;
+ }
+
+ inline TimerLink* Stop() {
+ base::TimeDelta delta = timer_.Elapsed();
+ counter_->time += delta;
+ if (parent_ != NULL) {
+ parent_->AdjustForSubTimer(delta);
+ }
+ return parent_;
+ }
+
+ void AdjustForSubTimer(base::TimeDelta delta) { counter_->time -= delta; }
+
+ private:
+ RuntimeCallCounter* counter_;
+ TimerLink* parent_;
+ base::ElapsedTimer timer_;
+};
struct RuntimeCallStats {
+ // Dummy counter for the unexpected stub miss.
+ RuntimeCallCounter UnexpectedStubMiss = {"UnexpectedStubMiss"};
+ // Counter for runtime callbacks into JavaScript.
+ RuntimeCallCounter RuntimeCallbacks = {"RuntimeCallback"};
#define CALL_RUNTIME_COUNTER(name, nargs, ressize) \
- RuntimeCallCounter Runtime_##name;
+ RuntimeCallCounter Runtime_##name = {#name};
FOR_EACH_INTRINSIC(CALL_RUNTIME_COUNTER)
#undef CALL_RUNTIME_COUNTER
-#define CALL_BUILTIN_COUNTER(name, type) RuntimeCallCounter Builtin_##name;
+#define CALL_BUILTIN_COUNTER(name, type) \
+ RuntimeCallCounter Builtin_##name = {#name};
BUILTIN_LIST_C(CALL_BUILTIN_COUNTER)
#undef CALL_BUILTIN_COUNTER
- // Dummy counter for the unexpected stub miss.
- RuntimeCallCounter UnexpectedStubMiss;
// Counter to track recursive time events.
- RuntimeCallCounter* current_counter;
+ TimerLink* current_timer_link_;
// Starting measuring the time for a function. This will establish the
// connection to the parent counter for properly calculating the own times.
@@ -729,7 +762,7 @@ struct RuntimeCallStats {
// Leave a scope for a measured runtime function. This will properly add
// the time delta to the current_counter and subtract the delta from its
// parent.
- void Leave(base::TimeDelta time);
+ void Leave();
void Reset();
void Print(std::ostream& os);
« no previous file with comments | « src/builtins.cc ('k') | src/counters.cc » ('j') | src/counters.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698