123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124 |
- // Copyright 2018 The Chromium Authors. All rights reserved.
- // Use of this source code is governed by a BSD-style license that can be
- // found in the LICENSE file.
- #ifndef BASE_TASK_SEQUENCE_MANAGER_THREAD_CONTROLLER_H_
- #define BASE_TASK_SEQUENCE_MANAGER_THREAD_CONTROLLER_H_
- #include "base/message_loop/message_pump.h"
- #include "base/run_loop.h"
- #include "base/single_thread_task_runner.h"
- #include "base/task/sequence_manager/lazy_now.h"
- #include "base/time/time.h"
- #include "build/build_config.h"
- namespace base {
- class MessageLoopBase;
- class TickClock;
- struct PendingTask;
- namespace sequence_manager {
- namespace internal {
- class AssociatedThreadId;
- class SequencedTaskSource;
- // Implementation of this interface is used by SequenceManager to schedule
- // actual work to be run. Hopefully we can stop using MessageLoop and this
- // interface will become more concise.
- class ThreadController {
- public:
- virtual ~ThreadController() = default;
- // Sets the number of tasks executed in a single invocation of DoWork.
- // Increasing the batch size can reduce the overhead of yielding back to the
- // main message loop.
- virtual void SetWorkBatchSize(int work_batch_size = 1) = 0;
- // Notifies that |pending_task| is about to be enqueued. Needed for tracing
- // purposes. The impl may use this opportunity add metadata to |pending_task|
- // before it is moved into the queue.
- virtual void WillQueueTask(PendingTask* pending_task,
- const char* task_queue_name) = 0;
- // Notify the controller that its associated sequence has immediate work
- // to run. Shortly after this is called, the thread associated with this
- // controller will run a task returned by sequence->TakeTask(). Can be called
- // from any sequence.
- //
- // TODO(altimin): Change this to "the thread associated with this
- // controller will run tasks returned by sequence->TakeTask() until it
- // returns null or sequence->DidRunTask() returns false" once the
- // code is changed to work that way.
- virtual void ScheduleWork() = 0;
- // Notify the controller that SequencedTaskSource will have a delayed work
- // ready to be run at |run_time|. This call cancels any previously
- // scheduled delayed work. Can only be called from the main sequence.
- // NOTE: DelayTillNextTask might return a different value as it also takes
- // immediate work into account.
- // TODO(kraynov): Remove |lazy_now| parameter.
- virtual void SetNextDelayedDoWork(LazyNow* lazy_now, TimeTicks run_time) = 0;
- // Sets the sequenced task source from which to take tasks after
- // a Schedule*Work() call is made.
- // Must be called before the first call to Schedule*Work().
- virtual void SetSequencedTaskSource(SequencedTaskSource*) = 0;
- // Requests desired timer precision from the OS.
- // Has no effect on some platforms.
- virtual void SetTimerSlack(TimerSlack timer_slack) = 0;
- // Completes delayed initialization of unbound ThreadControllers.
- // BindToCurrentThread(MessageLoopBase*) or BindToCurrentThread(MessagePump*)
- // may only be called once.
- virtual void BindToCurrentThread(
- std::unique_ptr<MessagePump> message_pump) = 0;
- // Explicitly allow or disallow task execution. Implicitly disallowed when
- // entering a nested runloop.
- virtual void SetTaskExecutionAllowed(bool allowed) = 0;
- // Whether task execution is allowed or not.
- virtual bool IsTaskExecutionAllowed() const = 0;
- // Returns the MessagePump we're bound to if any.
- virtual MessagePump* GetBoundMessagePump() const = 0;
- // Returns true if the current run loop should quit when idle.
- virtual bool ShouldQuitRunLoopWhenIdle() = 0;
- #if defined(OS_IOS) || defined(OS_ANDROID)
- // On iOS, the main message loop cannot be Run(). Instead call
- // AttachToMessagePump(), which connects this ThreadController to the
- // UI thread's CFRunLoop and allows PostTask() to work.
- virtual void AttachToMessagePump() = 0;
- #endif
- #if defined(OS_IOS)
- // Detaches this ThreadController from the message pump, allowing the
- // controller to be shut down cleanly.
- virtual void DetachFromMessagePump() = 0;
- #endif
- // TODO(altimin): Get rid of the methods below.
- // These methods exist due to current integration of SequenceManager
- // with MessageLoop.
- virtual bool RunsTasksInCurrentSequence() = 0;
- virtual const TickClock* GetClock() = 0;
- virtual void SetDefaultTaskRunner(scoped_refptr<SingleThreadTaskRunner>) = 0;
- virtual scoped_refptr<SingleThreadTaskRunner> GetDefaultTaskRunner() = 0;
- virtual void RestoreDefaultTaskRunner() = 0;
- virtual void AddNestingObserver(RunLoop::NestingObserver* observer) = 0;
- virtual void RemoveNestingObserver(RunLoop::NestingObserver* observer) = 0;
- virtual const scoped_refptr<AssociatedThreadId>& GetAssociatedThread()
- const = 0;
- };
- } // namespace internal
- } // namespace sequence_manager
- } // namespace base
- #endif // BASE_TASK_SEQUENCE_MANAGER_THREAD_CONTROLLER_H_
|