// Copyright 2016 The Chromium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef BASE_TASK_THREAD_POOL_SEQUENCE_H_ #define BASE_TASK_THREAD_POOL_SEQUENCE_H_ #include <stddef.h> #include "base/base_export.h" #include "base/containers/intrusive_heap.h" #include "base/containers/queue.h" #include "base/sequence_token.h" #include "base/task/task_traits.h" #include "base/task/thread_pool/pooled_parallel_task_runner.h" #include "base/task/thread_pool/task.h" #include "base/task/thread_pool/task_source.h" #include "base/task/thread_pool/task_source_sort_key.h" #include "base/thread_annotations.h" #include "base/threading/sequence_local_storage_map.h" namespace base { namespace internal { // A Sequence is intended to hold delayed tasks and immediate tasks. // Delayed tasks are held in a prority_queue until they are ripe and // immediate tasks in a simple fifo queue. // When Sequence::TakeTask is called, we select the next appropriate task // from both queues and return it. // Each queue holds slots each containing up to a single Task that must be // executed in posting/runtime order. // // In comments below, an "empty Sequence" is a Sequence with no slot. // // Note: there is a known refcounted-ownership cycle in the Scheduler // architecture: Sequence -> Task -> TaskRunner -> Sequence -> ... // This is okay so long as the other owners of Sequence (PriorityQueue and // WorkerThread in alternation and // ThreadGroup::WorkerThreadDelegateImpl::GetWork() // temporarily) keep running it (and taking Tasks from it as a result). A // dangling reference cycle would only occur should they release their reference // to it while it's not empty. In other words, it is only correct for them to // release it after PopTask() returns false to indicate it was made empty by // that call (in which case the next PushImmediateTask() will return true to // indicate to the caller that the Sequence should be re-enqueued for // execution). This class is thread-safe. class BASE_EXPORT Sequence : public TaskSource { … }; } // namespace internal } // namespace base #endif // BASE_TASK_THREAD_POOL_SEQUENCE_H_