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 7cae10455d99b64b80cd8c75962013ed43a28f43..010bb260f474ebf0d9c61e5edfe4cbfe7faa231f 100644 |
--- a/base/profiler/stack_sampling_profiler_unittest.cc |
+++ b/base/profiler/stack_sampling_profiler_unittest.cc |
@@ -316,19 +316,48 @@ void SynchronousUnloadNativeLibrary(NativeLibrary library) { |
} |
// Called on the profiler thread when complete, to collect profiles. |
-void SaveProfiles(CallStackProfiles* profiles, |
- CallStackProfiles pending_profiles) { |
+bool SaveProfiles(CallStackProfiles* profiles, |
+ CallStackProfiles pending_profiles, |
+ StackSamplingProfiler::SamplingParams* sampling_params) { |
*profiles = std::move(pending_profiles); |
+ return false; |
} |
// 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) { |
+bool SaveProfilesAndSignalEvent( |
+ CallStackProfiles* profiles, |
+ WaitableEvent* event, |
+ CallStackProfiles pending_profiles, |
+ StackSamplingProfiler::SamplingParams* sampling_params) { |
*profiles = std::move(pending_profiles); |
event->Signal(); |
+ return false; |
+} |
+ |
+// Similar to SaveProfilesAndSignalEvent(), but will schedule a second |
+// collection after the first call back. |
+bool SaveProfilesAndReschedule( |
+ std::vector<CallStackProfiles>* profiles, |
+ WaitableEvent* event, |
+ CallStackProfiles pending_profiles, |
+ StackSamplingProfiler::SamplingParams* sampling_params) { |
+ profiles->push_back(std::move(pending_profiles)); |
+ |
+ event->Signal(); |
+ event->Reset(); |
+ |
+ if (profiles->size() == 2) |
+ return false; |
+ |
+ sampling_params->initial_delay = base::TimeDelta::FromSeconds(1); |
+ 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); |
+ return true; |
} |
// Executes the function with the target thread running and executing within |
@@ -1062,6 +1091,34 @@ TEST_F(StackSamplingProfilerTest, MAYBE_CanRunMultipleTimes) { |
}); |
} |
+TEST_F(StackSamplingProfilerTest, RescheduledByCallback) { |
Alexei Svitkine (slow)
2017/06/20 20:57:39
Note: I'll need to rebase this on my other CL.
|
+ 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. |
+ profiler.Start(); |
+ sampling_completed.Wait(); |
+ ASSERT_EQ(1u, profiles.size()); |
+ ASSERT_EQ(1u, profiles[0].size()); |
+ |
+ // Now, wait for the second callback call. |
+ sampling_completed.Wait(); |
+ profiler.Stop(); |
+ ASSERT_EQ(2u, profiles.size()); |
+ ASSERT_EQ(1u, profiles[1].size()); |
+ }); |
+} |
+ |
// Checks that the different profilers may be run. |
#if defined(STACK_SAMPLING_PROFILER_SUPPORTED) |
#define MAYBE_CanRunMultipleProfilers CanRunMultipleProfilers |