OLD | NEW |
1 // Copyright 2009 the V8 project authors. All rights reserved. | 1 // Copyright 2009 the V8 project authors. All rights reserved. |
2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
4 // met: | 4 // met: |
5 // | 5 // |
6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
(...skipping 311 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
322 // | 322 // |
323 // Logger class implementation. | 323 // Logger class implementation. |
324 // | 324 // |
325 Ticker* Logger::ticker_ = NULL; | 325 Ticker* Logger::ticker_ = NULL; |
326 Profiler* Logger::profiler_ = NULL; | 326 Profiler* Logger::profiler_ = NULL; |
327 VMState* Logger::current_state_ = NULL; | 327 VMState* Logger::current_state_ = NULL; |
328 VMState Logger::bottom_state_(EXTERNAL); | 328 VMState Logger::bottom_state_(EXTERNAL); |
329 SlidingStateWindow* Logger::sliding_state_window_ = NULL; | 329 SlidingStateWindow* Logger::sliding_state_window_ = NULL; |
330 const char** Logger::log_events_ = NULL; | 330 const char** Logger::log_events_ = NULL; |
331 CompressionHelper* Logger::compression_helper_ = NULL; | 331 CompressionHelper* Logger::compression_helper_ = NULL; |
332 bool Logger::is_logging_ = false; | 332 int Logger::logging_nesting_ = 0; |
333 int Logger::cpu_profiler_nesting_ = 0; | 333 int Logger::cpu_profiler_nesting_ = 0; |
334 int Logger::heap_profiler_nesting_ = 0; | 334 int Logger::heap_profiler_nesting_ = 0; |
335 | 335 |
336 #define DECLARE_LONG_EVENT(ignore1, long_name, ignore2) long_name, | 336 #define DECLARE_LONG_EVENT(ignore1, long_name, ignore2) long_name, |
337 const char* kLongLogEventsNames[Logger::NUMBER_OF_LOG_EVENTS] = { | 337 const char* kLongLogEventsNames[Logger::NUMBER_OF_LOG_EVENTS] = { |
338 LOG_EVENTS_AND_TAGS_LIST(DECLARE_LONG_EVENT) | 338 LOG_EVENTS_AND_TAGS_LIST(DECLARE_LONG_EVENT) |
339 }; | 339 }; |
340 #undef DECLARE_LONG_EVENT | 340 #undef DECLARE_LONG_EVENT |
341 | 341 |
342 #define DECLARE_SHORT_EVENT(ignore1, ignore2, short_name) short_name, | 342 #define DECLARE_SHORT_EVENT(ignore1, ignore2, short_name) short_name, |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
382 if (!Log::IsEnabled()) return; | 382 if (!Log::IsEnabled()) return; |
383 LogMessageBuilder msg; | 383 LogMessageBuilder msg; |
384 msg.Append("%s,\"%s\"\n", name, value); | 384 msg.Append("%s,\"%s\"\n", name, value); |
385 msg.WriteToLogFile(); | 385 msg.WriteToLogFile(); |
386 } | 386 } |
387 #endif | 387 #endif |
388 | 388 |
389 | 389 |
390 void Logger::IntEvent(const char* name, int value) { | 390 void Logger::IntEvent(const char* name, int value) { |
391 #ifdef ENABLE_LOGGING_AND_PROFILING | 391 #ifdef ENABLE_LOGGING_AND_PROFILING |
392 if (!Log::IsEnabled() || !FLAG_log) return; | 392 if (FLAG_log) UncheckedIntEvent(name, value); |
393 LogMessageBuilder msg; | |
394 msg.Append("%s,%d\n", name, value); | |
395 msg.WriteToLogFile(); | |
396 #endif | 393 #endif |
397 } | 394 } |
398 | 395 |
399 | 396 |
| 397 #ifdef ENABLE_LOGGING_AND_PROFILING |
| 398 void Logger::UncheckedIntEvent(const char* name, int value) { |
| 399 if (!Log::IsEnabled()) return; |
| 400 LogMessageBuilder msg; |
| 401 msg.Append("%s,%d\n", name, value); |
| 402 msg.WriteToLogFile(); |
| 403 } |
| 404 #endif |
| 405 |
| 406 |
400 void Logger::HandleEvent(const char* name, Object** location) { | 407 void Logger::HandleEvent(const char* name, Object** location) { |
401 #ifdef ENABLE_LOGGING_AND_PROFILING | 408 #ifdef ENABLE_LOGGING_AND_PROFILING |
402 if (!Log::IsEnabled() || !FLAG_log_handles) return; | 409 if (!Log::IsEnabled() || !FLAG_log_handles) return; |
403 LogMessageBuilder msg; | 410 LogMessageBuilder msg; |
404 msg.Append("%s,0x%" V8PRIxPTR "\n", name, location); | 411 msg.Append("%s,0x%" V8PRIxPTR "\n", name, location); |
405 msg.WriteToLogFile(); | 412 msg.WriteToLogFile(); |
406 #endif | 413 #endif |
407 } | 414 } |
408 | 415 |
409 | 416 |
(...skipping 752 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1162 if (flags & PROFILER_MODULE_CPU) { | 1169 if (flags & PROFILER_MODULE_CPU) { |
1163 // It is OK to have negative nesting. | 1170 // It is OK to have negative nesting. |
1164 if (--cpu_profiler_nesting_ == 0) { | 1171 if (--cpu_profiler_nesting_ == 0) { |
1165 profiler_->pause(); | 1172 profiler_->pause(); |
1166 if (FLAG_prof_lazy) { | 1173 if (FLAG_prof_lazy) { |
1167 if (!FLAG_sliding_state_window) ticker_->Stop(); | 1174 if (!FLAG_sliding_state_window) ticker_->Stop(); |
1168 FLAG_log_code = false; | 1175 FLAG_log_code = false; |
1169 // Must be the same message as Log::kDynamicBufferSeal. | 1176 // Must be the same message as Log::kDynamicBufferSeal. |
1170 LOG(UncheckedStringEvent("profiler", "pause")); | 1177 LOG(UncheckedStringEvent("profiler", "pause")); |
1171 } | 1178 } |
| 1179 --logging_nesting_; |
1172 } | 1180 } |
1173 } | 1181 } |
1174 if (flags & | 1182 if (flags & |
1175 (PROFILER_MODULE_HEAP_STATS | PROFILER_MODULE_JS_CONSTRUCTORS)) { | 1183 (PROFILER_MODULE_HEAP_STATS | PROFILER_MODULE_JS_CONSTRUCTORS)) { |
1176 if (--heap_profiler_nesting_ == 0) { | 1184 if (--heap_profiler_nesting_ == 0) { |
1177 FLAG_log_gc = false; | 1185 FLAG_log_gc = false; |
| 1186 --logging_nesting_; |
1178 } | 1187 } |
1179 } | 1188 } |
1180 if (tag != 0) { | 1189 if (tag != 0) { |
1181 IntEvent("close-tag", tag); | 1190 UncheckedIntEvent("close-tag", tag); |
1182 } | |
1183 if (GetActiveProfilerModules() == PROFILER_MODULE_NONE) { | |
1184 is_logging_ = false; | |
1185 } | 1191 } |
1186 } | 1192 } |
1187 | 1193 |
1188 | 1194 |
1189 void Logger::ResumeProfiler(int flags, int tag) { | 1195 void Logger::ResumeProfiler(int flags, int tag) { |
1190 if (!Log::IsEnabled()) return; | 1196 if (!Log::IsEnabled()) return; |
1191 if (tag != 0) { | 1197 if (tag != 0) { |
1192 IntEvent("open-tag", tag); | 1198 UncheckedIntEvent("open-tag", tag); |
1193 } | 1199 } |
1194 if (flags & PROFILER_MODULE_CPU) { | 1200 if (flags & PROFILER_MODULE_CPU) { |
1195 if (cpu_profiler_nesting_++ == 0) { | 1201 if (cpu_profiler_nesting_++ == 0) { |
1196 is_logging_ = true; | 1202 ++logging_nesting_; |
1197 if (FLAG_prof_lazy) { | 1203 if (FLAG_prof_lazy) { |
1198 profiler_->Engage(); | 1204 profiler_->Engage(); |
1199 LOG(UncheckedStringEvent("profiler", "resume")); | 1205 LOG(UncheckedStringEvent("profiler", "resume")); |
1200 FLAG_log_code = true; | 1206 FLAG_log_code = true; |
1201 LogCompiledFunctions(); | 1207 LogCompiledFunctions(); |
1202 LogFunctionObjects(); | 1208 LogFunctionObjects(); |
1203 LogAccessorCallbacks(); | 1209 LogAccessorCallbacks(); |
1204 if (!FLAG_sliding_state_window) ticker_->Start(); | 1210 if (!FLAG_sliding_state_window) ticker_->Start(); |
1205 } | 1211 } |
1206 profiler_->resume(); | 1212 profiler_->resume(); |
1207 } | 1213 } |
1208 } | 1214 } |
1209 if (flags & | 1215 if (flags & |
1210 (PROFILER_MODULE_HEAP_STATS | PROFILER_MODULE_JS_CONSTRUCTORS)) { | 1216 (PROFILER_MODULE_HEAP_STATS | PROFILER_MODULE_JS_CONSTRUCTORS)) { |
1211 if (heap_profiler_nesting_++ == 0) { | 1217 if (heap_profiler_nesting_++ == 0) { |
1212 is_logging_ = true; | 1218 ++logging_nesting_; |
1213 FLAG_log_gc = true; | 1219 FLAG_log_gc = true; |
1214 } | 1220 } |
1215 } | 1221 } |
1216 } | 1222 } |
1217 | 1223 |
1218 | 1224 |
1219 // This function can be called when Log's mutex is acquired, | 1225 // This function can be called when Log's mutex is acquired, |
1220 // either from main or Profiler's thread. | 1226 // either from main or Profiler's thread. |
1221 void Logger::StopLoggingAndProfiling() { | 1227 void Logger::StopLoggingAndProfiling() { |
1222 Log::stop(); | 1228 Log::stop(); |
(...skipping 252 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1475 if (FLAG_sliding_state_window && sliding_state_window_ == NULL) { | 1481 if (FLAG_sliding_state_window && sliding_state_window_ == NULL) { |
1476 sliding_state_window_ = new SlidingStateWindow(); | 1482 sliding_state_window_ = new SlidingStateWindow(); |
1477 } | 1483 } |
1478 | 1484 |
1479 log_events_ = FLAG_compress_log ? | 1485 log_events_ = FLAG_compress_log ? |
1480 kCompressedLogEventsNames : kLongLogEventsNames; | 1486 kCompressedLogEventsNames : kLongLogEventsNames; |
1481 if (FLAG_compress_log) { | 1487 if (FLAG_compress_log) { |
1482 compression_helper_ = new CompressionHelper(kCompressionWindowSize); | 1488 compression_helper_ = new CompressionHelper(kCompressionWindowSize); |
1483 } | 1489 } |
1484 | 1490 |
1485 is_logging_ = start_logging; | 1491 if (start_logging) { |
| 1492 logging_nesting_ = 1; |
| 1493 } |
1486 | 1494 |
1487 if (FLAG_prof) { | 1495 if (FLAG_prof) { |
1488 profiler_ = new Profiler(); | 1496 profiler_ = new Profiler(); |
1489 if (!FLAG_prof_auto) { | 1497 if (!FLAG_prof_auto) { |
1490 profiler_->pause(); | 1498 profiler_->pause(); |
1491 } else { | 1499 } else { |
1492 is_logging_ = true; | 1500 logging_nesting_ = 1; |
1493 } | 1501 } |
1494 if (!FLAG_prof_lazy) { | 1502 if (!FLAG_prof_lazy) { |
1495 profiler_->Engage(); | 1503 profiler_->Engage(); |
1496 } | 1504 } |
1497 } | 1505 } |
1498 | 1506 |
1499 LogMessageBuilder::set_write_failure_handler(StopLoggingAndProfiling); | 1507 LogMessageBuilder::set_write_failure_handler(StopLoggingAndProfiling); |
1500 | 1508 |
1501 return true; | 1509 return true; |
1502 | 1510 |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1544 // Otherwise, if the sliding state window computation has not been | 1552 // Otherwise, if the sliding state window computation has not been |
1545 // started we do it now. | 1553 // started we do it now. |
1546 if (sliding_state_window_ == NULL) { | 1554 if (sliding_state_window_ == NULL) { |
1547 sliding_state_window_ = new SlidingStateWindow(); | 1555 sliding_state_window_ = new SlidingStateWindow(); |
1548 } | 1556 } |
1549 #endif | 1557 #endif |
1550 } | 1558 } |
1551 | 1559 |
1552 | 1560 |
1553 } } // namespace v8::internal | 1561 } } // namespace v8::internal |
OLD | NEW |