OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 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 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
93 // variety of ASLR modes (PAE kernel, NX compat mode, etc). | 93 // variety of ASLR modes (PAE kernel, NX compat mode, etc). |
94 raw_addr &= 0x3ffff000; | 94 raw_addr &= 0x3ffff000; |
95 raw_addr += 0x20000000; | 95 raw_addr += 0x20000000; |
96 #endif | 96 #endif |
97 return reinterpret_cast<void*>(raw_addr); | 97 return reinterpret_cast<void*>(raw_addr); |
98 } | 98 } |
99 return NULL; | 99 return NULL; |
100 } | 100 } |
101 | 101 |
102 | 102 |
103 void OS::SetUp() { | |
104 // Seed the random number generator. We preserve microsecond resolution. | |
105 uint64_t seed = Ticks() ^ (getpid() << 16); | |
106 srandom(static_cast<unsigned int>(seed)); | |
107 limit_mutex = CreateMutex(); | |
108 } | |
109 | |
110 | |
111 void OS::PostSetUp() { | 103 void OS::PostSetUp() { |
112 // Math functions depend on CPU features therefore they are initialized after | 104 POSIXPostSetUp(); |
113 // CPU. | |
114 MathSetup(); | |
115 } | 105 } |
116 | 106 |
117 | 107 |
118 uint64_t OS::CpuFeaturesImpliedByPlatform() { | 108 uint64_t OS::CpuFeaturesImpliedByPlatform() { |
119 return 0; | 109 return 0; |
120 } | 110 } |
121 | 111 |
122 | 112 |
123 int OS::ActivationFrameAlignment() { | 113 int OS::ActivationFrameAlignment() { |
124 // With gcc 4.4 the tree vectorization optimizer can generate code | 114 // With gcc 4.4 the tree vectorization optimizer can generate code |
(...skipping 671 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
796 FULL_INTERVAL | 786 FULL_INTERVAL |
797 }; | 787 }; |
798 | 788 |
799 static const int kSignalSenderStackSize = 64 * KB; | 789 static const int kSignalSenderStackSize = 64 * KB; |
800 | 790 |
801 explicit SignalSender(int interval) | 791 explicit SignalSender(int interval) |
802 : Thread(Thread::Options("SignalSender", kSignalSenderStackSize)), | 792 : Thread(Thread::Options("SignalSender", kSignalSenderStackSize)), |
803 vm_tgid_(getpid()), | 793 vm_tgid_(getpid()), |
804 interval_(interval) {} | 794 interval_(interval) {} |
805 | 795 |
| 796 static void SetUp() { |
| 797 if (!mutex_) { |
| 798 mutex_ = OS::CreateMutex(); |
| 799 } |
| 800 } |
| 801 |
806 static void InstallSignalHandler() { | 802 static void InstallSignalHandler() { |
807 struct sigaction sa; | 803 struct sigaction sa; |
808 sa.sa_sigaction = ProfilerSignalHandler; | 804 sa.sa_sigaction = ProfilerSignalHandler; |
809 sigemptyset(&sa.sa_mask); | 805 sigemptyset(&sa.sa_mask); |
810 sa.sa_flags = SA_RESTART | SA_SIGINFO; | 806 sa.sa_flags = SA_RESTART | SA_SIGINFO; |
811 signal_handler_installed_ = | 807 signal_handler_installed_ = |
812 (sigaction(SIGPROF, &sa, &old_signal_handler_) == 0); | 808 (sigaction(SIGPROF, &sa, &old_signal_handler_) == 0); |
813 } | 809 } |
814 | 810 |
815 static void RestoreSignalHandler() { | 811 static void RestoreSignalHandler() { |
816 if (signal_handler_installed_) { | 812 if (signal_handler_installed_) { |
817 sigaction(SIGPROF, &old_signal_handler_, 0); | 813 sigaction(SIGPROF, &old_signal_handler_, 0); |
818 signal_handler_installed_ = false; | 814 signal_handler_installed_ = false; |
819 } | 815 } |
820 } | 816 } |
821 | 817 |
822 static void AddActiveSampler(Sampler* sampler) { | 818 static void AddActiveSampler(Sampler* sampler) { |
823 ScopedLock lock(mutex_.Pointer()); | 819 ScopedLock lock(mutex_); |
824 SamplerRegistry::AddActiveSampler(sampler); | 820 SamplerRegistry::AddActiveSampler(sampler); |
825 if (instance_ == NULL) { | 821 if (instance_ == NULL) { |
826 // Start a thread that will send SIGPROF signal to VM threads, | 822 // Start a thread that will send SIGPROF signal to VM threads, |
827 // when CPU profiling will be enabled. | 823 // when CPU profiling will be enabled. |
828 instance_ = new SignalSender(sampler->interval()); | 824 instance_ = new SignalSender(sampler->interval()); |
829 instance_->Start(); | 825 instance_->Start(); |
830 } else { | 826 } else { |
831 ASSERT(instance_->interval_ == sampler->interval()); | 827 ASSERT(instance_->interval_ == sampler->interval()); |
832 } | 828 } |
833 } | 829 } |
834 | 830 |
835 static void RemoveActiveSampler(Sampler* sampler) { | 831 static void RemoveActiveSampler(Sampler* sampler) { |
836 ScopedLock lock(mutex_.Pointer()); | 832 ScopedLock lock(mutex_); |
837 SamplerRegistry::RemoveActiveSampler(sampler); | 833 SamplerRegistry::RemoveActiveSampler(sampler); |
838 if (SamplerRegistry::GetState() == SamplerRegistry::HAS_NO_SAMPLERS) { | 834 if (SamplerRegistry::GetState() == SamplerRegistry::HAS_NO_SAMPLERS) { |
839 RuntimeProfiler::StopRuntimeProfilerThreadBeforeShutdown(instance_); | 835 RuntimeProfiler::StopRuntimeProfilerThreadBeforeShutdown(instance_); |
840 delete instance_; | 836 delete instance_; |
841 instance_ = NULL; | 837 instance_ = NULL; |
842 RestoreSignalHandler(); | 838 RestoreSignalHandler(); |
843 } | 839 } |
844 } | 840 } |
845 | 841 |
846 // Implement Thread::Run(). | 842 // Implement Thread::Run(). |
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
920 } | 916 } |
921 #endif | 917 #endif |
922 USE(result); | 918 USE(result); |
923 } | 919 } |
924 | 920 |
925 const int vm_tgid_; | 921 const int vm_tgid_; |
926 const int interval_; | 922 const int interval_; |
927 RuntimeProfilerRateLimiter rate_limiter_; | 923 RuntimeProfilerRateLimiter rate_limiter_; |
928 | 924 |
929 // Protects the process wide state below. | 925 // Protects the process wide state below. |
930 static LazyMutex mutex_; | 926 static Mutex* mutex_; |
931 static SignalSender* instance_; | 927 static SignalSender* instance_; |
932 static bool signal_handler_installed_; | 928 static bool signal_handler_installed_; |
933 static struct sigaction old_signal_handler_; | 929 static struct sigaction old_signal_handler_; |
934 | 930 |
935 private: | 931 private: |
936 DISALLOW_COPY_AND_ASSIGN(SignalSender); | 932 DISALLOW_COPY_AND_ASSIGN(SignalSender); |
937 }; | 933 }; |
938 | 934 |
939 | 935 |
940 LazyMutex SignalSender::mutex_ = LAZY_MUTEX_INITIALIZER; | 936 Mutex* SignalSender::mutex_ = NULL; |
941 SignalSender* SignalSender::instance_ = NULL; | 937 SignalSender* SignalSender::instance_ = NULL; |
942 struct sigaction SignalSender::old_signal_handler_; | 938 struct sigaction SignalSender::old_signal_handler_; |
943 bool SignalSender::signal_handler_installed_ = false; | 939 bool SignalSender::signal_handler_installed_ = false; |
944 | 940 |
945 | 941 |
| 942 void OS::SetUp() { |
| 943 // Seed the random number generator. We preserve microsecond resolution. |
| 944 uint64_t seed = Ticks() ^ (getpid() << 16); |
| 945 srandom(static_cast<unsigned int>(seed)); |
| 946 limit_mutex = CreateMutex(); |
| 947 SignalSender::SetUp(); |
| 948 } |
| 949 |
| 950 |
946 Sampler::Sampler(Isolate* isolate, int interval) | 951 Sampler::Sampler(Isolate* isolate, int interval) |
947 : isolate_(isolate), | 952 : isolate_(isolate), |
948 interval_(interval), | 953 interval_(interval), |
949 profiling_(false), | 954 profiling_(false), |
950 active_(false), | 955 active_(false), |
951 samples_taken_(0) { | 956 samples_taken_(0) { |
952 data_ = new PlatformData; | 957 data_ = new PlatformData; |
953 } | 958 } |
954 | 959 |
955 | 960 |
(...skipping 11 matching lines...) Expand all Loading... |
967 | 972 |
968 | 973 |
969 void Sampler::Stop() { | 974 void Sampler::Stop() { |
970 ASSERT(IsActive()); | 975 ASSERT(IsActive()); |
971 SignalSender::RemoveActiveSampler(this); | 976 SignalSender::RemoveActiveSampler(this); |
972 SetActive(false); | 977 SetActive(false); |
973 } | 978 } |
974 | 979 |
975 | 980 |
976 } } // namespace v8::internal | 981 } } // namespace v8::internal |
OLD | NEW |