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 #ifndef THIRD_PARTY_WEBKIT_SOURCE_PLATFORM_SCHEDULER_BASE_TASK_QUEUE_IMPL_H_ | 5 #ifndef THIRD_PARTY_WEBKIT_SOURCE_PLATFORM_SCHEDULER_BASE_TASK_QUEUE_IMPL_H_ |
6 #define THIRD_PARTY_WEBKIT_SOURCE_PLATFORM_SCHEDULER_BASE_TASK_QUEUE_IMPL_H_ | 6 #define THIRD_PARTY_WEBKIT_SOURCE_PLATFORM_SCHEDULER_BASE_TASK_QUEUE_IMPL_H_ |
7 | 7 |
8 #include <stddef.h> | 8 #include <stddef.h> |
9 | 9 |
10 #include <memory> | 10 #include <memory> |
(...skipping 261 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
272 std::unique_ptr<WorkQueue> immediate_work_queue; | 272 std::unique_ptr<WorkQueue> immediate_work_queue; |
273 std::priority_queue<Task> delayed_incoming_queue; | 273 std::priority_queue<Task> delayed_incoming_queue; |
274 base::ObserverList<base::MessageLoop::TaskObserver> task_observers; | 274 base::ObserverList<base::MessageLoop::TaskObserver> task_observers; |
275 size_t set_index; | 275 size_t set_index; |
276 HeapHandle heap_handle; | 276 HeapHandle heap_handle; |
277 int is_enabled_refcount; | 277 int is_enabled_refcount; |
278 int voter_refcount; | 278 int voter_refcount; |
279 base::trace_event::BlameContext* blame_context; // Not owned. | 279 base::trace_event::BlameContext* blame_context; // Not owned. |
280 EnqueueOrder current_fence; | 280 EnqueueOrder current_fence; |
281 base::TimeTicks scheduled_time_domain_wakeup; | 281 base::TimeTicks scheduled_time_domain_wakeup; |
| 282 |
| 283 // Number of times any thread lock was acquired from main thread to |
| 284 // allow any thread lock be reentrable from main thread. |
| 285 mutable size_t any_thread_lock_acquired_count; |
| 286 }; |
| 287 |
| 288 // Helper class to make any_thread_lock reentrable from main thread. |
| 289 // When |acquired_count| pointer is non-null, class uses is to |
| 290 // allow for reentrability. When |acquired_count| is nullptr, |
| 291 // this helper class behaves as a normal base::AutoLock. |
| 292 class AnyThreadAutoLock { |
| 293 public: |
| 294 AnyThreadAutoLock(base::Lock& lock, size_t* acquired_count); |
| 295 AnyThreadAutoLock(AnyThreadAutoLock&& auto_lock) = default; |
| 296 ~AnyThreadAutoLock(); |
| 297 |
| 298 private: |
| 299 base::Lock& lock_; |
| 300 size_t* acquired_count_; |
| 301 DISALLOW_COPY_AND_ASSIGN(AnyThreadAutoLock); |
282 }; | 302 }; |
283 | 303 |
284 ~TaskQueueImpl() override; | 304 ~TaskQueueImpl() override; |
285 | 305 |
286 bool PostImmediateTaskImpl(const tracked_objects::Location& from_here, | 306 bool PostImmediateTaskImpl(const tracked_objects::Location& from_here, |
287 const base::Closure& task, | 307 const base::Closure& task, |
288 TaskType task_type); | 308 TaskType task_type); |
289 bool PostDelayedTaskImpl(const tracked_objects::Location& from_here, | 309 bool PostDelayedTaskImpl(const tracked_objects::Location& from_here, |
290 const base::Closure& task, | 310 const base::Closure& task, |
291 base::TimeDelta delay, | 311 base::TimeDelta delay, |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
323 base::trace_event::TracedValue* state); | 343 base::trace_event::TracedValue* state); |
324 static void QueueAsValueInto(const std::priority_queue<Task>& queue, | 344 static void QueueAsValueInto(const std::priority_queue<Task>& queue, |
325 base::trace_event::TracedValue* state); | 345 base::trace_event::TracedValue* state); |
326 static void TaskAsValueInto(const Task& task, | 346 static void TaskAsValueInto(const Task& task, |
327 base::trace_event::TracedValue* state); | 347 base::trace_event::TracedValue* state); |
328 | 348 |
329 void RemoveQueueEnabledVoter(const QueueEnabledVoterImpl* voter); | 349 void RemoveQueueEnabledVoter(const QueueEnabledVoterImpl* voter); |
330 void OnQueueEnabledVoteChanged(bool enabled); | 350 void OnQueueEnabledVoteChanged(bool enabled); |
331 void EnableOrDisableWithSelector(bool enable); | 351 void EnableOrDisableWithSelector(bool enable); |
332 | 352 |
| 353 AnyThreadAutoLock AcquireAnyThreadLock() const; |
| 354 |
333 const base::PlatformThreadId thread_id_; | 355 const base::PlatformThreadId thread_id_; |
334 | 356 |
335 mutable base::Lock any_thread_lock_; | 357 mutable base::Lock any_thread_lock_; |
336 AnyThread any_thread_; | 358 AnyThread any_thread_; |
337 struct AnyThread& any_thread() { | 359 struct AnyThread& any_thread() { |
338 any_thread_lock_.AssertAcquired(); | 360 any_thread_lock_.AssertAcquired(); |
339 return any_thread_; | 361 return any_thread_; |
340 } | 362 } |
341 const struct AnyThread& any_thread() const { | 363 const struct AnyThread& any_thread() const { |
342 any_thread_lock_.AssertAcquired(); | 364 any_thread_lock_.AssertAcquired(); |
(...skipping 21 matching lines...) Expand all Loading... |
364 const bool should_report_when_execution_blocked_; | 386 const bool should_report_when_execution_blocked_; |
365 | 387 |
366 DISALLOW_COPY_AND_ASSIGN(TaskQueueImpl); | 388 DISALLOW_COPY_AND_ASSIGN(TaskQueueImpl); |
367 }; | 389 }; |
368 | 390 |
369 } // namespace internal | 391 } // namespace internal |
370 } // namespace scheduler | 392 } // namespace scheduler |
371 } // namespace blink | 393 } // namespace blink |
372 | 394 |
373 #endif // THIRD_PARTY_WEBKIT_SOURCE_PLATFORM_SCHEDULER_BASE_TASK_QUEUE_IMPL_H_ | 395 #endif // THIRD_PARTY_WEBKIT_SOURCE_PLATFORM_SCHEDULER_BASE_TASK_QUEUE_IMPL_H_ |
OLD | NEW |