| OLD | NEW |
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 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 "base/task_scheduler/scheduler_worker.h" | 5 #include "base/task_scheduler/scheduler_worker.h" |
| 6 | 6 |
| 7 #include <stddef.h> | 7 #include <stddef.h> |
| 8 | 8 |
| 9 #include <utility> | 9 #include <utility> |
| 10 | 10 |
| 11 #include "base/logging.h" | 11 #include "base/logging.h" |
| 12 #include "base/memory/ptr_util.h" | 12 #include "base/memory/ptr_util.h" |
| 13 #include "base/task_scheduler/task_tracker.h" | 13 #include "base/task_scheduler/task_tracker.h" |
| 14 | 14 |
| 15 #if defined(OS_MACOSX) | 15 #if defined(OS_MACOSX) |
| 16 #include "base/mac/scoped_nsautorelease_pool.h" | 16 #include "base/mac/scoped_nsautorelease_pool.h" |
| 17 #elif defined(OS_WIN) | 17 #elif defined(OS_WIN) |
| 18 #include "base/win/com_init_check_hook.h" |
| 18 #include "base/win/scoped_com_initializer.h" | 19 #include "base/win/scoped_com_initializer.h" |
| 19 #endif | 20 #endif |
| 20 | 21 |
| 21 namespace base { | 22 namespace base { |
| 22 namespace internal { | 23 namespace internal { |
| 23 | 24 |
| 24 class SchedulerWorker::Thread : public PlatformThread::Delegate { | 25 class SchedulerWorker::Thread : public PlatformThread::Delegate { |
| 25 public: | 26 public: |
| 26 ~Thread() override = default; | 27 ~Thread() override = default; |
| 27 | 28 |
| 28 static std::unique_ptr<Thread> Create(scoped_refptr<SchedulerWorker> outer) { | 29 static std::unique_ptr<Thread> Create(scoped_refptr<SchedulerWorker> outer) { |
| 29 std::unique_ptr<Thread> thread(new Thread(std::move(outer))); | 30 std::unique_ptr<Thread> thread(new Thread(std::move(outer))); |
| 30 thread->Initialize(); | 31 thread->Initialize(); |
| 31 if (thread->thread_handle_.is_null()) | 32 if (thread->thread_handle_.is_null()) |
| 32 return nullptr; | 33 return nullptr; |
| 33 return thread; | 34 return thread; |
| 34 } | 35 } |
| 35 | 36 |
| 36 // PlatformThread::Delegate. | 37 // PlatformThread::Delegate. |
| 37 void ThreadMain() override { | 38 void ThreadMain() override { |
| 38 // Set if this thread was detached. | 39 // Set if this thread was detached. |
| 39 std::unique_ptr<Thread> detached_thread; | 40 std::unique_ptr<Thread> detached_thread; |
| 40 | 41 |
| 41 outer_->delegate_->OnMainEntry(outer_.get()); | 42 outer_->delegate_->OnMainEntry(outer_.get()); |
| 42 | 43 |
| 43 // A SchedulerWorker starts out waiting for work. | 44 // A SchedulerWorker starts out waiting for work. |
| 44 outer_->delegate_->WaitForWork(&wake_up_event_); | 45 outer_->delegate_->WaitForWork(&wake_up_event_); |
| 45 | 46 |
| 46 #if defined(OS_WIN) | 47 // When defined(COM_INIT_CHECK_HOOK_ENABLED), ignore |
| 48 // SchedulerBackwardCompatibility::INIT_COM_STA to find incorrect uses of |
| 49 // COM that should be running in a COM STA Task Runner. |
| 50 #if defined(OS_WIN) && !defined(COM_INIT_CHECK_HOOK_ENABLED) |
| 47 std::unique_ptr<win::ScopedCOMInitializer> com_initializer; | 51 std::unique_ptr<win::ScopedCOMInitializer> com_initializer; |
| 48 if (outer_->backward_compatibility_ == | 52 if (outer_->backward_compatibility_ == |
| 49 SchedulerBackwardCompatibility::INIT_COM_STA) { | 53 SchedulerBackwardCompatibility::INIT_COM_STA) { |
| 50 com_initializer = MakeUnique<win::ScopedCOMInitializer>(); | 54 com_initializer = MakeUnique<win::ScopedCOMInitializer>(); |
| 51 } | 55 } |
| 52 #endif | 56 #endif |
| 53 | 57 |
| 54 while (!outer_->ShouldExit()) { | 58 while (!outer_->ShouldExit()) { |
| 55 DCHECK(outer_); | 59 DCHECK(outer_); |
| 56 | 60 |
| (...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 203 ThreadPriority priority_hint, | 207 ThreadPriority priority_hint, |
| 204 std::unique_ptr<Delegate> delegate, | 208 std::unique_ptr<Delegate> delegate, |
| 205 TaskTracker* task_tracker, | 209 TaskTracker* task_tracker, |
| 206 const SchedulerLock* predecessor_lock, | 210 const SchedulerLock* predecessor_lock, |
| 207 SchedulerBackwardCompatibility backward_compatibility, | 211 SchedulerBackwardCompatibility backward_compatibility, |
| 208 InitialState initial_state) | 212 InitialState initial_state) |
| 209 : thread_lock_(predecessor_lock), | 213 : thread_lock_(predecessor_lock), |
| 210 priority_hint_(priority_hint), | 214 priority_hint_(priority_hint), |
| 211 delegate_(std::move(delegate)), | 215 delegate_(std::move(delegate)), |
| 212 task_tracker_(task_tracker), | 216 task_tracker_(task_tracker), |
| 213 #if defined(OS_WIN) | 217 #if defined(OS_WIN) && !defined(COM_INIT_CHECK_HOOK_ENABLED) |
| 214 backward_compatibility_(backward_compatibility), | 218 backward_compatibility_(backward_compatibility), |
| 215 #endif | 219 #endif |
| 216 initial_state_(initial_state) { | 220 initial_state_(initial_state) { |
| 217 DCHECK(delegate_); | 221 DCHECK(delegate_); |
| 218 DCHECK(task_tracker_); | 222 DCHECK(task_tracker_); |
| 219 } | 223 } |
| 220 | 224 |
| 221 bool SchedulerWorker::Start() { | 225 bool SchedulerWorker::Start() { |
| 222 AutoSchedulerLock auto_lock(thread_lock_); | 226 AutoSchedulerLock auto_lock(thread_lock_); |
| 223 DCHECK(!started_); | 227 DCHECK(!started_); |
| (...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 328 // The ordering of the checks is important below. This SchedulerWorker may be | 332 // The ordering of the checks is important below. This SchedulerWorker may be |
| 329 // released and outlive |task_tracker_| in unit tests. However, when the | 333 // released and outlive |task_tracker_| in unit tests. However, when the |
| 330 // SchedulerWorker is released, |should_exit_| will be set, so check that | 334 // SchedulerWorker is released, |should_exit_| will be set, so check that |
| 331 // first. | 335 // first. |
| 332 return should_exit_.IsSet() || join_called_for_testing_.IsSet() || | 336 return should_exit_.IsSet() || join_called_for_testing_.IsSet() || |
| 333 task_tracker_->IsShutdownComplete(); | 337 task_tracker_->IsShutdownComplete(); |
| 334 } | 338 } |
| 335 | 339 |
| 336 } // namespace internal | 340 } // namespace internal |
| 337 } // namespace base | 341 } // namespace base |
| OLD | NEW |