| 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 287 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 298 } | 298 } |
| 299 | 299 |
| 300 // Start thread processing the profiler buffer. | 300 // Start thread processing the profiler buffer. |
| 301 running_ = true; | 301 running_ = true; |
| 302 Start(); | 302 Start(); |
| 303 | 303 |
| 304 // Register to get ticks. | 304 // Register to get ticks. |
| 305 LOGGER->ticker_->SetProfiler(this); | 305 LOGGER->ticker_->SetProfiler(this); |
| 306 | 306 |
| 307 LOGGER->ProfilerBeginEvent(); | 307 LOGGER->ProfilerBeginEvent(); |
| 308 LOGGER->LogAliases(); | |
| 309 } | 308 } |
| 310 | 309 |
| 311 | 310 |
| 312 void Profiler::Disengage() { | 311 void Profiler::Disengage() { |
| 313 if (!engaged_) return; | 312 if (!engaged_) return; |
| 314 | 313 |
| 315 // Stop receiving ticks. | 314 // Stop receiving ticks. |
| 316 LOGGER->ticker_->ClearProfiler(); | 315 LOGGER->ticker_->ClearProfiler(); |
| 317 | 316 |
| 318 // Terminate the worker thread by setting running_ to false, | 317 // Terminate the worker thread by setting running_ to false, |
| (...skipping 22 matching lines...) Expand all Loading... |
| 341 | 340 |
| 342 // | 341 // |
| 343 // Logger class implementation. | 342 // Logger class implementation. |
| 344 // | 343 // |
| 345 | 344 |
| 346 Logger::Logger() | 345 Logger::Logger() |
| 347 : ticker_(NULL), | 346 : ticker_(NULL), |
| 348 profiler_(NULL), | 347 profiler_(NULL), |
| 349 sliding_state_window_(NULL), | 348 sliding_state_window_(NULL), |
| 350 log_events_(NULL), | 349 log_events_(NULL), |
| 351 compression_helper_(NULL), | |
| 352 logging_nesting_(0), | 350 logging_nesting_(0), |
| 353 cpu_profiler_nesting_(0), | 351 cpu_profiler_nesting_(0), |
| 354 heap_profiler_nesting_(0), | 352 heap_profiler_nesting_(0), |
| 355 log_(new Log(this)), | 353 log_(new Log(this)), |
| 356 is_initialized_(false), | 354 is_initialized_(false), |
| 357 last_address_(NULL), | 355 last_address_(NULL), |
| 358 prev_sp_(NULL), | 356 prev_sp_(NULL), |
| 359 prev_function_(NULL), | 357 prev_function_(NULL), |
| 360 prev_to_(NULL), | 358 prev_to_(NULL), |
| 361 prev_code_(NULL) { | 359 prev_code_(NULL) { |
| 362 } | 360 } |
| 363 | 361 |
| 364 Logger::~Logger() { | 362 Logger::~Logger() { |
| 365 delete log_; | 363 delete log_; |
| 366 } | 364 } |
| 367 | 365 |
| 368 #define DECLARE_LONG_EVENT(ignore1, long_name, ignore2) long_name, | 366 #define DECLARE_EVENT(ignore1, name) name, |
| 369 static const char* const kLongLogEventsNames[Logger::NUMBER_OF_LOG_EVENTS] = { | 367 static const char* const kLogEventsNames[Logger::NUMBER_OF_LOG_EVENTS] = { |
| 370 LOG_EVENTS_AND_TAGS_LIST(DECLARE_LONG_EVENT) | 368 LOG_EVENTS_AND_TAGS_LIST(DECLARE_EVENT) |
| 371 }; | 369 }; |
| 372 #undef DECLARE_LONG_EVENT | 370 #undef DECLARE_EVENT |
| 373 | |
| 374 #define DECLARE_SHORT_EVENT(ignore1, ignore2, short_name) short_name, | |
| 375 static const char* const | |
| 376 kCompressedLogEventsNames[Logger::NUMBER_OF_LOG_EVENTS] = { | |
| 377 LOG_EVENTS_AND_TAGS_LIST(DECLARE_SHORT_EVENT) | |
| 378 }; | |
| 379 #undef DECLARE_SHORT_EVENT | |
| 380 | 371 |
| 381 | 372 |
| 382 void Logger::ProfilerBeginEvent() { | 373 void Logger::ProfilerBeginEvent() { |
| 383 if (!log_->IsEnabled()) return; | 374 if (!log_->IsEnabled()) return; |
| 384 LogMessageBuilder msg(this); | 375 LogMessageBuilder msg(this); |
| 385 msg.Append("profiler,\"begin\",%d\n", kSamplingIntervalMs); | 376 msg.Append("profiler,\"begin\",%d\n", kSamplingIntervalMs); |
| 386 if (FLAG_compress_log) { | |
| 387 msg.Append("profiler,\"compression\",%d\n", kCompressionWindowSize); | |
| 388 } | |
| 389 msg.WriteToLogFile(); | |
| 390 } | |
| 391 | |
| 392 | |
| 393 void Logger::LogAliases() { | |
| 394 if (!log_->IsEnabled() || !FLAG_compress_log) return; | |
| 395 LogMessageBuilder msg(this); | |
| 396 for (int i = 0; i < NUMBER_OF_LOG_EVENTS; ++i) { | |
| 397 msg.Append("alias,%s,%s\n", | |
| 398 kCompressedLogEventsNames[i], kLongLogEventsNames[i]); | |
| 399 } | |
| 400 msg.WriteToLogFile(); | 377 msg.WriteToLogFile(); |
| 401 } | 378 } |
| 402 | 379 |
| 403 #endif // ENABLE_LOGGING_AND_PROFILING | 380 #endif // ENABLE_LOGGING_AND_PROFILING |
| 404 | 381 |
| 405 | 382 |
| 406 void Logger::StringEvent(const char* name, const char* value) { | 383 void Logger::StringEvent(const char* name, const char* value) { |
| 407 #ifdef ENABLE_LOGGING_AND_PROFILING | 384 #ifdef ENABLE_LOGGING_AND_PROFILING |
| 408 if (FLAG_log) UncheckedStringEvent(name, value); | 385 if (FLAG_log) UncheckedStringEvent(name, value); |
| 409 #endif | 386 #endif |
| (...skipping 296 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 706 void Logger::NewEventStatic(const char* name, void* object, size_t size) { | 683 void Logger::NewEventStatic(const char* name, void* object, size_t size) { |
| 707 LOGGER->NewEvent(name, object, size); | 684 LOGGER->NewEvent(name, object, size); |
| 708 } | 685 } |
| 709 | 686 |
| 710 | 687 |
| 711 void Logger::DeleteEventStatic(const char* name, void* object) { | 688 void Logger::DeleteEventStatic(const char* name, void* object) { |
| 712 LOGGER->DeleteEvent(name, object); | 689 LOGGER->DeleteEvent(name, object); |
| 713 } | 690 } |
| 714 | 691 |
| 715 #ifdef ENABLE_LOGGING_AND_PROFILING | 692 #ifdef ENABLE_LOGGING_AND_PROFILING |
| 716 | |
| 717 // A class that contains all common code dealing with record compression. | |
| 718 class CompressionHelper { | |
| 719 public: | |
| 720 explicit CompressionHelper(int window_size) | |
| 721 : compressor_(window_size), repeat_count_(0) { } | |
| 722 | |
| 723 // Handles storing message in compressor, retrieving the previous one and | |
| 724 // prefixing it with repeat count, if needed. | |
| 725 // Returns true if message needs to be written to log. | |
| 726 bool HandleMessage(LogMessageBuilder* msg) { | |
| 727 if (!msg->StoreInCompressor(&compressor_)) { | |
| 728 // Current message repeats the previous one, don't write it. | |
| 729 ++repeat_count_; | |
| 730 return false; | |
| 731 } | |
| 732 if (repeat_count_ == 0) { | |
| 733 return msg->RetrieveCompressedPrevious(&compressor_); | |
| 734 } | |
| 735 OS::SNPrintF(prefix_, "%s,%d,", | |
| 736 LOGGER->log_events_[Logger::REPEAT_META_EVENT], | |
| 737 repeat_count_ + 1); | |
| 738 repeat_count_ = 0; | |
| 739 return msg->RetrieveCompressedPrevious(&compressor_, prefix_.start()); | |
| 740 } | |
| 741 | |
| 742 private: | |
| 743 LogRecordCompressor compressor_; | |
| 744 int repeat_count_; | |
| 745 EmbeddedVector<char, 20> prefix_; | |
| 746 }; | |
| 747 | |
| 748 #endif // ENABLE_LOGGING_AND_PROFILING | |
| 749 | |
| 750 | |
| 751 #ifdef ENABLE_LOGGING_AND_PROFILING | |
| 752 void Logger::CallbackEventInternal(const char* prefix, const char* name, | 693 void Logger::CallbackEventInternal(const char* prefix, const char* name, |
| 753 Address entry_point) { | 694 Address entry_point) { |
| 754 if (!log_->IsEnabled() || !FLAG_log_code) return; | 695 if (!log_->IsEnabled() || !FLAG_log_code) return; |
| 755 LogMessageBuilder msg(this); | 696 LogMessageBuilder msg(this); |
| 756 msg.Append("%s,%s,", | 697 msg.Append("%s,%s,", |
| 757 log_events_[CODE_CREATION_EVENT], log_events_[CALLBACK_TAG]); | 698 kLogEventsNames[CODE_CREATION_EVENT], |
| 699 kLogEventsNames[CALLBACK_TAG]); |
| 758 msg.AppendAddress(entry_point); | 700 msg.AppendAddress(entry_point); |
| 759 msg.Append(",1,\"%s%s\"", prefix, name); | 701 msg.Append(",1,\"%s%s\"", prefix, name); |
| 760 if (FLAG_compress_log) { | |
| 761 ASSERT(compression_helper_ != NULL); | |
| 762 if (!compression_helper_->HandleMessage(&msg)) return; | |
| 763 } | |
| 764 msg.Append('\n'); | 702 msg.Append('\n'); |
| 765 msg.WriteToLogFile(); | 703 msg.WriteToLogFile(); |
| 766 } | 704 } |
| 767 #endif | 705 #endif |
| 768 | 706 |
| 769 | 707 |
| 770 void Logger::CallbackEvent(String* name, Address entry_point) { | 708 void Logger::CallbackEvent(String* name, Address entry_point) { |
| 771 #ifdef ENABLE_LOGGING_AND_PROFILING | 709 #ifdef ENABLE_LOGGING_AND_PROFILING |
| 772 if (!log_->IsEnabled() || !FLAG_log_code) return; | 710 if (!log_->IsEnabled() || !FLAG_log_code) return; |
| 773 SmartPointer<char> str = | 711 SmartPointer<char> str = |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 805 } | 743 } |
| 806 } | 744 } |
| 807 | 745 |
| 808 | 746 |
| 809 void Logger::CodeCreateEvent(LogEventsAndTags tag, | 747 void Logger::CodeCreateEvent(LogEventsAndTags tag, |
| 810 Code* code, | 748 Code* code, |
| 811 const char* comment) { | 749 const char* comment) { |
| 812 #ifdef ENABLE_LOGGING_AND_PROFILING | 750 #ifdef ENABLE_LOGGING_AND_PROFILING |
| 813 if (!log_->IsEnabled() || !FLAG_log_code) return; | 751 if (!log_->IsEnabled() || !FLAG_log_code) return; |
| 814 LogMessageBuilder msg(this); | 752 LogMessageBuilder msg(this); |
| 815 msg.Append("%s,%s,", log_events_[CODE_CREATION_EVENT], log_events_[tag]); | 753 msg.Append("%s,%s,", |
| 754 kLogEventsNames[CODE_CREATION_EVENT], |
| 755 kLogEventsNames[tag]); |
| 816 msg.AppendAddress(code->address()); | 756 msg.AppendAddress(code->address()); |
| 817 msg.Append(",%d,\"%s", code->ExecutableSize(), ComputeMarker(code)); | 757 msg.Append(",%d,\"%s", code->ExecutableSize(), ComputeMarker(code)); |
| 818 for (const char* p = comment; *p != '\0'; p++) { | 758 for (const char* p = comment; *p != '\0'; p++) { |
| 819 if (*p == '"') { | 759 if (*p == '"') { |
| 820 msg.Append('\\'); | 760 msg.Append('\\'); |
| 821 } | 761 } |
| 822 msg.Append(*p); | 762 msg.Append(*p); |
| 823 } | 763 } |
| 824 msg.Append('"'); | 764 msg.Append('"'); |
| 825 LowLevelCodeCreateEvent(code, &msg); | 765 LowLevelCodeCreateEvent(code, &msg); |
| 826 if (FLAG_compress_log) { | |
| 827 ASSERT(compression_helper_ != NULL); | |
| 828 if (!compression_helper_->HandleMessage(&msg)) return; | |
| 829 } | |
| 830 msg.Append('\n'); | 766 msg.Append('\n'); |
| 831 msg.WriteToLogFile(); | 767 msg.WriteToLogFile(); |
| 832 #endif | 768 #endif |
| 833 } | 769 } |
| 834 | 770 |
| 835 | 771 |
| 836 void Logger::CodeCreateEvent(LogEventsAndTags tag, Code* code, String* name) { | 772 void Logger::CodeCreateEvent(LogEventsAndTags tag, Code* code, String* name) { |
| 837 #ifdef ENABLE_LOGGING_AND_PROFILING | 773 #ifdef ENABLE_LOGGING_AND_PROFILING |
| 838 if (!log_->IsEnabled() || !FLAG_log_code) return; | 774 if (!log_->IsEnabled() || !FLAG_log_code) return; |
| 839 LogMessageBuilder msg(this); | 775 LogMessageBuilder msg(this); |
| 840 SmartPointer<char> str = | 776 SmartPointer<char> str = |
| 841 name->ToCString(DISALLOW_NULLS, ROBUST_STRING_TRAVERSAL); | 777 name->ToCString(DISALLOW_NULLS, ROBUST_STRING_TRAVERSAL); |
| 842 msg.Append("%s,%s,", log_events_[CODE_CREATION_EVENT], log_events_[tag]); | 778 msg.Append("%s,%s,", |
| 779 kLogEventsNames[CODE_CREATION_EVENT], |
| 780 kLogEventsNames[tag]); |
| 843 msg.AppendAddress(code->address()); | 781 msg.AppendAddress(code->address()); |
| 844 msg.Append(",%d,\"%s%s\"", code->ExecutableSize(), ComputeMarker(code), *str); | 782 msg.Append(",%d,\"%s%s\"", code->ExecutableSize(), ComputeMarker(code), *str); |
| 845 LowLevelCodeCreateEvent(code, &msg); | 783 LowLevelCodeCreateEvent(code, &msg); |
| 846 if (FLAG_compress_log) { | |
| 847 ASSERT(compression_helper_ != NULL); | |
| 848 if (!compression_helper_->HandleMessage(&msg)) return; | |
| 849 } | |
| 850 msg.Append('\n'); | 784 msg.Append('\n'); |
| 851 msg.WriteToLogFile(); | 785 msg.WriteToLogFile(); |
| 852 #endif | 786 #endif |
| 853 } | 787 } |
| 854 | 788 |
| 855 | 789 |
| 856 void Logger::CodeCreateEvent(LogEventsAndTags tag, | 790 void Logger::CodeCreateEvent(LogEventsAndTags tag, |
| 857 Code* code, String* name, | 791 Code* code, String* name, |
| 858 String* source, int line) { | 792 String* source, int line) { |
| 859 #ifdef ENABLE_LOGGING_AND_PROFILING | 793 #ifdef ENABLE_LOGGING_AND_PROFILING |
| 860 if (!log_->IsEnabled() || !FLAG_log_code) return; | 794 if (!log_->IsEnabled() || !FLAG_log_code) return; |
| 861 LogMessageBuilder msg(this); | 795 LogMessageBuilder msg(this); |
| 862 SmartPointer<char> str = | 796 SmartPointer<char> str = |
| 863 name->ToCString(DISALLOW_NULLS, ROBUST_STRING_TRAVERSAL); | 797 name->ToCString(DISALLOW_NULLS, ROBUST_STRING_TRAVERSAL); |
| 864 SmartPointer<char> sourcestr = | 798 SmartPointer<char> sourcestr = |
| 865 source->ToCString(DISALLOW_NULLS, ROBUST_STRING_TRAVERSAL); | 799 source->ToCString(DISALLOW_NULLS, ROBUST_STRING_TRAVERSAL); |
| 866 msg.Append("%s,%s,", log_events_[CODE_CREATION_EVENT], log_events_[tag]); | 800 msg.Append("%s,%s,", |
| 801 kLogEventsNames[CODE_CREATION_EVENT], |
| 802 kLogEventsNames[tag]); |
| 867 msg.AppendAddress(code->address()); | 803 msg.AppendAddress(code->address()); |
| 868 msg.Append(",%d,\"%s%s %s:%d\"", | 804 msg.Append(",%d,\"%s%s %s:%d\"", |
| 869 code->ExecutableSize(), | 805 code->ExecutableSize(), |
| 870 ComputeMarker(code), | 806 ComputeMarker(code), |
| 871 *str, | 807 *str, |
| 872 *sourcestr, | 808 *sourcestr, |
| 873 line); | 809 line); |
| 874 LowLevelCodeCreateEvent(code, &msg); | 810 LowLevelCodeCreateEvent(code, &msg); |
| 875 if (FLAG_compress_log) { | |
| 876 ASSERT(compression_helper_ != NULL); | |
| 877 if (!compression_helper_->HandleMessage(&msg)) return; | |
| 878 } | |
| 879 msg.Append('\n'); | 811 msg.Append('\n'); |
| 880 msg.WriteToLogFile(); | 812 msg.WriteToLogFile(); |
| 881 #endif | 813 #endif |
| 882 } | 814 } |
| 883 | 815 |
| 884 | 816 |
| 885 void Logger::CodeCreateEvent(LogEventsAndTags tag, Code* code, int args_count) { | 817 void Logger::CodeCreateEvent(LogEventsAndTags tag, Code* code, int args_count) { |
| 886 #ifdef ENABLE_LOGGING_AND_PROFILING | 818 #ifdef ENABLE_LOGGING_AND_PROFILING |
| 887 if (!log_->IsEnabled() || !FLAG_log_code) return; | 819 if (!log_->IsEnabled() || !FLAG_log_code) return; |
| 888 LogMessageBuilder msg(this); | 820 LogMessageBuilder msg(this); |
| 889 msg.Append("%s,%s,", log_events_[CODE_CREATION_EVENT], log_events_[tag]); | 821 msg.Append("%s,%s,", |
| 822 kLogEventsNames[CODE_CREATION_EVENT], |
| 823 kLogEventsNames[tag]); |
| 890 msg.AppendAddress(code->address()); | 824 msg.AppendAddress(code->address()); |
| 891 msg.Append(",%d,\"args_count: %d\"", code->ExecutableSize(), args_count); | 825 msg.Append(",%d,\"args_count: %d\"", code->ExecutableSize(), args_count); |
| 892 LowLevelCodeCreateEvent(code, &msg); | 826 LowLevelCodeCreateEvent(code, &msg); |
| 893 if (FLAG_compress_log) { | |
| 894 ASSERT(compression_helper_ != NULL); | |
| 895 if (!compression_helper_->HandleMessage(&msg)) return; | |
| 896 } | |
| 897 msg.Append('\n'); | 827 msg.Append('\n'); |
| 898 msg.WriteToLogFile(); | 828 msg.WriteToLogFile(); |
| 899 #endif | 829 #endif |
| 900 } | 830 } |
| 901 | 831 |
| 902 | 832 |
| 903 void Logger::CodeMovingGCEvent() { | 833 void Logger::CodeMovingGCEvent() { |
| 904 #ifdef ENABLE_LOGGING_AND_PROFILING | 834 #ifdef ENABLE_LOGGING_AND_PROFILING |
| 905 if (!log_->IsEnabled() || !FLAG_log_code || !FLAG_ll_prof) return; | 835 if (!log_->IsEnabled() || !FLAG_log_code || !FLAG_ll_prof) return; |
| 906 LogMessageBuilder msg(this); | 836 LogMessageBuilder msg(this); |
| 907 msg.Append("%s\n", log_events_[CODE_MOVING_GC]); | 837 msg.Append("%s\n", kLogEventsNames[CODE_MOVING_GC]); |
| 908 msg.WriteToLogFile(); | 838 msg.WriteToLogFile(); |
| 909 OS::SignalCodeMovingGC(); | 839 OS::SignalCodeMovingGC(); |
| 910 #endif | 840 #endif |
| 911 } | 841 } |
| 912 | 842 |
| 913 | 843 |
| 914 void Logger::RegExpCodeCreateEvent(Code* code, String* source) { | 844 void Logger::RegExpCodeCreateEvent(Code* code, String* source) { |
| 915 #ifdef ENABLE_LOGGING_AND_PROFILING | 845 #ifdef ENABLE_LOGGING_AND_PROFILING |
| 916 if (!log_->IsEnabled() || !FLAG_log_code) return; | 846 if (!log_->IsEnabled() || !FLAG_log_code) return; |
| 917 LogMessageBuilder msg(this); | 847 LogMessageBuilder msg(this); |
| 918 msg.Append("%s,%s,", | 848 msg.Append("%s,%s,", |
| 919 log_events_[CODE_CREATION_EVENT], log_events_[REG_EXP_TAG]); | 849 kLogEventsNames[CODE_CREATION_EVENT], |
| 850 kLogEventsNames[REG_EXP_TAG]); |
| 920 msg.AppendAddress(code->address()); | 851 msg.AppendAddress(code->address()); |
| 921 msg.Append(",%d,\"", code->ExecutableSize()); | 852 msg.Append(",%d,\"", code->ExecutableSize()); |
| 922 msg.AppendDetailed(source, false); | 853 msg.AppendDetailed(source, false); |
| 923 msg.Append('\"'); | 854 msg.Append('\"'); |
| 924 LowLevelCodeCreateEvent(code, &msg); | 855 LowLevelCodeCreateEvent(code, &msg); |
| 925 if (FLAG_compress_log) { | |
| 926 ASSERT(compression_helper_ != NULL); | |
| 927 if (!compression_helper_->HandleMessage(&msg)) return; | |
| 928 } | |
| 929 msg.Append('\n'); | 856 msg.Append('\n'); |
| 930 msg.WriteToLogFile(); | 857 msg.WriteToLogFile(); |
| 931 #endif | 858 #endif |
| 932 } | 859 } |
| 933 | 860 |
| 934 | 861 |
| 935 void Logger::CodeMoveEvent(Address from, Address to) { | 862 void Logger::CodeMoveEvent(Address from, Address to) { |
| 936 #ifdef ENABLE_LOGGING_AND_PROFILING | 863 #ifdef ENABLE_LOGGING_AND_PROFILING |
| 937 MoveEventInternal(CODE_MOVE_EVENT, from, to); | 864 MoveEventInternal(CODE_MOVE_EVENT, from, to); |
| 938 #endif | 865 #endif |
| 939 } | 866 } |
| 940 | 867 |
| 941 | 868 |
| 942 void Logger::CodeDeleteEvent(Address from) { | 869 void Logger::CodeDeleteEvent(Address from) { |
| 943 #ifdef ENABLE_LOGGING_AND_PROFILING | 870 #ifdef ENABLE_LOGGING_AND_PROFILING |
| 944 DeleteEventInternal(CODE_DELETE_EVENT, from); | 871 DeleteEventInternal(CODE_DELETE_EVENT, from); |
| 945 #endif | 872 #endif |
| 946 } | 873 } |
| 947 | 874 |
| 948 | 875 |
| 949 void Logger::SnapshotPositionEvent(Address addr, int pos) { | 876 void Logger::SnapshotPositionEvent(Address addr, int pos) { |
| 950 #ifdef ENABLE_LOGGING_AND_PROFILING | 877 #ifdef ENABLE_LOGGING_AND_PROFILING |
| 951 if (!log_->IsEnabled() || !FLAG_log_snapshot_positions) return; | 878 if (!log_->IsEnabled() || !FLAG_log_snapshot_positions) return; |
| 952 LogMessageBuilder msg(this); | 879 LogMessageBuilder msg(this); |
| 953 msg.Append("%s,", log_events_[SNAPSHOT_POSITION_EVENT]); | 880 msg.Append("%s,", kLogEventsNames[SNAPSHOT_POSITION_EVENT]); |
| 954 msg.AppendAddress(addr); | 881 msg.AppendAddress(addr); |
| 955 msg.Append(",%d", pos); | 882 msg.Append(",%d", pos); |
| 956 if (FLAG_compress_log) { | |
| 957 ASSERT(compression_helper_ != NULL); | |
| 958 if (!compression_helper_->HandleMessage(&msg)) return; | |
| 959 } | |
| 960 msg.Append('\n'); | 883 msg.Append('\n'); |
| 961 msg.WriteToLogFile(); | 884 msg.WriteToLogFile(); |
| 962 #endif | 885 #endif |
| 963 } | 886 } |
| 964 | 887 |
| 965 | 888 |
| 966 void Logger::FunctionCreateEvent(JSFunction* function) { | 889 void Logger::FunctionCreateEvent(JSFunction* function) { |
| 967 #ifdef ENABLE_LOGGING_AND_PROFILING | 890 #ifdef ENABLE_LOGGING_AND_PROFILING |
| 968 // This function can be called from GC iterators (during Scavenge, | 891 // This function can be called from GC iterators (during Scavenge, |
| 969 // MC, and MS), so marking bits can be set on objects. That's | 892 // MC, and MS), so marking bits can be set on objects. That's |
| 970 // why unchecked accessors are used here. | 893 // why unchecked accessors are used here. |
| 971 if (!log_->IsEnabled() || !FLAG_log_code) return; | 894 if (!log_->IsEnabled() || !FLAG_log_code) return; |
| 972 LogMessageBuilder msg(this); | 895 LogMessageBuilder msg(this); |
| 973 msg.Append("%s,", log_events_[FUNCTION_CREATION_EVENT]); | 896 msg.Append("%s,", kLogEventsNames[FUNCTION_CREATION_EVENT]); |
| 974 msg.AppendAddress(function->address()); | 897 msg.AppendAddress(function->address()); |
| 975 msg.Append(','); | 898 msg.Append(','); |
| 976 msg.AppendAddress(function->unchecked_code()->address(), prev_code_); | 899 msg.AppendAddress(function->unchecked_code()->address()); |
| 977 prev_code_ = function->unchecked_code()->address(); | |
| 978 if (FLAG_compress_log) { | |
| 979 ASSERT(compression_helper_ != NULL); | |
| 980 if (!compression_helper_->HandleMessage(&msg)) return; | |
| 981 } | |
| 982 msg.Append('\n'); | 900 msg.Append('\n'); |
| 983 msg.WriteToLogFile(); | 901 msg.WriteToLogFile(); |
| 984 #endif | 902 #endif |
| 985 } | 903 } |
| 986 | 904 |
| 987 | 905 |
| 988 void Logger::FunctionCreateEventFromMove(Heap* heap, JSFunction* function) { | 906 void Logger::FunctionCreateEventFromMove(Heap* heap, JSFunction* function) { |
| 989 #ifdef ENABLE_LOGGING_AND_PROFILING | 907 #ifdef ENABLE_LOGGING_AND_PROFILING |
| 990 if (function->unchecked_code() != | 908 if (function->unchecked_code() != |
| 991 heap->isolate()->builtins()->builtin(Builtins::LazyCompile)) { | 909 heap->isolate()->builtins()->builtin(Builtins::LazyCompile)) { |
| (...skipping 16 matching lines...) Expand all Loading... |
| 1008 #endif | 926 #endif |
| 1009 } | 927 } |
| 1010 | 928 |
| 1011 | 929 |
| 1012 #ifdef ENABLE_LOGGING_AND_PROFILING | 930 #ifdef ENABLE_LOGGING_AND_PROFILING |
| 1013 void Logger::MoveEventInternal(LogEventsAndTags event, | 931 void Logger::MoveEventInternal(LogEventsAndTags event, |
| 1014 Address from, | 932 Address from, |
| 1015 Address to) { | 933 Address to) { |
| 1016 if (!log_->IsEnabled() || !FLAG_log_code) return; | 934 if (!log_->IsEnabled() || !FLAG_log_code) return; |
| 1017 LogMessageBuilder msg(this); | 935 LogMessageBuilder msg(this); |
| 1018 msg.Append("%s,", log_events_[event]); | 936 msg.Append("%s,", kLogEventsNames[event]); |
| 1019 msg.AppendAddress(from); | 937 msg.AppendAddress(from); |
| 1020 msg.Append(','); | 938 msg.Append(','); |
| 1021 msg.AppendAddress(to, prev_to_); | 939 msg.AppendAddress(to); |
| 1022 prev_to_ = to; | |
| 1023 if (FLAG_compress_log) { | |
| 1024 ASSERT(compression_helper_ != NULL); | |
| 1025 if (!compression_helper_->HandleMessage(&msg)) return; | |
| 1026 } | |
| 1027 msg.Append('\n'); | 940 msg.Append('\n'); |
| 1028 msg.WriteToLogFile(); | 941 msg.WriteToLogFile(); |
| 1029 } | 942 } |
| 1030 #endif | 943 #endif |
| 1031 | 944 |
| 1032 | 945 |
| 1033 #ifdef ENABLE_LOGGING_AND_PROFILING | 946 #ifdef ENABLE_LOGGING_AND_PROFILING |
| 1034 void Logger::DeleteEventInternal(LogEventsAndTags event, Address from) { | 947 void Logger::DeleteEventInternal(LogEventsAndTags event, Address from) { |
| 1035 if (!log_->IsEnabled() || !FLAG_log_code) return; | 948 if (!log_->IsEnabled() || !FLAG_log_code) return; |
| 1036 LogMessageBuilder msg(this); | 949 LogMessageBuilder msg(this); |
| 1037 msg.Append("%s,", log_events_[event]); | 950 msg.Append("%s,", kLogEventsNames[event]); |
| 1038 msg.AppendAddress(from); | 951 msg.AppendAddress(from); |
| 1039 if (FLAG_compress_log) { | |
| 1040 ASSERT(compression_helper_ != NULL); | |
| 1041 if (!compression_helper_->HandleMessage(&msg)) return; | |
| 1042 } | |
| 1043 msg.Append('\n'); | 952 msg.Append('\n'); |
| 1044 msg.WriteToLogFile(); | 953 msg.WriteToLogFile(); |
| 1045 } | 954 } |
| 1046 #endif | 955 #endif |
| 1047 | 956 |
| 1048 | 957 |
| 1049 void Logger::ResourceEvent(const char* name, const char* tag) { | 958 void Logger::ResourceEvent(const char* name, const char* tag) { |
| 1050 #ifdef ENABLE_LOGGING_AND_PROFILING | 959 #ifdef ENABLE_LOGGING_AND_PROFILING |
| 1051 if (!log_->IsEnabled() || !FLAG_log) return; | 960 if (!log_->IsEnabled() || !FLAG_log) return; |
| 1052 LogMessageBuilder msg(this); | 961 LogMessageBuilder msg(this); |
| (...skipping 168 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1221 DeleteArray(parameter_string); | 1130 DeleteArray(parameter_string); |
| 1222 msg.WriteToLogFile(); | 1131 msg.WriteToLogFile(); |
| 1223 #endif | 1132 #endif |
| 1224 } | 1133 } |
| 1225 | 1134 |
| 1226 | 1135 |
| 1227 #ifdef ENABLE_LOGGING_AND_PROFILING | 1136 #ifdef ENABLE_LOGGING_AND_PROFILING |
| 1228 void Logger::TickEvent(TickSample* sample, bool overflow) { | 1137 void Logger::TickEvent(TickSample* sample, bool overflow) { |
| 1229 if (!log_->IsEnabled() || !FLAG_prof) return; | 1138 if (!log_->IsEnabled() || !FLAG_prof) return; |
| 1230 LogMessageBuilder msg(this); | 1139 LogMessageBuilder msg(this); |
| 1231 msg.Append("%s,", log_events_[TICK_EVENT]); | 1140 msg.Append("%s,", kLogEventsNames[TICK_EVENT]); |
| 1232 Address prev_addr = sample->pc; | 1141 msg.AppendAddress(sample->pc); |
| 1233 msg.AppendAddress(prev_addr); | |
| 1234 msg.Append(','); | 1142 msg.Append(','); |
| 1235 msg.AppendAddress(sample->sp, prev_sp_); | 1143 msg.AppendAddress(sample->sp); |
| 1236 prev_sp_ = sample->sp; | |
| 1237 msg.Append(','); | 1144 msg.Append(','); |
| 1238 msg.AppendAddress(sample->function, prev_function_); | 1145 msg.AppendAddress(sample->function); |
| 1239 prev_function_ = sample->function; | |
| 1240 msg.Append(",%d", static_cast<int>(sample->state)); | 1146 msg.Append(",%d", static_cast<int>(sample->state)); |
| 1241 if (overflow) { | 1147 if (overflow) { |
| 1242 msg.Append(",overflow"); | 1148 msg.Append(",overflow"); |
| 1243 } | 1149 } |
| 1244 for (int i = 0; i < sample->frames_count; ++i) { | 1150 for (int i = 0; i < sample->frames_count; ++i) { |
| 1245 msg.Append(','); | 1151 msg.Append(','); |
| 1246 msg.AppendAddress(sample->stack[i], prev_addr); | 1152 msg.AppendAddress(sample->stack[i]); |
| 1247 prev_addr = sample->stack[i]; | |
| 1248 } | |
| 1249 if (FLAG_compress_log) { | |
| 1250 ASSERT(compression_helper_ != NULL); | |
| 1251 if (!compression_helper_->HandleMessage(&msg)) return; | |
| 1252 } | 1153 } |
| 1253 msg.Append('\n'); | 1154 msg.Append('\n'); |
| 1254 msg.WriteToLogFile(); | 1155 msg.WriteToLogFile(); |
| 1255 } | 1156 } |
| 1256 | 1157 |
| 1257 | 1158 |
| 1258 int Logger::GetActiveProfilerModules() { | 1159 int Logger::GetActiveProfilerModules() { |
| 1259 int result = PROFILER_MODULE_NONE; | 1160 int result = PROFILER_MODULE_NONE; |
| 1260 if (profiler_ != NULL && !profiler_->paused()) { | 1161 if (profiler_ != NULL && !profiler_->paused()) { |
| 1261 result |= PROFILER_MODULE_CPU; | 1162 result |= PROFILER_MODULE_CPU; |
| (...skipping 350 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1612 log_->Initialize(); | 1513 log_->Initialize(); |
| 1613 | 1514 |
| 1614 if (FLAG_ll_prof) LogCodeInfo(); | 1515 if (FLAG_ll_prof) LogCodeInfo(); |
| 1615 | 1516 |
| 1616 ticker_ = new Ticker(Isolate::Current(), kSamplingIntervalMs); | 1517 ticker_ = new Ticker(Isolate::Current(), kSamplingIntervalMs); |
| 1617 | 1518 |
| 1618 if (FLAG_sliding_state_window && sliding_state_window_ == NULL) { | 1519 if (FLAG_sliding_state_window && sliding_state_window_ == NULL) { |
| 1619 sliding_state_window_ = new SlidingStateWindow(); | 1520 sliding_state_window_ = new SlidingStateWindow(); |
| 1620 } | 1521 } |
| 1621 | 1522 |
| 1622 log_events_ = FLAG_compress_log ? | |
| 1623 kCompressedLogEventsNames : kLongLogEventsNames; | |
| 1624 if (FLAG_compress_log) { | |
| 1625 compression_helper_ = new CompressionHelper(kCompressionWindowSize); | |
| 1626 } | |
| 1627 | |
| 1628 bool start_logging = FLAG_log || FLAG_log_runtime || FLAG_log_api | 1523 bool start_logging = FLAG_log || FLAG_log_runtime || FLAG_log_api |
| 1629 || FLAG_log_code || FLAG_log_gc || FLAG_log_handles || FLAG_log_suspect | 1524 || FLAG_log_code || FLAG_log_gc || FLAG_log_handles || FLAG_log_suspect |
| 1630 || FLAG_log_regexp || FLAG_log_state_changes; | 1525 || FLAG_log_regexp || FLAG_log_state_changes; |
| 1631 | 1526 |
| 1632 if (start_logging) { | 1527 if (start_logging) { |
| 1633 logging_nesting_ = 1; | 1528 logging_nesting_ = 1; |
| 1634 } | 1529 } |
| 1635 | 1530 |
| 1636 if (FLAG_prof) { | 1531 if (FLAG_prof) { |
| 1637 profiler_ = new Profiler(Isolate::Current()); | 1532 profiler_ = new Profiler(Isolate::Current()); |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1674 if (!is_initialized_) return; | 1569 if (!is_initialized_) return; |
| 1675 is_initialized_ = false; | 1570 is_initialized_ = false; |
| 1676 | 1571 |
| 1677 // Stop the profiler before closing the file. | 1572 // Stop the profiler before closing the file. |
| 1678 if (profiler_ != NULL) { | 1573 if (profiler_ != NULL) { |
| 1679 profiler_->Disengage(); | 1574 profiler_->Disengage(); |
| 1680 delete profiler_; | 1575 delete profiler_; |
| 1681 profiler_ = NULL; | 1576 profiler_ = NULL; |
| 1682 } | 1577 } |
| 1683 | 1578 |
| 1684 delete compression_helper_; | |
| 1685 compression_helper_ = NULL; | |
| 1686 | |
| 1687 delete sliding_state_window_; | 1579 delete sliding_state_window_; |
| 1688 sliding_state_window_ = NULL; | 1580 sliding_state_window_ = NULL; |
| 1689 | 1581 |
| 1690 delete ticker_; | 1582 delete ticker_; |
| 1691 ticker_ = NULL; | 1583 ticker_ = NULL; |
| 1692 | 1584 |
| 1693 log_->Close(); | 1585 log_->Close(); |
| 1694 #endif | 1586 #endif |
| 1695 } | 1587 } |
| 1696 | 1588 |
| (...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1759 void SamplerRegistry::RemoveActiveSampler(Sampler* sampler) { | 1651 void SamplerRegistry::RemoveActiveSampler(Sampler* sampler) { |
| 1760 ASSERT(sampler->IsActive()); | 1652 ASSERT(sampler->IsActive()); |
| 1761 ScopedLock lock(mutex_); | 1653 ScopedLock lock(mutex_); |
| 1762 ASSERT(active_samplers_ != NULL); | 1654 ASSERT(active_samplers_ != NULL); |
| 1763 bool removed = active_samplers_->RemoveElement(sampler); | 1655 bool removed = active_samplers_->RemoveElement(sampler); |
| 1764 ASSERT(removed); | 1656 ASSERT(removed); |
| 1765 USE(removed); | 1657 USE(removed); |
| 1766 } | 1658 } |
| 1767 | 1659 |
| 1768 } } // namespace v8::internal | 1660 } } // namespace v8::internal |
| OLD | NEW |