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

Unified Diff: third_party/tcmalloc/chromium/src/heap-profile-table.cc

Issue 15418002: Record Chrome trace events in tcmalloc heap profiles (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: json output, but no green dots on trace Created 7 years, 7 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: third_party/tcmalloc/chromium/src/heap-profile-table.cc
diff --git a/third_party/tcmalloc/chromium/src/heap-profile-table.cc b/third_party/tcmalloc/chromium/src/heap-profile-table.cc
index 68ec5735026f8feced50e6612c760ced6915b809..632fa659f9e62a8e1189cba7716cdb1fb129ba95 100644
--- a/third_party/tcmalloc/chromium/src/heap-profile-table.cc
+++ b/third_party/tcmalloc/chromium/src/heap-profile-table.cc
@@ -328,6 +328,45 @@ int HeapProfileTable::UnparseBucket(const Bucket& b,
return buflen;
}
+int HeapProfileTable::UnparseBucket2(const Bucket& b,
+ char* buf, int buflen, int bufsize,
+ Stats* profile_stats) {
+ if (profile_stats != NULL) {
+ profile_stats->allocs += b.allocs;
+ profile_stats->alloc_size += b.alloc_size;
+ profile_stats->frees += b.frees;
+ profile_stats->free_size += b.free_size;
+ }
+ int printed = snprintf(buf + buflen,
+ bufsize - buflen,
+ "{"
+ "\"trace\": \"");
+ buflen += printed;
+ for (int d = 0; d < b.depth; d++) {
+ // OMG what a hack
+ printed = snprintf(buf + buflen, bufsize - buflen, "%s ",
+ reinterpret_cast<const char*>(b.stack[d]));
+ if (printed < 0 || printed >= bufsize - buflen) return buflen;
+ buflen += printed;
+ }
+ printed = snprintf(buf + buflen,
+ bufsize - buflen,
+ "\", "
+ "\"current_allocs\": %d, "
+ "\"current_bytes\": %" PRId64 ", "
+ "\"total_allocs\": %d, "
+ "\"total_bytes\": %" PRId64
+ "}",
+ b.allocs - b.frees,
+ b.alloc_size - b.free_size,
+ b.allocs,
+ b.alloc_size);
+ // If it looks like the snprintf failed, ignore the fact we printed anything
+ if (printed < 0 || printed >= bufsize - buflen) return buflen;
+ buflen += printed;
+ return buflen;
+}
+
HeapProfileTable::Bucket**
HeapProfileTable::MakeSortedBucketList() const {
Bucket** list = static_cast<Bucket**>(alloc_(sizeof(Bucket) * num_buckets_));
@@ -440,6 +479,29 @@ int HeapProfileTable::FillOrderedProfile(char buf[], int size) const {
return bucket_length + map_length;
}
+// TODO(jamescook): Make a subclass and override this method.
+int HeapProfileTable::FillOrderedProfile2(char buffer[],
+ int buffer_size) const {
+ Bucket** list = MakeSortedBucketList();
+
+ Stats stats;
+ memset(&stats, 0, sizeof(stats));
+ int written = snprintf(buffer, buffer_size, "[\n");
+ written = UnparseBucket2(total_, buffer, written, buffer_size, &stats);
+
+ for (int i = 0; i < num_buckets_; i++) {
+ written += snprintf(buffer + written, buffer_size - written, ",\n");
+ written = UnparseBucket2(*list[i], buffer, written, buffer_size, &stats);
+ }
+ RAW_DCHECK(written < buffer_size, "");
+
+ written += snprintf(buffer + written, buffer_size - written, "\n]\n");
+
+ dealloc_(list);
+
+ return written;
+}
+
// static
void HeapProfileTable::DumpBucketIterator(const Bucket* bucket,
BufferArgs* args) {

Powered by Google App Engine
This is Rietveld 408576698