Chromium Code Reviews| Index: base/profiler/stack_sampling_profiler_unittest.cc |
| diff --git a/base/profiler/stack_sampling_profiler_unittest.cc b/base/profiler/stack_sampling_profiler_unittest.cc |
| index 66aacf91a7ded27003cc1b13e0f1ec475eac12e0..64c410549f332ebf7979d89aa78addb4e97e85f6 100644 |
| --- a/base/profiler/stack_sampling_profiler_unittest.cc |
| +++ b/base/profiler/stack_sampling_profiler_unittest.cc |
| @@ -5,6 +5,7 @@ |
| #include <stddef.h> |
| #include <stdint.h> |
| +#include <algorithm> |
| #include <cstdlib> |
| #include <memory> |
| #include <utility> |
| @@ -323,19 +324,51 @@ void SynchronousUnloadNativeLibrary(NativeLibrary library) { |
| } |
| // Called on the profiler thread when complete, to collect profiles. |
| -void SaveProfiles(CallStackProfiles* profiles, |
| - CallStackProfiles pending_profiles) { |
| +Optional<StackSamplingProfiler::SamplingParams> SaveProfiles( |
| + CallStackProfiles* profiles, |
| + CallStackProfiles pending_profiles) { |
| *profiles = std::move(pending_profiles); |
| + return Optional<StackSamplingProfiler::SamplingParams>(); |
| } |
| // Called on the profiler thread when complete. Collects profiles produced by |
| // the profiler, and signals an event to allow the main thread to know that that |
| // the profiler is done. |
| -void SaveProfilesAndSignalEvent(CallStackProfiles* profiles, |
| - WaitableEvent* event, |
| - CallStackProfiles pending_profiles) { |
| +Optional<StackSamplingProfiler::SamplingParams> SaveProfilesAndSignalEvent( |
| + CallStackProfiles* profiles, |
| + WaitableEvent* event, |
| + CallStackProfiles pending_profiles) { |
| *profiles = std::move(pending_profiles); |
| event->Signal(); |
| + return Optional<StackSamplingProfiler::SamplingParams>(); |
| +} |
| + |
| +// Similar to SaveProfilesAndSignalEvent(), but will schedule a second |
| +// collection after the first call back. |
| +Optional<StackSamplingProfiler::SamplingParams> SaveProfilesAndReschedule( |
| + std::vector<CallStackProfiles>* profiles, |
| + WaitableEvent* event, |
| + CallStackProfiles pending_profiles) { |
| + LOG(ERROR) << "SaveProfilesAndReschedule"; |
| + profiles->push_back(std::move(pending_profiles)); |
| + |
| + event->Signal(); |
| + event->Reset(); |
|
Robert Sesek
2017/07/14 19:22:39
I've just rewritten WaitableEvent on Mac and it's
|
| + |
| + if (profiles->size() == 2) { |
| + LOG(ERROR) << "Returning empty params"; |
| + return Optional<StackSamplingProfiler::SamplingParams>(); |
| + } |
| + |
| + StackSamplingProfiler::SamplingParams sampling_params; |
| + sampling_params.initial_delay = base::TimeDelta::FromMilliseconds(100); |
| + sampling_params.bursts = 1; |
| + sampling_params.samples_per_burst = 1; |
| + // Below are unused: |
| + sampling_params.burst_interval = base::TimeDelta::FromMilliseconds(0); |
| + sampling_params.sampling_interval = base::TimeDelta::FromMilliseconds(0); |
| + LOG(ERROR) << "Returning new params"; |
| + return sampling_params; |
| } |
| // Executes the function with the target thread running and executing within |
| @@ -1020,6 +1053,40 @@ PROFILER_TEST_F(StackSamplingProfilerTest, CanRunMultipleTimes) { |
| }); |
| } |
| +PROFILER_TEST_F(StackSamplingProfilerTest, RescheduledByCallback) { |
| + LOG(ERROR) << "RescheduledByCallback start"; |
| + WithTargetThread([](PlatformThreadId target_thread_id) { |
| + SamplingParams params; |
| + params.sampling_interval = TimeDelta::FromMilliseconds(0); |
| + params.samples_per_burst = 1; |
| + |
| + std::vector<CallStackProfiles> profiles; |
| + WaitableEvent sampling_completed(WaitableEvent::ResetPolicy::MANUAL, |
| + WaitableEvent::InitialState::NOT_SIGNALED); |
| + const StackSamplingProfiler::CompletedCallback callback = |
| + Bind(&SaveProfilesAndReschedule, Unretained(&profiles), |
| + Unretained(&sampling_completed)); |
| + StackSamplingProfiler profiler(target_thread_id, params, callback); |
| + |
| + // Start once and wait for it to be completed. |
| + LOG(ERROR) << "RescheduledByCallback call start"; |
| + profiler.Start(); |
| + LOG(ERROR) << "RescheduledByCallback call wait1"; |
| + sampling_completed.Wait(); |
| + LOG(ERROR) << "RescheduledByCallback after wait1"; |
| + ASSERT_EQ(1u, profiles.size()); |
| + ASSERT_EQ(1u, profiles[0].size()); |
| + |
| + // Now, wait for the second callback call. |
| + LOG(ERROR) << "RescheduledByCallback call wait2"; |
| + sampling_completed.Wait(); |
| + LOG(ERROR) << "RescheduledByCallback after wait2"; |
| + profiler.Stop(); |
| + ASSERT_EQ(2u, profiles.size()); |
| + ASSERT_EQ(1u, profiles[1].size()); |
| + }); |
| +} |
| + |
| // Checks that the different profilers may be run. |
| PROFILER_TEST_F(StackSamplingProfilerTest, CanRunMultipleProfilers) { |
| SamplingParams params; |