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

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: rebase, cleanup Created 7 years, 6 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..74224b908428a88a5e694e3dbb1503cd9d55201c 100644
--- a/third_party/tcmalloc/chromium/src/heap-profile-table.cc
+++ b/third_party/tcmalloc/chromium/src/heap-profile-table.cc
@@ -328,6 +328,53 @@ int HeapProfileTable::UnparseBucket(const Bucket& b,
return buflen;
}
+int HeapProfileTable::UnparsePseudoStackBucket(
+ const Bucket& bucket,
+ char* buffer, int written, int buffer_size,
+ Stats* profile_stats) {
+ if (profile_stats != NULL) {
+ profile_stats->allocs += bucket.allocs;
+ profile_stats->alloc_size += bucket.alloc_size;
+ profile_stats->frees += bucket.frees;
+ profile_stats->free_size += bucket.free_size;
+ }
+ int printed = snprintf(buffer + written,
dsinclair 2013/06/18 15:30:15 Would it be possible, instead of converting to JSO
Dai Mikurube (NOT FULLTIME) 2013/06/19 04:34:03 Agreed with dsinclair. Would it be possible to ke
+ buffer_size - written,
+ "{"
+ "\"trace\": \"");
+ written += printed;
+ RAW_DCHECK(bucket.depth <= HeapProfileBucket::kMaxStackDepth,
+ "stack depth too deep");
+ for (int d = 0; d < bucket.depth; d++) {
+ printed = snprintf(buffer + written, buffer_size - written, "%s ",
+ reinterpret_cast<const char*>(bucket.stack[d]));
+ // Brute-force replace any " with ' to keep the JSON correct.
+ for (int i = 0; i < printed; ++i) {
+ char* c = buffer + written + i;
+ if (*c == '"')
+ *c = '\'';
+ }
+ if (printed < 0 || printed >= buffer_size - written) return written;
+ written += printed;
+ }
+ printed = snprintf(buffer + written,
+ buffer_size - written,
+ "\", "
+ "\"current_allocs\": %d, "
+ "\"current_bytes\": %" PRId64 ", "
+ "\"total_allocs\": %d, "
+ "\"total_bytes\": %" PRId64
+ "}",
+ bucket.allocs - bucket.frees,
+ bucket.alloc_size - bucket.free_size,
+ bucket.allocs,
+ bucket.alloc_size);
+ // If it looks like the snprintf failed, ignore the fact we printed anything
+ if (printed < 0 || printed >= buffer_size - written) return written;
+ written += printed;
+ return written;
+}
+
HeapProfileTable::Bucket**
HeapProfileTable::MakeSortedBucketList() const {
Bucket** list = static_cast<Bucket**>(alloc_(sizeof(Bucket) * num_buckets_));
@@ -440,6 +487,30 @@ int HeapProfileTable::FillOrderedProfile(char buf[], int size) const {
return bucket_length + map_length;
}
+int HeapProfileTable::FillPseudoStackProfile(char buffer[],
+ int buffer_size) const {
+ Bucket** list = MakeSortedBucketList();
+
+ Stats stats;
+ memset(&stats, 0, sizeof(stats));
+ int written = snprintf(buffer, buffer_size, "[\n");
+ written = UnparsePseudoStackBucket(
+ total_, buffer, written, buffer_size, &stats);
+
+ for (int i = 0; i < num_buckets_; i++) {
+ written += snprintf(buffer + written, buffer_size - written, ",\n");
+ written = UnparsePseudoStackBucket(
+ *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