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 681 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
692 | 692 |
693 void SampleContext(Sampler* sampler) { | 693 void SampleContext(Sampler* sampler) { |
694 HANDLE profiled_thread = sampler->platform_data()->profiled_thread(); | 694 HANDLE profiled_thread = sampler->platform_data()->profiled_thread(); |
695 if (profiled_thread == NULL) return; | 695 if (profiled_thread == NULL) return; |
696 | 696 |
697 // Context used for sampling the register state of the profiled thread. | 697 // Context used for sampling the register state of the profiled thread. |
698 CONTEXT context; | 698 CONTEXT context; |
699 memset(&context, 0, sizeof(context)); | 699 memset(&context, 0, sizeof(context)); |
700 | 700 |
701 TickSample sample_obj; | 701 TickSample sample_obj; |
702 TickSample* sample = CpuProfiler::StartTickSampleEvent(sampler->isolate()); | 702 TickSample* sample = CpuProfiler::TickSampleEvent(sampler->isolate()); |
703 if (sample == NULL) sample = &sample_obj; | 703 if (sample == NULL) sample = &sample_obj; |
704 | 704 |
705 static const DWORD kSuspendFailed = static_cast<DWORD>(-1); | 705 static const DWORD kSuspendFailed = static_cast<DWORD>(-1); |
706 if (SuspendThread(profiled_thread) == kSuspendFailed) return; | 706 if (SuspendThread(profiled_thread) == kSuspendFailed) return; |
707 sample->state = sampler->isolate()->current_vm_state(); | 707 sample->state = sampler->isolate()->current_vm_state(); |
708 | 708 |
709 context.ContextFlags = CONTEXT_FULL; | 709 context.ContextFlags = CONTEXT_FULL; |
710 if (GetThreadContext(profiled_thread, &context) != 0) { | 710 if (GetThreadContext(profiled_thread, &context) != 0) { |
711 #if V8_HOST_ARCH_X64 | 711 #if V8_HOST_ARCH_X64 |
712 sample->pc = reinterpret_cast<Address>(context.Rip); | 712 sample->pc = reinterpret_cast<Address>(context.Rip); |
713 sample->sp = reinterpret_cast<Address>(context.Rsp); | 713 sample->sp = reinterpret_cast<Address>(context.Rsp); |
714 sample->fp = reinterpret_cast<Address>(context.Rbp); | 714 sample->fp = reinterpret_cast<Address>(context.Rbp); |
715 #else | 715 #else |
716 sample->pc = reinterpret_cast<Address>(context.Eip); | 716 sample->pc = reinterpret_cast<Address>(context.Eip); |
717 sample->sp = reinterpret_cast<Address>(context.Esp); | 717 sample->sp = reinterpret_cast<Address>(context.Esp); |
718 sample->fp = reinterpret_cast<Address>(context.Ebp); | 718 sample->fp = reinterpret_cast<Address>(context.Ebp); |
719 #endif | 719 #endif |
720 sampler->SampleStack(sample); | 720 sampler->SampleStack(sample); |
721 sampler->Tick(sample); | 721 sampler->Tick(sample); |
722 } | 722 } |
723 CpuProfiler::FinishTickSampleEvent(sampler->isolate()); | |
724 ResumeThread(profiled_thread); | 723 ResumeThread(profiled_thread); |
725 } | 724 } |
726 | 725 |
727 const int interval_; | 726 const int interval_; |
728 RuntimeProfilerRateLimiter rate_limiter_; | 727 RuntimeProfilerRateLimiter rate_limiter_; |
729 | 728 |
730 // Protects the process wide state below. | 729 // Protects the process wide state below. |
731 static Mutex* mutex_; | 730 static Mutex* mutex_; |
732 static SamplerThread* instance_; | 731 static SamplerThread* instance_; |
733 | 732 |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
768 data_ = new PlatformData; | 767 data_ = new PlatformData; |
769 } | 768 } |
770 | 769 |
771 | 770 |
772 Sampler::~Sampler() { | 771 Sampler::~Sampler() { |
773 ASSERT(!IsActive()); | 772 ASSERT(!IsActive()); |
774 delete data_; | 773 delete data_; |
775 } | 774 } |
776 | 775 |
777 | 776 |
778 void Sampler::DoSample() { | |
779 // TODO(rogulenko): implement | |
780 } | |
781 | |
782 | |
783 void Sampler::Start() { | 777 void Sampler::Start() { |
784 ASSERT(!IsActive()); | 778 ASSERT(!IsActive()); |
785 SetActive(true); | 779 SetActive(true); |
786 SamplerThread::AddActiveSampler(this); | 780 SamplerThread::AddActiveSampler(this); |
787 } | 781 } |
788 | 782 |
789 | 783 |
790 void Sampler::Stop() { | 784 void Sampler::Stop() { |
791 ASSERT(IsActive()); | 785 ASSERT(IsActive()); |
792 SamplerThread::RemoveActiveSampler(this); | 786 SamplerThread::RemoveActiveSampler(this); |
793 SetActive(false); | 787 SetActive(false); |
794 } | 788 } |
795 | 789 |
796 | 790 |
797 void Sampler::StartSampling() { | |
798 } | |
799 | |
800 | |
801 void Sampler::StopSampling() { | |
802 } | |
803 | |
804 | |
805 } } // namespace v8::internal | 791 } } // namespace v8::internal |
OLD | NEW |