Index: base/trace_event/memory_profiler_allocation_context.h |
diff --git a/base/trace_event/memory_profiler_allocation_context.h b/base/trace_event/memory_profiler_allocation_context.h |
index 11ecc881baffb7b359089259626844ea4200d189..51e1b02c4dde3c4daa5b47d8b5c2772c04f5adeb 100644 |
--- a/base/trace_event/memory_profiler_allocation_context.h |
+++ b/base/trace_event/memory_profiler_allocation_context.h |
@@ -52,8 +52,65 @@ class BASE_EXPORT AllocationStack { |
DISALLOW_COPY_AND_ASSIGN(AllocationStack); |
}; |
-class BASE_EXPORT AllocationContext { |
- // TODO(ruuda): Fill this in a follow-up CL. |
+// The backtrace in the allocation context is a snapshot of the stack. For now, |
+// this is the pseudo stack where frames are created by trace event macros. In |
+// the future, we might add the option to use the native call stack. In that |
+// case, |Backtrace| and |AllocationContextTracker::GetContext| might have |
+// different implementations that can be selected by a compile time flag. |
+ |
+// The number of stack frames stored in the backtrace is a trade off between |
+// memory used for tracing and accuracy. Measurements on a prototype revealed |
+// that the stack depth sampled at every allocation has the following |
+// distribution. (Columns are depth and percentage.) |
+// |
+// 0 0.8 # |
Primiano Tucci (use gerrit)
2015/10/05 12:35:38
The histogram is nice but it's probably too much f
Ruud van Asseldonk
2015/10/05 14:20:45
Done.
|
+// 1 2.1 ## |
+// 2 2.3 ## |
+// 3 8.4 ######## |
+// 4 8.8 ######## |
+// 5 7.6 ####### |
+// 6 8.7 ######## |
+// 7 21.7 #################### |
+// 8 14.2 ############## |
+// 9 10.2 ########## |
+// 10 5.7 ###### |
+// 11 1.8 ## |
+// 12 1.2 # |
+// 13 0.2 |
+// 14 0.4 |
+// 15 0.3 |
+// 16 0.3 |
+// 17 0.5 # |
+// 18 0.4 |
+// 19 0.3 |
+// 20 0.4 |
+// 21 0.4 |
+// |
+// In 60 percent of the cases, stack depth <= 7. |
+// In 87 percent of the cases, stack depth <= 9. |
+// In 95 percent of the cases, stack depth <= 11. |
+ |
+struct BASE_EXPORT Backtrace { |
+ // Unused backtrace frames are filled with nullptr frames. If the stack is |
+ // higher than what can be stored here, the topmost frames are stored. Based |
+ // on the data above, a depth of 8 captures the full stack in the vast |
+ // majority of the cases, and missing frames at the bottom can often be |
+ // reconstructed given the top frames. |
+ StackFrame frames[8]; |
Primiano Tucci (use gerrit)
2015/10/05 12:35:38
Looking at the data above, shouldn't this be 10-12
Ruud van Asseldonk
2015/10/05 14:20:45
The thing with statistics is that you can often us
|
+}; |
+ |
+// The allocation context is what is stored in the bookkeeping structure with |
Primiano Tucci (use gerrit)
2015/10/05 12:35:38
I'd probably word it as "The allocation context is
Ruud van Asseldonk
2015/10/05 14:20:45
Done.
|
+// every allocation. To simplify memory management for bookkeeping, this struct |
+// has a fixed size. All |const char*|s here must have static lifetime. The |
+// struct is designed such that a memzero'd instance is a valid context with |
Primiano Tucci (use gerrit)
2015/10/05 12:35:38
As discussed remove the memzero comment
Ruud van Asseldonk
2015/10/05 14:20:45
Done.
|
+// empty backtrace and no context fields. |
+struct BASE_EXPORT AllocationContext { |
+ Backtrace backtrace; |
+ |
+ // There is room for two arbitrary context fields, which can be set by the |
+ // |TRACE_ALLOCATION_CONTEXT| macro. A nullptr key indicates that the field is |
+ // unused. |
+ std::pair<const char*, const char*> fields[2]; |
}; |
// The allocation context tracker keeps track of thread-local context for heap |
@@ -92,9 +149,6 @@ class BASE_EXPORT AllocationContextTracker { |
// Returns a snapshot of the current thread-local context. |
static AllocationContext GetContext(); |
- // TODO(ruuda): Remove in a follow-up CL, this is only used for testing now. |
- static AllocationStack* GetPseudoStackForTesting(); |
- |
~AllocationContextTracker(); |
private: |