1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283 |
- // Copyright 2019 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_THREAD_POOL_THREAD_GROUP_NATIVE_H_
- #define BASE_TASK_THREAD_POOL_THREAD_GROUP_NATIVE_H_
- #include "base/base_export.h"
- #include "base/synchronization/atomic_flag.h"
- #include "base/task/thread_pool/thread_group.h"
- namespace base {
- namespace internal {
- class BASE_EXPORT ThreadGroupNative : public ThreadGroup {
- public:
- // Destroying a ThreadGroupNative is not allowed in
- // production; it is always leaked. In tests, it can only be destroyed after
- // JoinForTesting() has returned.
- ~ThreadGroupNative() override;
- // Starts the thread group and allows tasks to begin running.
- void Start(WorkerEnvironment worker_environment = WorkerEnvironment::NONE);
- // ThreadGroup:
- void JoinForTesting() override;
- size_t GetMaxConcurrentNonBlockedTasksDeprecated() const override;
- void DidUpdateCanRunPolicy() override;
- protected:
- ThreadGroupNative(TrackedRef<TaskTracker> task_tracker,
- TrackedRef<Delegate> delegate,
- ThreadGroup* predecessor_thread_group);
- // Runs a task off the next task source on the |priority_queue_|. Called by
- // callbacks posted to platform native thread pools.
- void RunNextTaskSourceImpl();
- virtual void JoinImpl() = 0;
- virtual void StartImpl() = 0;
- virtual void SubmitWork() = 0;
- // Used to control the worker environment. Supports COM MTA on Windows.
- WorkerEnvironment worker_environment_ = WorkerEnvironment::NONE;
- private:
- class ScopedCommandsExecutor;
- // ThreadGroup:
- void UpdateSortKey(TaskSource::Transaction transaction) override;
- void PushTaskSourceAndWakeUpWorkers(
- TransactionWithRegisteredTaskSource transaction_with_task_source)
- override;
- void EnsureEnoughWorkersLockRequired(BaseScopedCommandsExecutor* executor)
- override EXCLUSIVE_LOCKS_REQUIRED(lock_);
- // Updates the minimum priority allowed to run below which tasks should yield,
- // based on task sources in |priority_queue_|.
- void UpdateMinAllowedPriorityLockRequired() EXCLUSIVE_LOCKS_REQUIRED(lock_);
- // Returns the top TaskSource off the |priority_queue_|. Returns nullptr
- // if the |priority_queue_| is empty.
- RegisteredTaskSource GetWork();
- // Indicates whether the thread group has been started yet.
- bool started_ GUARDED_BY(lock_) = false;
- // Number of threadpool work submitted to the thread group which haven't
- // popped a TaskSource from the PriorityQueue yet.
- size_t num_pending_threadpool_work_ GUARDED_BY(lock_) = 0;
- #if DCHECK_IS_ON()
- // Set once JoinForTesting() has returned.
- bool join_for_testing_returned_ = false;
- #endif
- DISALLOW_COPY_AND_ASSIGN(ThreadGroupNative);
- };
- } // namespace internal
- } // namespace base
- #endif // BASE_TASK_THREAD_POOL_THREAD_GROUP_NATIVE_H_
|