| OLD | NEW |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include <sstream> | 5 #include <sstream> |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/compiler_specific.h" | 8 #include "base/compiler_specific.h" |
| 9 #include "base/path_service.h" | 9 #include "base/path_service.h" |
| 10 #include "base/profiler/stack_sampling_profiler.h" | 10 #include "base/profiler/stack_sampling_profiler.h" |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 63 | 63 |
| 64 void TargetThread::WaitForThreadStart() { | 64 void TargetThread::WaitForThreadStart() { |
| 65 thread_started_event_.Wait(); | 65 thread_started_event_.Wait(); |
| 66 } | 66 } |
| 67 | 67 |
| 68 void TargetThread::SignalThreadToFinish() { | 68 void TargetThread::SignalThreadToFinish() { |
| 69 finish_event_.Signal(); | 69 finish_event_.Signal(); |
| 70 } | 70 } |
| 71 | 71 |
| 72 // static | 72 // static |
| 73 #if defined(_WIN64) | 73 // Disable inlining for this function so that it gets its own stack frame. |
| 74 // Disable optimizations for this function so that it gets its own stack frame. | 74 NOINLINE void TargetThread::SignalAndWaitUntilSignaled( |
| 75 #pragma optimize("", off) | |
| 76 #endif | |
| 77 void TargetThread::SignalAndWaitUntilSignaled( | |
| 78 WaitableEvent* thread_started_event, | 75 WaitableEvent* thread_started_event, |
| 79 WaitableEvent* finish_event) { | 76 WaitableEvent* finish_event) { |
| 80 thread_started_event->Signal(); | 77 thread_started_event->Signal(); |
| 78 volatile int x = 1; |
| 81 finish_event->Wait(); | 79 finish_event->Wait(); |
| 80 x = 0; // Prevent tail call to WaitableEvent::Wait(). |
| 81 ALLOW_UNUSED_LOCAL(x); |
| 82 } | 82 } |
| 83 #if defined(_WIN64) | |
| 84 #pragma optimize("", on) | |
| 85 #endif | |
| 86 | 83 |
| 87 // Called on the profiler thread when complete. Collects profiles produced by | 84 // Called on the profiler thread when complete. Collects profiles produced by |
| 88 // the profiler, and signals an event to allow the main thread to know that that | 85 // the profiler, and signals an event to allow the main thread to know that that |
| 89 // the profiler is done. | 86 // the profiler is done. |
| 90 void SaveProfilesAndSignalEvent(std::vector<Profile>* profiles, | 87 void SaveProfilesAndSignalEvent(std::vector<Profile>* profiles, |
| 91 WaitableEvent* event, | 88 WaitableEvent* event, |
| 92 const std::vector<Profile>& pending_profiles) { | 89 const std::vector<Profile>& pending_profiles) { |
| 93 *profiles = pending_profiles; | 90 *profiles = pending_profiles; |
| 94 event->Signal(); | 91 event->Signal(); |
| 95 } | 92 } |
| (...skipping 219 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 315 params.bursts = 1; | 312 params.bursts = 1; |
| 316 params.samples_per_burst = 2; | 313 params.samples_per_burst = 2; |
| 317 | 314 |
| 318 std::vector<Profile> profiles; | 315 std::vector<Profile> profiles; |
| 319 CaptureProfiles(params, &profiles, TimeDelta::FromMilliseconds(50)); | 316 CaptureProfiles(params, &profiles, TimeDelta::FromMilliseconds(50)); |
| 320 | 317 |
| 321 EXPECT_TRUE(profiles.empty()); | 318 EXPECT_TRUE(profiles.empty()); |
| 322 } | 319 } |
| 323 | 320 |
| 324 } // namespace tracked_objects | 321 } // namespace tracked_objects |
| OLD | NEW |