| 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 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 87 return -0.0; | 87 return -0.0; |
| 88 } else { | 88 } else { |
| 89 return ceil(x); | 89 return ceil(x); |
| 90 } | 90 } |
| 91 } | 91 } |
| 92 | 92 |
| 93 | 93 |
| 94 static Mutex* limit_mutex = NULL; | 94 static Mutex* limit_mutex = NULL; |
| 95 | 95 |
| 96 | 96 |
| 97 void OS::SetUp() { | 97 void OS::PostSetUp() { |
| 98 // Seed the random number generator. We preserve microsecond resolution. | 98 POSIXPostSetUp(); |
| 99 uint64_t seed = Ticks() ^ (getpid() << 16); | |
| 100 srandom(static_cast<unsigned int>(seed)); | |
| 101 limit_mutex = CreateMutex(); | |
| 102 } | 99 } |
| 103 | 100 |
| 104 | 101 |
| 105 void OS::PostSetUp() { | |
| 106 // Math functions depend on CPU features therefore they are initialized after | |
| 107 // CPU. | |
| 108 MathSetup(); | |
| 109 } | |
| 110 | |
| 111 | |
| 112 // We keep the lowest and highest addresses mapped as a quick way of | 102 // We keep the lowest and highest addresses mapped as a quick way of |
| 113 // determining that pointers are outside the heap (used mostly in assertions | 103 // determining that pointers are outside the heap (used mostly in assertions |
| 114 // and verification). The estimate is conservative, i.e., not all addresses in | 104 // and verification). The estimate is conservative, i.e., not all addresses in |
| 115 // 'allocated' space are actually allocated to our heap. The range is | 105 // 'allocated' space are actually allocated to our heap. The range is |
| 116 // [lowest, highest), inclusive on the low and and exclusive on the high end. | 106 // [lowest, highest), inclusive on the low and and exclusive on the high end. |
| 117 static void* lowest_ever_allocated = reinterpret_cast<void*>(-1); | 107 static void* lowest_ever_allocated = reinterpret_cast<void*>(-1); |
| 118 static void* highest_ever_allocated = reinterpret_cast<void*>(0); | 108 static void* highest_ever_allocated = reinterpret_cast<void*>(0); |
| 119 | 109 |
| 120 | 110 |
| 121 static void UpdateAllocatedSpaceLimits(void* address, int size) { | 111 static void UpdateAllocatedSpaceLimits(void* address, int size) { |
| (...skipping 624 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 746 | 736 |
| 747 | 737 |
| 748 class SamplerThread : public Thread { | 738 class SamplerThread : public Thread { |
| 749 public: | 739 public: |
| 750 static const int kSamplerThreadStackSize = 64 * KB; | 740 static const int kSamplerThreadStackSize = 64 * KB; |
| 751 | 741 |
| 752 explicit SamplerThread(int interval) | 742 explicit SamplerThread(int interval) |
| 753 : Thread(Thread::Options("SamplerThread", kSamplerThreadStackSize)), | 743 : Thread(Thread::Options("SamplerThread", kSamplerThreadStackSize)), |
| 754 interval_(interval) {} | 744 interval_(interval) {} |
| 755 | 745 |
| 746 static void SetUp() { |
| 747 if (!mutex_) { |
| 748 mutex_ = OS::CreateMutex(); |
| 749 } |
| 750 } |
| 751 |
| 756 static void AddActiveSampler(Sampler* sampler) { | 752 static void AddActiveSampler(Sampler* sampler) { |
| 757 ScopedLock lock(mutex_.Pointer()); | 753 ScopedLock lock(mutex_); |
| 758 SamplerRegistry::AddActiveSampler(sampler); | 754 SamplerRegistry::AddActiveSampler(sampler); |
| 759 if (instance_ == NULL) { | 755 if (instance_ == NULL) { |
| 760 instance_ = new SamplerThread(sampler->interval()); | 756 instance_ = new SamplerThread(sampler->interval()); |
| 761 instance_->Start(); | 757 instance_->Start(); |
| 762 } else { | 758 } else { |
| 763 ASSERT(instance_->interval_ == sampler->interval()); | 759 ASSERT(instance_->interval_ == sampler->interval()); |
| 764 } | 760 } |
| 765 } | 761 } |
| 766 | 762 |
| 767 static void RemoveActiveSampler(Sampler* sampler) { | 763 static void RemoveActiveSampler(Sampler* sampler) { |
| 768 ScopedLock lock(mutex_.Pointer()); | 764 ScopedLock lock(mutex_); |
| 769 SamplerRegistry::RemoveActiveSampler(sampler); | 765 SamplerRegistry::RemoveActiveSampler(sampler); |
| 770 if (SamplerRegistry::GetState() == SamplerRegistry::HAS_NO_SAMPLERS) { | 766 if (SamplerRegistry::GetState() == SamplerRegistry::HAS_NO_SAMPLERS) { |
| 771 RuntimeProfiler::StopRuntimeProfilerThreadBeforeShutdown(instance_); | 767 RuntimeProfiler::StopRuntimeProfilerThreadBeforeShutdown(instance_); |
| 772 delete instance_; | 768 delete instance_; |
| 773 instance_ = NULL; | 769 instance_ = NULL; |
| 774 } | 770 } |
| 775 } | 771 } |
| 776 | 772 |
| 777 // Implement Thread::Run(). | 773 // Implement Thread::Run(). |
| 778 virtual void Run() { | 774 virtual void Run() { |
| (...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 855 sampler->SampleStack(sample); | 851 sampler->SampleStack(sample); |
| 856 sampler->Tick(sample); | 852 sampler->Tick(sample); |
| 857 } | 853 } |
| 858 thread_resume(profiled_thread); | 854 thread_resume(profiled_thread); |
| 859 } | 855 } |
| 860 | 856 |
| 861 const int interval_; | 857 const int interval_; |
| 862 RuntimeProfilerRateLimiter rate_limiter_; | 858 RuntimeProfilerRateLimiter rate_limiter_; |
| 863 | 859 |
| 864 // Protects the process wide state below. | 860 // Protects the process wide state below. |
| 865 static LazyMutex mutex_; | 861 static Mutex* mutex_; |
| 866 static SamplerThread* instance_; | 862 static SamplerThread* instance_; |
| 867 | 863 |
| 868 private: | 864 private: |
| 869 DISALLOW_COPY_AND_ASSIGN(SamplerThread); | 865 DISALLOW_COPY_AND_ASSIGN(SamplerThread); |
| 870 }; | 866 }; |
| 871 | 867 |
| 872 #undef REGISTER_FIELD | 868 #undef REGISTER_FIELD |
| 873 | 869 |
| 874 | 870 |
| 875 LazyMutex SamplerThread::mutex_ = LAZY_MUTEX_INITIALIZER; | 871 Mutex* SamplerThread::mutex_ = NULL; |
| 876 SamplerThread* SamplerThread::instance_ = NULL; | 872 SamplerThread* SamplerThread::instance_ = NULL; |
| 877 | 873 |
| 878 | 874 |
| 875 void OS::SetUp() { |
| 876 // Seed the random number generator. We preserve microsecond resolution. |
| 877 uint64_t seed = Ticks() ^ (getpid() << 16); |
| 878 srandom(static_cast<unsigned int>(seed)); |
| 879 limit_mutex = CreateMutex(); |
| 880 SamplerThread::SetUp(); |
| 881 } |
| 882 |
| 883 |
| 879 Sampler::Sampler(Isolate* isolate, int interval) | 884 Sampler::Sampler(Isolate* isolate, int interval) |
| 880 : isolate_(isolate), | 885 : isolate_(isolate), |
| 881 interval_(interval), | 886 interval_(interval), |
| 882 profiling_(false), | 887 profiling_(false), |
| 883 active_(false), | 888 active_(false), |
| 884 samples_taken_(0) { | 889 samples_taken_(0) { |
| 885 data_ = new PlatformData; | 890 data_ = new PlatformData; |
| 886 } | 891 } |
| 887 | 892 |
| 888 | 893 |
| (...skipping 11 matching lines...) Expand all Loading... |
| 900 | 905 |
| 901 | 906 |
| 902 void Sampler::Stop() { | 907 void Sampler::Stop() { |
| 903 ASSERT(IsActive()); | 908 ASSERT(IsActive()); |
| 904 SamplerThread::RemoveActiveSampler(this); | 909 SamplerThread::RemoveActiveSampler(this); |
| 905 SetActive(false); | 910 SetActive(false); |
| 906 } | 911 } |
| 907 | 912 |
| 908 | 913 |
| 909 } } // namespace v8::internal | 914 } } // namespace v8::internal |
| OLD | NEW |