123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161 |
- #ifndef BASE_TASK_SEQUENCE_MANAGER_TIME_DOMAIN_H_
- #define BASE_TASK_SEQUENCE_MANAGER_TIME_DOMAIN_H_
- #include <map>
- #include "base/callback.h"
- #include "base/check.h"
- #include "base/task/common/intrusive_heap.h"
- #include "base/task/sequence_manager/lazy_now.h"
- #include "base/task/sequence_manager/task_queue_impl.h"
- #include "base/time/time.h"
- #include "base/values.h"
- namespace base {
- namespace sequence_manager {
- class SequenceManager;
- namespace internal {
- class AssociatedThreadId;
- class SequenceManagerImpl;
- class TaskQueueImpl;
- }
- class BASE_EXPORT TimeDomain {
- public:
- TimeDomain(const TimeDomain&) = delete;
- TimeDomain& operator=(const TimeDomain&) = delete;
- virtual ~TimeDomain();
-
-
-
- virtual LazyNow CreateLazyNow() const = 0;
-
-
-
- virtual TimeTicks Now() const = 0;
-
-
-
-
-
-
-
- virtual Optional<TimeDelta> DelayTillNextTask(LazyNow* lazy_now) = 0;
- Value AsValue() const;
- bool has_pending_high_resolution_tasks() const {
- return pending_high_res_wake_up_count_;
- }
-
- bool empty() const { return delayed_wake_up_queue_.empty(); }
-
-
-
- virtual bool MaybeFastForwardToNextTask(bool quit_when_idle_requested) = 0;
- protected:
- TimeDomain();
- SequenceManager* sequence_manager() const;
-
- Optional<TimeTicks> NextScheduledRunTime() const;
- size_t NumberOfScheduledWakeUps() const {
- return delayed_wake_up_queue_.size();
- }
-
-
-
- virtual void SetNextDelayedDoWork(LazyNow* lazy_now, TimeTicks run_time);
-
-
- virtual void RequestDoWork();
- virtual const char* GetName() const = 0;
-
-
-
- virtual void OnRegisterWithSequenceManager(
- internal::SequenceManagerImpl* sequence_manager);
- private:
- friend class internal::TaskQueueImpl;
- friend class internal::SequenceManagerImpl;
- friend class TestTimeDomain;
-
-
-
-
- void SetNextWakeUpForQueue(internal::TaskQueueImpl* queue,
- Optional<internal::DelayedWakeUp> wake_up,
- internal::WakeUpResolution resolution,
- LazyNow* lazy_now);
-
- void UnregisterQueue(internal::TaskQueueImpl* queue);
-
-
- void MoveReadyDelayedTasksToWorkQueues(LazyNow* lazy_now);
- struct ScheduledDelayedWakeUp {
- internal::DelayedWakeUp wake_up;
- internal::WakeUpResolution resolution;
- internal::TaskQueueImpl* queue;
- bool operator<=(const ScheduledDelayedWakeUp& other) const {
- if (wake_up == other.wake_up) {
- return static_cast<int>(resolution) <=
- static_cast<int>(other.resolution);
- }
- return wake_up <= other.wake_up;
- }
- void SetHeapHandle(base::internal::HeapHandle handle) {
- DCHECK(handle.IsValid());
- queue->set_heap_handle(handle);
- }
- void ClearHeapHandle() {
- DCHECK(queue->heap_handle().IsValid());
- queue->set_heap_handle(base::internal::HeapHandle());
- }
- HeapHandle GetHeapHandle() const { return queue->heap_handle(); }
- };
- internal::SequenceManagerImpl* sequence_manager_;
- base::internal::IntrusiveHeap<ScheduledDelayedWakeUp> delayed_wake_up_queue_;
- int pending_high_res_wake_up_count_ = 0;
- scoped_refptr<internal::AssociatedThreadId> associated_thread_;
- };
- }
- }
- #endif
|