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

Unified Diff: src/log.cc

Issue 537833002: Make logger use new sampling API for ticks and code events. Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 6 years, 3 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
« no previous file with comments | « src/log.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/log.cc
diff --git a/src/log.cc b/src/log.cc
index 6a956b496dc4b37859fd6ef880fbb3628d184586..875c8a64836e7127f5742440d94a7d3bd5e92ca8 100644
--- a/src/log.cc
+++ b/src/log.cc
@@ -203,6 +203,8 @@ void CodeEventLogger::CodeCreateEvent(Logger::LogEventsAndTags tag,
}
name_buffer_->AppendByte(':');
name_buffer_->AppendInt(line);
+ name_buffer_->AppendByte(':');
+ name_buffer_->AppendInt(column);
LogRecordedBuffer(code, shared, name_buffer_->get(), name_buffer_->size());
}
@@ -939,6 +941,7 @@ Logger::Logger(Isolate* isolate)
ll_logger_(NULL),
jit_logger_(NULL),
listeners_(5),
+ sampler_thread_(NULL),
is_initialized_(false) {
}
@@ -1329,16 +1332,38 @@ void Logger::SetterCallbackEvent(Name* name, Address entry_point) {
}
-static void AppendCodeCreateHeader(Log::MessageBuilder* msg,
- Logger::LogEventsAndTags tag,
- Code* code) {
- ASSERT(msg);
- msg->Append("%s,%s,%d,",
- kLogEventsNames[Logger::CODE_CREATION_EVENT],
- kLogEventsNames[tag],
- code->kind());
- msg->AppendAddress(code->address());
- msg->Append(",%d,", code->ExecutableSize());
+void Logger::CodeCreateEvent(const v8::JitCodeEvent* event) {
+ if (!is_logging_code_events() ||
+ !FLAG_log_code ||
+ !log_->IsEnabled()) return;
+
+ Log::MessageBuilder msg(log_);
+ msg.Append("%s,", kLogEventsNames[Logger::CODE_CREATION_EVENT]);
+
+ // Extract the tag name.
+ unsigned i = 0;
+ for (; i < event->name.len; i++) {
+ if (event->name.str[i] == ':') break;
+ msg.Append(event->name.str[i]);
+ }
+ i++;
+
+ msg.Append(",,%p,%d,\"", event->code_start, event->code_len);
+
+ // Have a look at function ComputeMarker
+ // The first character here might be the marker.
+ // In that case, get rid of that.
+ if ((i < event->name.len) &&
+ ((event->name.str[i] == '~') ||
+ (event->name.str[i] == '*')))
+ i++;
+
+ for (; i < event->name.len; i++) {
+ msg.Append(event->name.str[i]);
+ }
+ msg.Append("\"\n");
+
+ msg.WriteToLogFile();
}
@@ -1349,13 +1374,6 @@ void Logger::CodeCreateEvent(LogEventsAndTags tag,
if (!is_logging_code_events()) return;
CALL_LISTENERS(CodeCreateEvent(tag, code, comment));
-
- if (!FLAG_log_code || !log_->IsEnabled()) return;
- Log::MessageBuilder msg(log_);
- AppendCodeCreateHeader(&msg, tag, code);
- msg.AppendDoubleQuotedString(comment);
- msg.Append('\n');
- msg.WriteToLogFile();
}
@@ -1366,19 +1384,6 @@ void Logger::CodeCreateEvent(LogEventsAndTags tag,
if (!is_logging_code_events()) return;
CALL_LISTENERS(CodeCreateEvent(tag, code, name));
-
- if (!FLAG_log_code || !log_->IsEnabled()) return;
- Log::MessageBuilder msg(log_);
- AppendCodeCreateHeader(&msg, tag, code);
- if (name->IsString()) {
- msg.Append('"');
- msg.AppendDetailed(String::cast(name), false);
- msg.Append('"');
- } else {
- msg.AppendSymbolName(Symbol::cast(name));
- }
- msg.Append('\n');
- msg.WriteToLogFile();
}
@@ -1391,25 +1396,6 @@ void Logger::CodeCreateEvent(LogEventsAndTags tag,
if (!is_logging_code_events()) return;
CALL_LISTENERS(CodeCreateEvent(tag, code, shared, info, name));
-
- if (!FLAG_log_code || !log_->IsEnabled()) return;
- if (code == isolate_->builtins()->builtin(Builtins::kCompileUnoptimized))
- return;
-
- Log::MessageBuilder msg(log_);
- AppendCodeCreateHeader(&msg, tag, code);
- if (name->IsString()) {
- SmartArrayPointer<char> str =
- String::cast(name)->ToCString(DISALLOW_NULLS, ROBUST_STRING_TRAVERSAL);
- msg.Append("\"%s\"", str.get());
- } else {
- msg.AppendSymbolName(Symbol::cast(name));
- }
- msg.Append(',');
- msg.AppendAddress(shared->address());
- msg.Append(",%s", ComputeMarker(code));
- msg.Append('\n');
- msg.WriteToLogFile();
}
@@ -1426,25 +1412,6 @@ void Logger::CodeCreateEvent(LogEventsAndTags tag,
if (!is_logging_code_events()) return;
CALL_LISTENERS(CodeCreateEvent(tag, code, shared, info, source, line,
column));
-
- if (!FLAG_log_code || !log_->IsEnabled()) return;
- Log::MessageBuilder msg(log_);
- AppendCodeCreateHeader(&msg, tag, code);
- SmartArrayPointer<char> name =
- shared->DebugName()->ToCString(DISALLOW_NULLS, ROBUST_STRING_TRAVERSAL);
- msg.Append("\"%s ", name.get());
- if (source->IsString()) {
- SmartArrayPointer<char> sourcestr =
- String::cast(source)->ToCString(DISALLOW_NULLS, ROBUST_STRING_TRAVERSAL);
- msg.Append("%s", sourcestr.get());
- } else {
- msg.AppendSymbolName(Symbol::cast(source));
- }
- msg.Append(":%d:%d\",", line, column);
- msg.AppendAddress(shared->address());
- msg.Append(",%s", ComputeMarker(code));
- msg.Append('\n');
- msg.WriteToLogFile();
}
@@ -1455,13 +1422,6 @@ void Logger::CodeCreateEvent(LogEventsAndTags tag,
if (!is_logging_code_events()) return;
CALL_LISTENERS(CodeCreateEvent(tag, code, args_count));
-
- if (!FLAG_log_code || !log_->IsEnabled()) return;
- Log::MessageBuilder msg(log_);
- AppendCodeCreateHeader(&msg, tag, code);
- msg.Append("\"args_count: %d\"", args_count);
- msg.Append('\n');
- msg.WriteToLogFile();
}
@@ -1498,15 +1458,14 @@ void Logger::RegExpCodeCreateEvent(Code* code, String* source) {
if (!is_logging_code_events()) return;
CALL_LISTENERS(RegExpCodeCreateEvent(code, source));
+}
- if (!FLAG_log_code || !log_->IsEnabled()) return;
- Log::MessageBuilder msg(log_);
- AppendCodeCreateHeader(&msg, REG_EXP_TAG, code);
- msg.Append('"');
- msg.AppendDetailed(source, false);
- msg.Append('"');
- msg.Append('\n');
- msg.WriteToLogFile();
+
+void Logger::CodeMoveEvent(const v8::JitCodeEvent* event) {
+ if (!is_logging_code_events()) return;
+ MoveEventInternal(CODE_MOVE_EVENT,
+ static_cast<Address>(event->code_start),
+ static_cast<Address>(event->new_code_start));
}
@@ -1515,25 +1474,28 @@ void Logger::CodeMoveEvent(Address from, Address to) {
if (!is_logging_code_events()) return;
CALL_LISTENERS(CodeMoveEvent(from, to));
- MoveEventInternal(CODE_MOVE_EVENT, from, to);
}
-void Logger::CodeDeleteEvent(Address from) {
- PROFILER_LOG(CodeDeleteEvent(from));
-
+void Logger::CodeDeleteEvent(const v8::JitCodeEvent* event) {
if (!is_logging_code_events()) return;
- CALL_LISTENERS(CodeDeleteEvent(from));
-
if (!FLAG_log_code || !log_->IsEnabled()) return;
Log::MessageBuilder msg(log_);
msg.Append("%s,", kLogEventsNames[CODE_DELETE_EVENT]);
- msg.AppendAddress(from);
+ msg.AppendAddress(static_cast<Address>(event->code_start));
msg.Append('\n');
msg.WriteToLogFile();
}
+void Logger::CodeDeleteEvent(Address from) {
+ PROFILER_LOG(CodeDeleteEvent(from));
+
+ if (!is_logging_code_events()) return;
+ CALL_LISTENERS(CodeDeleteEvent(from));
+}
+
+
void Logger::CodeLinePosInfoAddPositionEvent(void* jit_handler_data,
int pc_offset,
int position) {
@@ -1701,23 +1663,13 @@ void Logger::DebugEvent(const char* event_type, Vector<uint16_t> parameter) {
}
-void Logger::TickEvent(TickSample* sample, bool overflow) {
+void Logger::LogSample(v8::Sample* sample) {
if (!log_->IsEnabled() || !FLAG_prof) return;
+
Log::MessageBuilder msg(log_);
- msg.Append("%s,", kLogEventsNames[TICK_EVENT]);
- msg.AppendAddress(sample->pc);
- msg.Append(",%ld", static_cast<int>(timer_.Elapsed().InMicroseconds()));
- if (sample->has_external_callback) {
- msg.Append(",1,");
- msg.AppendAddress(sample->external_callback);
- } else {
- msg.Append(",0,");
- msg.AppendAddress(sample->tos);
- }
- msg.Append(",%d", static_cast<int>(sample->state));
- if (overflow) {
- msg.Append(",overflow");
- }
+ msg.Append("%s,,%ld,,,",
+ kLogEventsNames[TICK_EVENT],
+ static_cast<int>(timer_.Elapsed().InMicroseconds()));
for (unsigned i = 0; i < sample->frames_count; ++i) {
msg.Append(',');
msg.AppendAddress(static_cast<Address>(sample->stack[i]));
@@ -2058,6 +2010,9 @@ bool Logger::SetUp(Isolate* isolate) {
profiler_ = new Profiler(isolate);
is_logging_ = true;
profiler_->Engage();
+
+ sampler_thread_ = new SamplerThread(
+ reinterpret_cast<v8::Isolate*>(isolate));
}
// TODO(gholap): This one's for the new sampler API. (include/v8-sampler.h)
@@ -2136,7 +2091,61 @@ FILE* Logger::TearDown() {
jit_logger_ = NULL;
}
+ if (sampler_thread_) {
+ delete sampler_thread_;
+ sampler_thread_ = NULL;
+ }
+
return log_->Close();
}
+
+void Logger::SamplerThread::JitCodeEventHandler(const v8::JitCodeEvent* event) {
+ switch (event->type) {
+ case v8::JitCodeEvent::CODE_ADDED:
+ Isolate::Current()->logger()->CodeCreateEvent(event);
+ break;
+
+ case v8::JitCodeEvent::CODE_MOVED:
+ Isolate::Current()->logger()->CodeMoveEvent(event);
+ break;
+
+ case v8::JitCodeEvent::CODE_REMOVED:
+ Isolate::Current()->logger()->CodeDeleteEvent(event);
+ break;
+
+ default:
+ break;
+ }
+}
+
+
+Logger::SamplerThread::SamplerThread(v8::Isolate* isolate)
+ : Thread(Thread::Options("d8:sampler")),
+ isolate_(isolate),
+ done_sampling_(false) {
+ reinterpret_cast<Isolate*>(isolate)->logger()->SetCodeEventHandler(
+ v8::kJitCodeEventDefault,
+ Logger::SamplerThread::JitCodeEventHandler);
+ Start();
+}
+
+
+void Logger::SamplerThread::Run() {
+ Sample sample;
+ while (!done_sampling_) {
+ v8::base::OS::Sleep(1);
+ isolate_->GetSample(&sample);
+ if (sample.frames_count != 0) {
+ reinterpret_cast<Isolate*>(isolate_)->logger()->LogSample(&sample);
+ }
+ }
+}
+
+
+Logger::SamplerThread::~SamplerThread() {
+ done_sampling_ = true;
+ Join();
+}
+
} } // namespace v8::internal
« no previous file with comments | « src/log.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698