Index: src/log.cc |
=================================================================== |
--- src/log.cc (revision 3427) |
+++ src/log.cc (working copy) |
@@ -41,6 +41,21 @@ |
#ifdef ENABLE_LOGGING_AND_PROFILING |
+class LoggerPrivateData { |
+ public: |
+ // Tells whether we are currently recording tick samples. |
+ bool profiler_paused_; |
+ |
+ Address prev_to_; |
+ Address prev_sp_; |
+ |
+ LoggerPrivateData() |
+ :profiler_paused_(false), |
+ prev_to_(NULL), |
+ prev_sp_(NULL) { |
+ } |
+}; |
+ |
// |
// Sliding state window. Updates counters to keep track of the last |
// window of kBufferSize states. This is useful to track where we |
@@ -60,12 +75,12 @@ |
void IncrementStateCounter(StateTag state) { |
- Counters::state_counters[state].Increment(); |
+ INC_COUNTER(state_counters[state]); |
} |
void DecrementStateCounter(StateTag state) { |
- Counters::state_counters[state].Decrement(); |
+ DEC_COUNTER(state_counters[state]); |
} |
}; |
@@ -84,7 +99,7 @@ |
// Inserts collected profiling data into buffer. |
void Insert(TickSample* sample) { |
- if (paused_) |
+ if (v8_context()->logger_data_.private_data_.profiler_paused_) |
return; |
if (Succ(head_) == tail_) { |
@@ -109,9 +124,15 @@ |
void Run(); |
// Pause and Resume TickSample data collection. |
- static bool paused() { return paused_; } |
- static void pause() { paused_ = true; } |
- static void resume() { paused_ = false; } |
+ static bool paused() { |
+ return v8_context()->logger_data_.private_data_.profiler_paused_; |
+ } |
+ static void pause() { |
+ v8_context()->logger_data_.private_data_.profiler_paused_ = true; |
+ } |
+ static void resume() { |
+ v8_context()->logger_data_.private_data_.profiler_paused_ = false; |
+ } |
private: |
// Returns the next index in the cyclic buffer. |
@@ -131,12 +152,8 @@ |
// Tells whether worker thread should continue running. |
bool running_; |
- |
- // Tells whether we are currently recording tick samples. |
- static bool paused_; |
}; |
-bool Profiler::paused_ = false; |
// |
@@ -156,8 +173,9 @@ |
} |
int i = 0; |
- const Address callback = Logger::current_state_ != NULL ? |
- Logger::current_state_->external_callback() : NULL; |
+ LoggerData& logger_data = v8_context()->logger_data_; |
+ const Address callback = logger_data.current_state_ != NULL ? |
+ logger_data.current_state_->external_callback() : NULL; |
if (callback != NULL) { |
sample->stack[i++] = callback; |
} |
@@ -228,12 +246,12 @@ |
for (int i = 0; i < kBufferSize; i++) { |
buffer_[i] = static_cast<byte>(OTHER); |
} |
- Logger::ticker_->SetWindow(this); |
+ v8_context()->logger_data_.ticker_->SetWindow(this); |
} |
SlidingStateWindow::~SlidingStateWindow() { |
- Logger::ticker_->ClearWindow(); |
+ v8_context()->logger_data_.ticker_->ClearWindow(); |
} |
@@ -278,7 +296,7 @@ |
Start(); |
// Register to get ticks. |
- Logger::ticker_->SetProfiler(this); |
+ v8_context()->logger_data_.ticker_->SetProfiler(this); |
Logger::ProfilerBeginEvent(); |
Logger::LogAliases(); |
@@ -289,7 +307,7 @@ |
if (!engaged_) return; |
// Stop receiving ticks. |
- Logger::ticker_->ClearProfiler(); |
+ v8_context()->logger_data_.ticker_->ClearProfiler(); |
// Terminate the worker thread by setting running_ to false, |
// inserting a fake element in the queue and then wait for |
@@ -307,10 +325,11 @@ |
void Profiler::Run() { |
TickSample sample; |
- bool overflow = Logger::profiler_->Remove(&sample); |
+ LoggerData& logger_data = v8_context()->logger_data_; |
+ bool overflow = logger_data.profiler_->Remove(&sample); |
while (running_) { |
LOG(TickEvent(&sample, overflow)); |
- overflow = Logger::profiler_->Remove(&sample); |
+ overflow = logger_data.profiler_->Remove(&sample); |
} |
} |
@@ -318,15 +337,22 @@ |
// |
// Logger class implementation. |
// |
-Ticker* Logger::ticker_ = NULL; |
-Profiler* Logger::profiler_ = NULL; |
-VMState* Logger::current_state_ = NULL; |
-VMState Logger::bottom_state_(EXTERNAL); |
-SlidingStateWindow* Logger::sliding_state_window_ = NULL; |
-const char** Logger::log_events_ = NULL; |
-CompressionHelper* Logger::compression_helper_ = NULL; |
-bool Logger::is_logging_ = false; |
+LoggerData::LoggerData() |
+ :private_data_(*new LoggerPrivateData()), |
+ ticker_(NULL), |
+ profiler_(NULL), |
+ current_state_(NULL), |
+ sliding_state_window_(NULL), |
+ log_events_(NULL), |
+ compression_helper_(NULL), |
+ is_logging_(false), |
+ bottom_state_(EXTERNAL) { |
+} |
+LoggerData::~LoggerData() { |
+ delete &private_data_; |
+} |
+ |
#define DECLARE_LONG_EVENT(ignore1, long_name, ignore2) long_name, |
const char* kLongLogEventsNames[Logger::NUMBER_OF_LOG_EVENTS] = { |
LOG_EVENTS_AND_TAGS_LIST(DECLARE_LONG_EVENT) |
@@ -665,8 +691,8 @@ |
return msg->RetrieveCompressedPrevious(&compressor_); |
} |
OS::SNPrintF(prefix_, "%s,%d,", |
- Logger::log_events_[Logger::REPEAT_META_EVENT], |
- repeat_count_ + 1); |
+ v8_context()->logger_data_.log_events_[Logger::REPEAT_META_EVENT], |
+ repeat_count_ + 1); |
repeat_count_ = 0; |
return msg->RetrieveCompressedPrevious(&compressor_, prefix_.start()); |
} |
@@ -685,13 +711,14 @@ |
Address entry_point) { |
if (!Log::IsEnabled() || !FLAG_log_code) return; |
LogMessageBuilder msg; |
- msg.Append("%s,%s,", |
- log_events_[CODE_CREATION_EVENT], log_events_[CALLBACK_TAG]); |
+ LoggerData& logger_data = v8_context()->logger_data_; |
+ msg.Append("%s,%s,", logger_data.log_events_[CODE_CREATION_EVENT], |
+ logger_data.log_events_[CALLBACK_TAG]); |
msg.AppendAddress(entry_point); |
msg.Append(",1,\"%s%s\"", prefix, name); |
if (FLAG_compress_log) { |
- ASSERT(compression_helper_ != NULL); |
- if (!compression_helper_->HandleMessage(&msg)) return; |
+ ASSERT(logger_data.compression_helper_ != NULL); |
+ if (!logger_data.compression_helper_->HandleMessage(&msg)) return; |
} |
msg.Append('\n'); |
msg.WriteToLogFile(); |
@@ -735,7 +762,9 @@ |
#ifdef ENABLE_LOGGING_AND_PROFILING |
if (!Log::IsEnabled() || !FLAG_log_code) return; |
LogMessageBuilder msg; |
- msg.Append("%s,%s,", log_events_[CODE_CREATION_EVENT], log_events_[tag]); |
+ LoggerData& logger_data = v8_context()->logger_data_; |
+ msg.Append("%s,%s,", logger_data.log_events_[CODE_CREATION_EVENT], |
+ logger_data.log_events_[tag]); |
msg.AppendAddress(code->address()); |
msg.Append(",%d,\"", code->ExecutableSize()); |
for (const char* p = comment; *p != '\0'; p++) { |
@@ -746,8 +775,8 @@ |
} |
msg.Append('"'); |
if (FLAG_compress_log) { |
- ASSERT(compression_helper_ != NULL); |
- if (!compression_helper_->HandleMessage(&msg)) return; |
+ ASSERT(logger_data.compression_helper_ != NULL); |
+ if (!logger_data.compression_helper_->HandleMessage(&msg)) return; |
} |
msg.Append('\n'); |
msg.WriteToLogFile(); |
@@ -761,12 +790,14 @@ |
LogMessageBuilder msg; |
SmartPointer<char> str = |
name->ToCString(DISALLOW_NULLS, ROBUST_STRING_TRAVERSAL); |
- msg.Append("%s,%s,", log_events_[CODE_CREATION_EVENT], log_events_[tag]); |
+ LoggerData& logger_data = v8_context()->logger_data_; |
+ msg.Append("%s,%s,", logger_data.log_events_[CODE_CREATION_EVENT], |
+ logger_data.log_events_[tag]); |
msg.AppendAddress(code->address()); |
msg.Append(",%d,\"%s\"", code->ExecutableSize(), *str); |
if (FLAG_compress_log) { |
- ASSERT(compression_helper_ != NULL); |
- if (!compression_helper_->HandleMessage(&msg)) return; |
+ ASSERT(logger_data.compression_helper_ != NULL); |
+ if (!logger_data.compression_helper_->HandleMessage(&msg)) return; |
} |
msg.Append('\n'); |
msg.WriteToLogFile(); |
@@ -784,13 +815,15 @@ |
name->ToCString(DISALLOW_NULLS, ROBUST_STRING_TRAVERSAL); |
SmartPointer<char> sourcestr = |
source->ToCString(DISALLOW_NULLS, ROBUST_STRING_TRAVERSAL); |
- msg.Append("%s,%s,", log_events_[CODE_CREATION_EVENT], log_events_[tag]); |
+ LoggerData& logger_data = v8_context()->logger_data_; |
+ msg.Append("%s,%s,", logger_data.log_events_[CODE_CREATION_EVENT], |
+ logger_data.log_events_[tag]); |
msg.AppendAddress(code->address()); |
msg.Append(",%d,\"%s %s:%d\"", |
code->ExecutableSize(), *str, *sourcestr, line); |
if (FLAG_compress_log) { |
- ASSERT(compression_helper_ != NULL); |
- if (!compression_helper_->HandleMessage(&msg)) return; |
+ ASSERT(logger_data.compression_helper_ != NULL); |
+ if (!logger_data.compression_helper_->HandleMessage(&msg)) return; |
} |
msg.Append('\n'); |
msg.WriteToLogFile(); |
@@ -802,12 +835,14 @@ |
#ifdef ENABLE_LOGGING_AND_PROFILING |
if (!Log::IsEnabled() || !FLAG_log_code) return; |
LogMessageBuilder msg; |
- msg.Append("%s,%s,", log_events_[CODE_CREATION_EVENT], log_events_[tag]); |
+ LoggerData& logger_data = v8_context()->logger_data_; |
+ msg.Append("%s,%s,", logger_data.log_events_[CODE_CREATION_EVENT], |
+ logger_data.log_events_[tag]); |
msg.AppendAddress(code->address()); |
msg.Append(",%d,\"args_count: %d\"", code->ExecutableSize(), args_count); |
if (FLAG_compress_log) { |
- ASSERT(compression_helper_ != NULL); |
- if (!compression_helper_->HandleMessage(&msg)) return; |
+ ASSERT(logger_data.compression_helper_ != NULL); |
+ if (!logger_data.compression_helper_->HandleMessage(&msg)) return; |
} |
msg.Append('\n'); |
msg.WriteToLogFile(); |
@@ -819,15 +854,17 @@ |
#ifdef ENABLE_LOGGING_AND_PROFILING |
if (!Log::IsEnabled() || !FLAG_log_code) return; |
LogMessageBuilder msg; |
+ LoggerData& logger_data = v8_context()->logger_data_; |
msg.Append("%s,%s,", |
- log_events_[CODE_CREATION_EVENT], log_events_[REG_EXP_TAG]); |
+ logger_data.log_events_[CODE_CREATION_EVENT], |
+ logger_data.log_events_[REG_EXP_TAG]); |
msg.AppendAddress(code->address()); |
msg.Append(",%d,\"", code->ExecutableSize()); |
msg.AppendDetailed(source, false); |
msg.Append('\"'); |
if (FLAG_compress_log) { |
- ASSERT(compression_helper_ != NULL); |
- if (!compression_helper_->HandleMessage(&msg)) return; |
+ ASSERT(logger_data.compression_helper_ != NULL); |
+ if (!logger_data.compression_helper_->HandleMessage(&msg)) return; |
} |
msg.Append('\n'); |
msg.WriteToLogFile(); |
@@ -837,17 +874,17 @@ |
void Logger::CodeMoveEvent(Address from, Address to) { |
#ifdef ENABLE_LOGGING_AND_PROFILING |
- static Address prev_to_ = NULL; |
if (!Log::IsEnabled() || !FLAG_log_code) return; |
LogMessageBuilder msg; |
- msg.Append("%s,", log_events_[CODE_MOVE_EVENT]); |
+ LoggerData& logger_data = v8_context()->logger_data_; |
+ msg.Append("%s,", logger_data.log_events_[CODE_MOVE_EVENT]); |
msg.AppendAddress(from); |
msg.Append(','); |
- msg.AppendAddress(to, prev_to_); |
- prev_to_ = to; |
+ msg.AppendAddress(to, logger_data.private_data_.prev_to_); |
+ logger_data.private_data_.prev_to_ = to; |
if (FLAG_compress_log) { |
- ASSERT(compression_helper_ != NULL); |
- if (!compression_helper_->HandleMessage(&msg)) return; |
+ ASSERT(logger_data.compression_helper_ != NULL); |
+ if (!logger_data.compression_helper_->HandleMessage(&msg)) return; |
} |
msg.Append('\n'); |
msg.WriteToLogFile(); |
@@ -859,11 +896,12 @@ |
#ifdef ENABLE_LOGGING_AND_PROFILING |
if (!Log::IsEnabled() || !FLAG_log_code) return; |
LogMessageBuilder msg; |
- msg.Append("%s,", log_events_[CODE_DELETE_EVENT]); |
+ LoggerData& logger_data = v8_context()->logger_data_; |
+ msg.Append("%s,", logger_data.log_events_[CODE_DELETE_EVENT]); |
msg.AppendAddress(from); |
if (FLAG_compress_log) { |
- ASSERT(compression_helper_ != NULL); |
- if (!compression_helper_->HandleMessage(&msg)) return; |
+ ASSERT(logger_data.compression_helper_ != NULL); |
+ if (!logger_data.compression_helper_->HandleMessage(&msg)) return; |
} |
msg.Append('\n'); |
msg.WriteToLogFile(); |
@@ -1051,14 +1089,16 @@ |
#ifdef ENABLE_LOGGING_AND_PROFILING |
void Logger::TickEvent(TickSample* sample, bool overflow) { |
if (!Log::IsEnabled() || !FLAG_prof) return; |
- static Address prev_sp = NULL; |
+ |
LogMessageBuilder msg; |
- msg.Append("%s,", log_events_[TICK_EVENT]); |
+ LoggerData& logger_data = v8_context()->logger_data_; |
+ msg.Append("%s,", logger_data.log_events_[TICK_EVENT]); |
Address prev_addr = reinterpret_cast<Address>(sample->pc); |
msg.AppendAddress(prev_addr); |
msg.Append(','); |
- msg.AppendAddress(reinterpret_cast<Address>(sample->sp), prev_sp); |
- prev_sp = reinterpret_cast<Address>(sample->sp); |
+ msg.AppendAddress(reinterpret_cast<Address>(sample->sp), |
+ logger_data.private_data_.prev_sp_); |
+ logger_data.private_data_.prev_sp_ = reinterpret_cast<Address>(sample->sp); |
msg.Append(",%d", static_cast<int>(sample->state)); |
if (overflow) { |
msg.Append(",overflow"); |
@@ -1069,8 +1109,8 @@ |
prev_addr = sample->stack[i]; |
} |
if (FLAG_compress_log) { |
- ASSERT(compression_helper_ != NULL); |
- if (!compression_helper_->HandleMessage(&msg)) return; |
+ ASSERT(logger_data.compression_helper_ != NULL); |
+ if (!logger_data.compression_helper_->HandleMessage(&msg)) return; |
} |
msg.Append('\n'); |
msg.WriteToLogFile(); |
@@ -1079,7 +1119,7 @@ |
int Logger::GetActiveProfilerModules() { |
int result = PROFILER_MODULE_NONE; |
- if (!profiler_->paused()) { |
+ if (!v8_context()->logger_data_.profiler_->paused()) { |
result |= PROFILER_MODULE_CPU; |
} |
if (FLAG_log_gc) { |
@@ -1095,10 +1135,11 @@ |
const int modules_to_disable = active_modules & flags; |
if (modules_to_disable == PROFILER_MODULE_NONE) return; |
+ LoggerData& logger_data = v8_context()->logger_data_; |
if (modules_to_disable & PROFILER_MODULE_CPU) { |
- profiler_->pause(); |
+ logger_data.profiler_->pause(); |
if (FLAG_prof_lazy) { |
- if (!FLAG_sliding_state_window) ticker_->Stop(); |
+ if (!FLAG_sliding_state_window) logger_data.ticker_->Stop(); |
FLAG_log_code = false; |
// Must be the same message as Log::kDynamicBufferSeal. |
LOG(UncheckedStringEvent("profiler", "pause")); |
@@ -1110,7 +1151,7 @@ |
} |
// Turn off logging if no active modules remain. |
if ((active_modules & ~flags) == PROFILER_MODULE_NONE) { |
- is_logging_ = false; |
+ logger_data.is_logging_ = false; |
} |
} |
@@ -1118,19 +1159,20 @@ |
void Logger::ResumeProfiler(int flags) { |
if (!Log::IsEnabled()) return; |
const int modules_to_enable = ~GetActiveProfilerModules() & flags; |
+ LoggerData& logger_data = v8_context()->logger_data_; |
if (modules_to_enable != PROFILER_MODULE_NONE) { |
- is_logging_ = true; |
+ logger_data.is_logging_ = true; |
} |
if (modules_to_enable & PROFILER_MODULE_CPU) { |
if (FLAG_prof_lazy) { |
- profiler_->Engage(); |
+ logger_data.profiler_->Engage(); |
LOG(UncheckedStringEvent("profiler", "resume")); |
FLAG_log_code = true; |
LogCompiledFunctions(); |
LogAccessorCallbacks(); |
- if (!FLAG_sliding_state_window) ticker_->Start(); |
+ if (!FLAG_sliding_state_window) logger_data.ticker_->Start(); |
} |
- profiler_->resume(); |
+ logger_data.profiler_->resume(); |
} |
if (modules_to_enable & |
(PROFILER_MODULE_HEAP_STATS | PROFILER_MODULE_JS_CONSTRUCTORS)) { |
@@ -1148,7 +1190,7 @@ |
bool Logger::IsProfilerSamplerActive() { |
- return ticker_->IsActive(); |
+ return v8_context()->logger_data_.ticker_->IsActive(); |
} |
@@ -1371,36 +1413,37 @@ |
Log::OpenFile(FLAG_logfile); |
} |
} |
+ LoggerData& logger_data = v8_context()->logger_data_; |
+ logger_data.current_state_ = &logger_data.bottom_state_; |
- current_state_ = &bottom_state_; |
+ logger_data.ticker_ = new Ticker(kSamplingIntervalMs); |
- ticker_ = new Ticker(kSamplingIntervalMs); |
- |
- if (FLAG_sliding_state_window && sliding_state_window_ == NULL) { |
- sliding_state_window_ = new SlidingStateWindow(); |
+ if (FLAG_sliding_state_window && logger_data.sliding_state_window_ == NULL) { |
+ logger_data.sliding_state_window_ = new SlidingStateWindow(); |
} |
- log_events_ = FLAG_compress_log ? |
+ logger_data.log_events_ = FLAG_compress_log ? |
kCompressedLogEventsNames : kLongLogEventsNames; |
if (FLAG_compress_log) { |
- compression_helper_ = new CompressionHelper(kCompressionWindowSize); |
+ logger_data.compression_helper_ = |
+ new CompressionHelper(kCompressionWindowSize); |
} |
- is_logging_ = start_logging; |
+ logger_data.is_logging_ = start_logging; |
if (FLAG_prof) { |
- profiler_ = new Profiler(); |
+ logger_data.profiler_ = new Profiler(); |
if (!FLAG_prof_auto) { |
- profiler_->pause(); |
+ logger_data.profiler_->pause(); |
} else { |
- is_logging_ = true; |
+ logger_data.is_logging_ = true; |
} |
if (!FLAG_prof_lazy) { |
- profiler_->Engage(); |
+ logger_data.profiler_->Engage(); |
} |
} |
- LogMessageBuilder::set_write_failure_handler(StopLoggingAndProfiling); |
+ v8_context()->log_data_.set_write_failure_handler(StopLoggingAndProfiling); |
return true; |
@@ -1412,23 +1455,24 @@ |
void Logger::TearDown() { |
#ifdef ENABLE_LOGGING_AND_PROFILING |
- LogMessageBuilder::set_write_failure_handler(NULL); |
+ LoggerData& logger_data = v8_context()->logger_data_; |
+ v8_context()->log_data_.set_write_failure_handler(NULL); |
// Stop the profiler before closing the file. |
- if (profiler_ != NULL) { |
- profiler_->Disengage(); |
- delete profiler_; |
- profiler_ = NULL; |
+ if (logger_data.profiler_ != NULL) { |
+ logger_data.profiler_->Disengage(); |
+ delete logger_data.profiler_; |
+ logger_data.profiler_ = NULL; |
} |
- delete compression_helper_; |
- compression_helper_ = NULL; |
+ delete logger_data.compression_helper_; |
+ logger_data.compression_helper_ = NULL; |
- delete sliding_state_window_; |
- sliding_state_window_ = NULL; |
+ delete logger_data.sliding_state_window_; |
+ logger_data.sliding_state_window_ = NULL; |
- delete ticker_; |
- ticker_ = NULL; |
+ delete logger_data.ticker_; |
+ logger_data.ticker_ = NULL; |
Log::Close(); |
#endif |
@@ -1437,18 +1481,19 @@ |
void Logger::EnableSlidingStateWindow() { |
#ifdef ENABLE_LOGGING_AND_PROFILING |
+ LoggerData& logger_data = v8_context()->logger_data_; |
// If the ticker is NULL, Logger::Setup has not been called yet. In |
// that case, we set the sliding_state_window flag so that the |
// sliding window computation will be started when Logger::Setup is |
// called. |
- if (ticker_ == NULL) { |
+ if (logger_data.ticker_ == NULL) { |
FLAG_sliding_state_window = true; |
return; |
} |
// Otherwise, if the sliding state window computation has not been |
// started we do it now. |
- if (sliding_state_window_ == NULL) { |
- sliding_state_window_ = new SlidingStateWindow(); |
+ if (logger_data.sliding_state_window_ == NULL) { |
+ logger_data.sliding_state_window_ = new SlidingStateWindow(); |
} |
#endif |
} |