| Index: src/log.cc
|
| ===================================================================
|
| --- src/log.cc (revision 2947)
|
| +++ src/log.cc (working copy)
|
| @@ -889,14 +889,51 @@
|
| #ifdef ENABLE_LOGGING_AND_PROFILING
|
| if (!Log::IsEnabled() || !FLAG_log_gc) return;
|
| LogMessageBuilder msg;
|
| - msg.Append("heap-js-cons-item,%s,%d,%d\n",
|
| - constructor[0] != '\0' ? constructor : "(anonymous)",
|
| - number, bytes);
|
| + msg.Append("heap-js-cons-item,%s,%d,%d\n", constructor, number, bytes);
|
| msg.WriteToLogFile();
|
| #endif
|
| }
|
|
|
|
|
| +void Logger::HeapSampleJSRetainersEvent(
|
| + const char* constructor, const char* event) {
|
| +#ifdef ENABLE_LOGGING_AND_PROFILING
|
| + if (!Log::IsEnabled() || !FLAG_log_gc) return;
|
| + // Event starts with comma, so we don't have it in the format string.
|
| + static const char* event_text = "heap-js-ret-item,%s";
|
| + // We take placeholder strings into account, but it's OK to be conservative.
|
| + static const int event_text_len = strlen(event_text);
|
| + const int cons_len = strlen(constructor), event_len = strlen(event);
|
| + int pos = 0;
|
| + // Retainer lists can be long. We may need to split them into multiple events.
|
| + do {
|
| + LogMessageBuilder msg;
|
| + msg.Append(event_text, constructor);
|
| + int to_write = event_len - pos;
|
| + if (to_write > Log::kMessageBufferSize - (cons_len + event_text_len)) {
|
| + int cut_pos = pos + Log::kMessageBufferSize - (cons_len + event_text_len);
|
| + ASSERT(cut_pos < event_len);
|
| + while (cut_pos > pos && event[cut_pos] != ',') --cut_pos;
|
| + if (event[cut_pos] != ',') {
|
| + // Crash in debug mode, skip in release mode.
|
| + ASSERT(false);
|
| + return;
|
| + }
|
| + // Append a piece of event that fits, without trailing comma.
|
| + msg.AppendStringPart(event + pos, cut_pos - pos);
|
| + // Start next piece with comma.
|
| + pos = cut_pos;
|
| + } else {
|
| + msg.Append("%s", event + pos);
|
| + pos += event_len;
|
| + }
|
| + msg.Append('\n');
|
| + msg.WriteToLogFile();
|
| + } while (pos < event_len);
|
| +#endif
|
| +}
|
| +
|
| +
|
| void Logger::DebugTag(const char* call_site_tag) {
|
| #ifdef ENABLE_LOGGING_AND_PROFILING
|
| if (!Log::IsEnabled() || !FLAG_log) return;
|
|
|