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

Unified Diff: base/trace_event/heap_profiler_allocation_context.h

Issue 1891543003: [tracing] Turn StackFrame into struct. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 8 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
Index: base/trace_event/heap_profiler_allocation_context.h
diff --git a/base/trace_event/heap_profiler_allocation_context.h b/base/trace_event/heap_profiler_allocation_context.h
index 8544c78eb2cd34c3f7693fa4063ccdcf85f837a1..3708c907e5903a958ebdf2dcf668f19f8bb76fbb 100644
--- a/base/trace_event/heap_profiler_allocation_context.h
+++ b/base/trace_event/heap_profiler_allocation_context.h
@@ -35,14 +35,39 @@ namespace trace_event {
//
// See the design doc (https://goo.gl/4s7v7b) for more details.
-using StackFrame = const char*;
+// Represents (pseudo) stack frame. Used in Backtrace class below.
+//
+// For performance reasons this struct is treated as bytes when comparing
+// and hashing, so all members must be pointer-sized to make sure they are
+// not padded.
+struct BASE_EXPORT StackFrame {
+ enum class Type: uintptr_t {
Primiano Tucci (use gerrit) 2016/04/14 10:15:33 out of curiosity why this needs to be a uintptr_t?
Dmitry Skiba 2016/04/15 07:01:39 Because else there will be padding on 64-bit platf
Primiano Tucci (use gerrit) 2016/04/15 13:47:47 Yeah but see my comment. You shouldn't rely on the
+ TRACE_EVENT_NAME, // const char* string
+ THREAD_NAME, // const char* thread name
+ };
+
+ static StackFrame FromTraceEventName(const char* name) {
+ return {Type::TRACE_EVENT_NAME, name};
+ }
+ static StackFrame FromThreadName(const char* name) {
+ return {Type::THREAD_NAME, name};
+ }
+
+ Type type;
+ const void* value;
+};
+
+bool BASE_EXPORT operator < (const StackFrame& lhs, const StackFrame& rhs);
Primiano Tucci (use gerrit) 2016/04/14 10:15:33 should we turn that map in the deduplicator into a
Dmitry Skiba 2016/04/15 07:01:39 Why minimizing number of operators? Yes, we could
Primiano Tucci (use gerrit) 2016/04/15 13:47:47 Oh is not for minimizing operators, I just realize
+bool BASE_EXPORT operator == (const StackFrame& lhs, const StackFrame& rhs);
+bool BASE_EXPORT operator != (const StackFrame& lhs, const StackFrame& rhs);
struct BASE_EXPORT Backtrace {
- // Unused backtrace frames are filled with nullptr frames. If the stack is
- // higher than what can be stored here, the bottom frames are stored. Based
- // on the data above, a depth of 12 captures the full stack in the vast
- // majority of the cases.
- StackFrame frames[12];
+ // If the stack is higher than what can be stored here, the bottom frames
+ // are stored. Based on the data above, a depth of 12 captures the full
+ // stack in the vast majority of the cases.
+ enum { kMaxFrameCount = 12 };
+ StackFrame frames[kMaxFrameCount];
+ size_t frame_count;
Primiano Tucci (use gerrit) 2016/04/14 10:15:33 not sure I understand from the code below why do w
};
bool BASE_EXPORT operator==(const Backtrace& lhs, const Backtrace& rhs);
@@ -83,6 +108,11 @@ bool BASE_EXPORT operator==(const AllocationContext& lhs,
namespace BASE_HASH_NAMESPACE {
template <>
+struct BASE_EXPORT hash<base::trace_event::StackFrame> {
+ size_t operator()(const base::trace_event::StackFrame& frame) const;
+};
+
+template <>
struct BASE_EXPORT hash<base::trace_event::Backtrace> {
size_t operator()(const base::trace_event::Backtrace& backtrace) const;
};

Powered by Google App Engine
This is Rietveld 408576698