Revert "Implement base::GetContinuationTaskRunner()."
This reverts commit 0dd49956177733fd57fa1698e357ee83f6074494.
Reason for revert:
Remove the ability to get the current task runner according to
the recent discussions in scheduler-dev@ [1].
[1] https://docs.google.com/document/d/1tssusPykvx3g0gvbvU4HxGyn3MjJlIylnsH13-Tv6s4/edit
[email protected],[email protected],[email protected]
BUG=1026641
Original change's description:
> Implement base::GetContinuationTaskRunner().
>
> This returns to the current task's task runner. Note there are some
> situations where this is not valid:
>
> * When we're not running a task (it will DCHECK).
> * When we're in a one-off base::ThreadPool task (it will DCHECK).
> * In non-scheduler backed threads (it will DCHECK).
>
> Bug: 835323
> Change-Id: I3a789557247240e0c36a47339574350d79746144
> Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1834094
> Commit-Queue: Gabriel Charette <[email protected]>
> Reviewed-by: Gabriel Charette <[email protected]>
> Reviewed-by: Rohit Rao <[email protected]>
> Reviewed-by: François Doray <[email protected]>
> Cr-Commit-Position: refs/heads/master@{#707484}
[email protected],[email protected],[email protected],[email protected]
# Not skipping CQ checks because original CL landed > 1 day ago.
Bug: 835323
Change-Id: I233ff3ba4e2f20e23a67a3bf6c46734608144eca
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1959917
Reviewed-by: Alexander Timin <[email protected]>
Reviewed-by: Gabriel Charette <[email protected]>
Commit-Queue: Alexander Timin <[email protected]>
Cr-Commit-Position: refs/heads/master@{#728982}
diff --git a/base/task/post_task.cc b/base/task/post_task.cc
index dce2f96..244e5f6 100644
--- a/base/task/post_task.cc
+++ b/base/task/post_task.cc
@@ -146,17 +146,4 @@
}
#endif // defined(OS_WIN)
-const scoped_refptr<SequencedTaskRunner>& GetContinuationTaskRunner() {
- TaskExecutor* executor = GetTaskExecutorForCurrentThread();
- DCHECK(executor) << "Couldn't find a TaskExecutor for this thread. Note "
- "you can't use base::GetContinuationTaskRunner in "
- "a one-off base::ThreadPool task.";
- const auto& task_runner = executor->GetContinuationTaskRunner();
- DCHECK(task_runner)
- << "The current execution context lacks a continuation task runner. "
- "Note: you can't use base::GetContinuationTaskRunner() from a native "
- "system event or any other context outside of a Chrome task.";
- return task_runner;
-}
-
} // namespace base
diff --git a/base/task/post_task.h b/base/task/post_task.h
index 3de95ec..4579cbff 100644
--- a/base/task/post_task.h
+++ b/base/task/post_task.h
@@ -51,13 +51,6 @@
// task_runner->PostTask(FROM_HERE, BindOnce(...));
// task_runner->PostTask(FROM_HERE, BindOnce(...));
//
-// To post a task on the current thread or sequence but with an explicit
-// priority:
-// PostTask(FROM_HERE,
-// {CurrentThread(), TaskPriority::BEST_EFFORT},
-// BindOnce(...));
-//
-//
// The default traits apply to tasks that:
// (1) don't block (ref. MayBlock() and WithBaseSyncPrimitives()),
// (2) prefer inheriting the current priority to specifying their own, and
@@ -239,15 +232,6 @@
SingleThreadTaskRunnerThreadMode::SHARED);
#endif // defined(OS_WIN)
-// Returns: The SequencedTaskRunner for the currently executing task, if any.
-// Otherwise it returns a null scoped_refptr. On threads where there's no
-// TaskExecutor registered this will DCHECK e.g. in a one-off ThreadPool task.
-//
-// Experimental: Further discussions are in progress for this API. Please
-// continue using SequencedTaskRunnerHandle::Get() in the mean time.
-BASE_EXPORT const scoped_refptr<SequencedTaskRunner>&
-GetContinuationTaskRunner();
-
// Helpers to send a Delete/ReleaseSoon to a new SequencedTaskRunner created
// from |traits|. The semantics match base::PostTask in that the deletion is
// guaranteed to be scheduled in order with other tasks using the same |traits|.
diff --git a/base/task/post_task_unittest.cc b/base/task/post_task_unittest.cc
index c1c9ac90..2130a8f 100644
--- a/base/task/post_task_unittest.cc
+++ b/base/task/post_task_unittest.cc
@@ -73,9 +73,6 @@
SingleThreadTaskRunnerThreadMode thread_mode));
#endif // defined(OS_WIN)
- MOCK_METHOD0(GetContinuationTaskRunner,
- const scoped_refptr<SequencedTaskRunner>&());
-
TestSimpleTaskRunner* runner() const { return runner_.get(); }
private:
@@ -282,49 +279,6 @@
run_loop.Run();
}
-TEST_F(PostTaskTestWithExecutor, TaskRunnerTaskGetContinuationTaskRunner) {
- auto task_runner = CreateTaskRunner({ThreadPool()});
- RunLoop run_loop;
-
- EXPECT_TRUE(task_runner->PostTask(FROM_HERE, BindLambdaForTesting([&]() {
- // GetContinuationTaskRunner is
- // meaningless in this context.
- EXPECT_DCHECK_DEATH(
- GetContinuationTaskRunner());
- run_loop.Quit();
- })));
-
- run_loop.Run();
-}
-
-TEST_F(PostTaskTestWithExecutor,
- SequencedTaskRunnerTaskGetContinuationTaskRunner) {
- auto sequenced_task_runner = CreateSequencedTaskRunner({ThreadPool()});
- RunLoop run_loop;
-
- EXPECT_TRUE(sequenced_task_runner->PostTask(
- FROM_HERE, BindLambdaForTesting([&]() {
- EXPECT_EQ(GetContinuationTaskRunner(), sequenced_task_runner);
- run_loop.Quit();
- })));
-
- run_loop.Run();
-}
-
-TEST_F(PostTaskTestWithExecutor,
- SingleThreadTaskRunnerTaskGetContinuationTaskRunner) {
- auto single_thread_task_runner = CreateSingleThreadTaskRunner({ThreadPool()});
- RunLoop run_loop;
-
- EXPECT_TRUE(single_thread_task_runner->PostTask(
- FROM_HERE, BindLambdaForTesting([&]() {
- EXPECT_EQ(GetContinuationTaskRunner(), single_thread_task_runner);
- run_loop.Quit();
- })));
-
- run_loop.Run();
-}
-
TEST_F(PostTaskTestWithExecutor, ThreadPoolCurrentThreadChangePriority) {
auto single_thread_task_runner =
CreateSingleThreadTaskRunner({ThreadPool(), TaskPriority::USER_BLOCKING});
diff --git a/base/task/sequence_manager/sequence_manager.h b/base/task/sequence_manager/sequence_manager.h
index 13cebbb..9710bf8f 100644
--- a/base/task/sequence_manager/sequence_manager.h
+++ b/base/task/sequence_manager/sequence_manager.h
@@ -144,8 +144,7 @@
// Returns the task runner the current task was posted on. Returns null if no
// task is currently running. Must be called on the bound thread.
- virtual const scoped_refptr<SequencedTaskRunner>&
- GetTaskRunnerForCurrentTask() = 0;
+ virtual scoped_refptr<SequencedTaskRunner> GetTaskRunnerForCurrentTask() = 0;
// Finishes the initialization for a SequenceManager created via
// CreateUnboundSequenceManager(). Must not be called in any other
diff --git a/base/task/sequence_manager/sequence_manager_impl.cc b/base/task/sequence_manager/sequence_manager_impl.cc
index 616944f..fcdb8d1 100644
--- a/base/task/sequence_manager/sequence_manager_impl.cc
+++ b/base/task/sequence_manager/sequence_manager_impl.cc
@@ -42,12 +42,6 @@
return lazy_tls_ptr.get();
}
-const scoped_refptr<SequencedTaskRunner>& GetNullTaskRunner() {
- static const base::NoDestructor<scoped_refptr<SequencedTaskRunner>>
- null_task_runner;
- return *null_task_runner;
-}
-
} // namespace
// This controls how big the the initial for
@@ -340,11 +334,11 @@
BindToMessagePump(std::move(pump));
}
-const scoped_refptr<SequencedTaskRunner>&
+scoped_refptr<SequencedTaskRunner>
SequenceManagerImpl::GetTaskRunnerForCurrentTask() {
DCHECK_CALLED_ON_VALID_THREAD(associated_thread_->thread_checker);
if (main_thread_only().task_execution_stack.empty())
- return GetNullTaskRunner();
+ return nullptr;
return main_thread_only()
.task_execution_stack.back()
.pending_task.task_runner;
diff --git a/base/task/sequence_manager/sequence_manager_impl.h b/base/task/sequence_manager/sequence_manager_impl.h
index bd3babc..37141b7 100644
--- a/base/task/sequence_manager/sequence_manager_impl.h
+++ b/base/task/sequence_manager/sequence_manager_impl.h
@@ -102,8 +102,7 @@
// SequenceManager implementation:
void BindToCurrentThread() override;
- const scoped_refptr<SequencedTaskRunner>& GetTaskRunnerForCurrentTask()
- override;
+ scoped_refptr<SequencedTaskRunner> GetTaskRunnerForCurrentTask() override;
void BindToMessagePump(std::unique_ptr<MessagePump> message_pump) override;
void SetObserver(Observer* observer) override;
void AddTaskTimeObserver(TaskTimeObserver* task_time_observer) override;
diff --git a/base/task/simple_task_executor.cc b/base/task/simple_task_executor.cc
index c4d7d2f..ffccf52 100644
--- a/base/task/simple_task_executor.cc
+++ b/base/task/simple_task_executor.cc
@@ -4,16 +4,11 @@
#include "base/task/simple_task_executor.h"
-#include "base/task/sequence_manager/sequence_manager.h"
-
namespace base {
SimpleTaskExecutor::SimpleTaskExecutor(
- sequence_manager::SequenceManager* sequence_manager,
scoped_refptr<SingleThreadTaskRunner> task_queue)
- : sequence_manager_(sequence_manager),
- sequenced_task_queue_(task_queue),
- task_queue_(std::move(task_queue)),
+ : task_queue_(std::move(task_queue)),
previous_task_executor_(GetTaskExecutorForCurrentThread()) {
DCHECK(task_queue_);
// The TaskExecutor API does not expect nesting, but this can happen in tests
@@ -43,7 +38,7 @@
scoped_refptr<SequencedTaskRunner>
SimpleTaskExecutor::CreateSequencedTaskRunner(const TaskTraits& traits) {
- return sequenced_task_queue_;
+ return task_queue_;
}
scoped_refptr<SingleThreadTaskRunner>
@@ -64,11 +59,4 @@
}
#endif // defined(OS_WIN)
-const scoped_refptr<SequencedTaskRunner>&
-SimpleTaskExecutor::GetContinuationTaskRunner() {
- if (sequence_manager_)
- return sequence_manager_->GetTaskRunnerForCurrentTask();
- return sequenced_task_queue_;
-}
-
} // namespace base
diff --git a/base/task/simple_task_executor.h b/base/task/simple_task_executor.h
index be6531f..7d9a74dc 100644
--- a/base/task/simple_task_executor.h
+++ b/base/task/simple_task_executor.h
@@ -9,19 +9,13 @@
#include "build/build_config.h"
namespace base {
-namespace sequence_manager {
-class SequenceManager;
-} // namespace sequence_manager
// A simple TaskExecutor with exactly one SingleThreadTaskRunner.
// Must be instantiated and destroyed on the thread that runs tasks for the
// SingleThreadTaskRunner.
class BASE_EXPORT SimpleTaskExecutor : public TaskExecutor {
public:
- // If |sequence_manager| is null, GetContinuationTaskRunner will always return
- // |task_queue| even if no task is running.
- SimpleTaskExecutor(sequence_manager::SequenceManager* sequence_manager,
- scoped_refptr<SingleThreadTaskRunner> task_queue);
+ explicit SimpleTaskExecutor(scoped_refptr<SingleThreadTaskRunner> task_queue);
~SimpleTaskExecutor() override;
@@ -45,12 +39,7 @@
SingleThreadTaskRunnerThreadMode thread_mode) override;
#endif // defined(OS_WIN)
- const scoped_refptr<SequencedTaskRunner>& GetContinuationTaskRunner()
- override;
-
- protected:
- sequence_manager::SequenceManager* const sequence_manager_;
- const scoped_refptr<SequencedTaskRunner> sequenced_task_queue_;
+ private:
const scoped_refptr<SingleThreadTaskRunner> task_queue_;
// In tests there may already be a TaskExecutor registered for the thread, we
diff --git a/base/task/single_thread_task_executor.cc b/base/task/single_thread_task_executor.cc
index c88435a..3014bde 100644
--- a/base/task/single_thread_task_executor.cc
+++ b/base/task/single_thread_task_executor.cc
@@ -31,7 +31,7 @@
default_task_queue_(sequence_manager_->CreateTaskQueue(
sequence_manager::TaskQueue::Spec("default_tq"))),
type_(type),
- simple_task_executor_(sequence_manager_.get(), task_runner()) {
+ simple_task_executor_(task_runner()) {
sequence_manager_->SetDefaultTaskRunner(default_task_queue_->task_runner());
sequence_manager_->BindToMessagePump(std::move(pump));
}
diff --git a/base/task/single_thread_task_executor_unittest.cc b/base/task/single_thread_task_executor_unittest.cc
index b69bbf3cb..b64294f 100644
--- a/base/task/single_thread_task_executor_unittest.cc
+++ b/base/task/single_thread_task_executor_unittest.cc
@@ -7,7 +7,6 @@
#include "base/run_loop.h"
#include "base/task/post_task.h"
#include "base/test/bind_test_util.h"
-#include "base/test/gtest_util.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
@@ -56,24 +55,4 @@
{base::CurrentThread(), base::TaskPriority::BEST_EFFORT}));
}
-TEST(SingleThreadTaskExecutorTest, GetContinuationTaskRunner) {
- SingleThreadTaskExecutor single_thread_task_executor;
- RunLoop run_loop;
-
- auto task_runner = CreateSingleThreadTaskRunner({CurrentThread()});
-
- task_runner->PostTask(FROM_HERE, BindLambdaForTesting([&]() {
- EXPECT_EQ(task_runner, GetContinuationTaskRunner());
- run_loop.Quit();
- }));
-
- run_loop.Run();
-}
-
-TEST(SingleThreadTaskExecutorTest, GetCurrentTaskWithNoTaskRunning) {
- SingleThreadTaskExecutor single_thread_task_executor;
-
- EXPECT_DCHECK_DEATH(GetContinuationTaskRunner());
-}
-
} // namespace base
diff --git a/base/task/task_executor.h b/base/task/task_executor.h
index 77debc9..a062fdc 100644
--- a/base/task/task_executor.h
+++ b/base/task/task_executor.h
@@ -63,11 +63,6 @@
const TaskTraits& traits,
SingleThreadTaskRunnerThreadMode thread_mode) = 0;
#endif // defined(OS_WIN)
-
- // Returns the sequence the current task was posted on, if any, or null
- // otherwise (e.g. for parallel tasks).
- virtual const scoped_refptr<SequencedTaskRunner>&
- GetContinuationTaskRunner() = 0;
};
// Register a TaskExecutor with the //base/task/post_task.h API in the current
diff --git a/base/task/thread_pool/task_tracker.cc b/base/task/thread_pool/task_tracker.cc
index a324d21..ea1a9c8 100644
--- a/base/task/thread_pool/task_tracker.cc
+++ b/base/task/thread_pool/task_tracker.cc
@@ -138,20 +138,18 @@
switches::kLogBestEffortTasks);
}
-// Needed for GetContinuationTaskRunner and CurrentThread. This executor lives
-// for the duration of a threadpool task invocation.
+// Needed for PostTaskHere and CurrentThread. This executor lives for the
+// duration of a threadpool task invocation.
class EphemeralTaskExecutor : public TaskExecutor {
public:
// |sequenced_task_runner| and |single_thread_task_runner| must outlive this
- // EphemeralTaskExecutor. Note |single_thread_task_runner| may be null.
- EphemeralTaskExecutor(
- scoped_refptr<SequencedTaskRunner> sequenced_task_runner,
- SingleThreadTaskRunner* single_thread_task_runner,
- const TaskTraits* sequence_traits)
- : sequenced_task_runner_(std::move(sequenced_task_runner)),
+ // EphemeralTaskExecutor.
+ EphemeralTaskExecutor(SequencedTaskRunner* sequenced_task_runner,
+ SingleThreadTaskRunner* single_thread_task_runner,
+ const TaskTraits* sequence_traits)
+ : sequenced_task_runner_(sequenced_task_runner),
single_thread_task_runner_(single_thread_task_runner),
sequence_traits_(sequence_traits) {
- DCHECK(sequenced_task_runner_);
SetTaskExecutorForCurrentThread(this);
}
@@ -197,11 +195,6 @@
}
#endif // defined(OS_WIN)
- const scoped_refptr<SequencedTaskRunner>& GetContinuationTaskRunner()
- override {
- return sequenced_task_runner_;
- }
-
private:
// Currently ignores |traits.priority()|.
void CheckTraitsCompatibleWithSequenceTraits(const TaskTraits& traits) {
@@ -218,7 +211,7 @@
sequence_traits_->with_base_sync_primitives());
}
- const scoped_refptr<SequencedTaskRunner> sequenced_task_runner_;
+ SequencedTaskRunner* const sequenced_task_runner_;
SingleThreadTaskRunner* const single_thread_task_runner_;
const TaskTraits* const sequence_traits_;
};
diff --git a/base/task/thread_pool/thread_pool_impl.cc b/base/task/thread_pool/thread_pool_impl.cc
index 7e49ee8..a56552a 100644
--- a/base/task/thread_pool/thread_pool_impl.cc
+++ b/base/task/thread_pool/thread_pool_impl.cc
@@ -61,12 +61,6 @@
switches::kDisableBestEffortTasks);
}
-const scoped_refptr<SequencedTaskRunner>& GetNullTaskRunner() {
- static const NoDestructor<scoped_refptr<SequencedTaskRunner>>
- null_task_runner;
- return *null_task_runner;
-}
-
} // namespace
ThreadPoolImpl::ThreadPoolImpl(StringPiece histogram_label)
@@ -279,14 +273,6 @@
return MakeRefCounted<PooledSequencedTaskRunner>(new_traits, this);
}
-const scoped_refptr<SequencedTaskRunner>&
-ThreadPoolImpl::GetContinuationTaskRunner() {
- // Default to null for parallel tasks; see task_tracker.cc's
- // EphemeralTaskExecutor for how sequenced contexts handle this.
- NOTREACHED();
- return GetNullTaskRunner();
-}
-
Optional<TimeTicks> ThreadPoolImpl::NextScheduledRunTimeForTesting() const {
if (task_tracker_->HasIncompleteTaskSourcesForTesting())
return TimeTicks::Now();
diff --git a/base/task/thread_pool/thread_pool_impl.h b/base/task/thread_pool/thread_pool_impl.h
index b4cfc49ac..82c76a2 100644
--- a/base/task/thread_pool/thread_pool_impl.h
+++ b/base/task/thread_pool/thread_pool_impl.h
@@ -100,8 +100,6 @@
const TaskTraits& traits,
SingleThreadTaskRunnerThreadMode thread_mode) override;
#endif // defined(OS_WIN)
- const scoped_refptr<SequencedTaskRunner>& GetContinuationTaskRunner()
- override;
scoped_refptr<UpdateableSequencedTaskRunner>
CreateUpdateableSequencedTaskRunner(const TaskTraits& traits);
diff --git a/base/test/task_environment.cc b/base/test/task_environment.cc
index 80a85e2..2f730e6 100644
--- a/base/test/task_environment.cc
+++ b/base/test/task_environment.cc
@@ -403,8 +403,7 @@
.SetTimeDomain(mock_time_domain_.get()));
task_runner_ = task_queue_->task_runner();
sequence_manager_->SetDefaultTaskRunner(task_runner_);
- simple_task_executor_ = std::make_unique<SimpleTaskExecutor>(
- sequence_manager_.get(), task_runner_);
+ simple_task_executor_ = std::make_unique<SimpleTaskExecutor>(task_runner_);
CHECK(base::ThreadTaskRunnerHandle::IsSet())
<< "ThreadTaskRunnerHandle should've been set now.";
CompleteInitialization();
diff --git a/base/test/task_environment.h b/base/test/task_environment.h
index daae7d6c..01d19d9 100644
--- a/base/test/task_environment.h
+++ b/base/test/task_environment.h
@@ -36,7 +36,7 @@
// This header exposes SingleThreadTaskEnvironment and TaskEnvironment.
//
// SingleThreadTaskEnvironment enables the following APIs within its scope:
-// - ThreadTaskRunnerHandle & GetContinuationTaskRunner on the main thread
+// - (Thread|Sequenced)TaskRunnerHandle on the main thread
// - RunLoop on the main thread
//
// TaskEnvironment additionally enables:
@@ -47,7 +47,7 @@
// Tests should prefer SingleThreadTaskEnvironment over TaskEnvironment when the
// former is sufficient.
//
-// Tasks posted to the APIs listed above run synchronously when
+// Tasks posted to the (Thread|Sequenced)TaskRunnerHandle run synchronously when
// RunLoop::Run(UntilIdle) or TaskEnvironment::RunUntilIdle is called on the
// main thread.
//
@@ -185,7 +185,7 @@
trait_helpers::NotATraitTag()) {}
// Waits until no undelayed ThreadPool tasks remain. Then, unregisters the
- // ThreadPoolInstance and the APIs listed in the top level comment.
+ // ThreadPoolInstance and the (Thread|Sequenced)TaskRunnerHandle.
virtual ~TaskEnvironment();
// Returns a TaskRunner that schedules tasks on the main thread.
@@ -195,11 +195,11 @@
// always return true if called right after RunUntilIdle.
bool MainThreadIsIdle() const;
- // Runs tasks until both the APIs listed in the top level comment and the
- // ThreadPool's non-delayed queues are empty. While RunUntilIdle() is quite
- // practical and sometimes even necessary -- for example, to flush all tasks
- // bound to Unretained() state before destroying test members -- it should be
- // used with caution per the following warnings:
+ // Runs tasks until both the (Thread|Sequenced)TaskRunnerHandle and the
+ // ThreadPool's non-delayed queues are empty.
+ // While RunUntilIdle() is quite practical and sometimes even necessary -- for
+ // example, to flush all tasks bound to Unretained() state before destroying
+ // test members -- it should be used with caution per the following warnings:
//
// WARNING #1: This may run long (flakily timeout) and even never return! Do
// not use this when repeating tasks such as animated web pages
diff --git a/base/test/task_environment_unittest.cc b/base/test/task_environment_unittest.cc
index 03b35465..e6a929e 100644
--- a/base/test/task_environment_unittest.cc
+++ b/base/test/task_environment_unittest.cc
@@ -1199,23 +1199,5 @@
run_loop.Run();
}
-TEST_F(TaskEnvironmentTest, GetContinuationTaskRunner) {
- SingleThreadTaskEnvironment task_environment;
- RunLoop run_loop;
- auto task_runner = CreateSingleThreadTaskRunner({CurrentThread()});
-
- task_runner->PostTask(FROM_HERE, BindLambdaForTesting([&]() {
- EXPECT_EQ(task_runner, GetContinuationTaskRunner());
- run_loop.Quit();
- }));
-
- run_loop.Run();
-}
-
-TEST_F(TaskEnvironmentTest, GetContinuationTaskRunnerWithNoTaskRunning) {
- SingleThreadTaskEnvironment task_environment;
- EXPECT_DCHECK_DEATH(GetContinuationTaskRunner());
-}
-
} // namespace test
} // namespace base
diff --git a/base/threading/thread.cc b/base/threading/thread.cc
index 093d8842..eecd3491 100644
--- a/base/threading/thread.cc
+++ b/base/threading/thread.cc
@@ -87,8 +87,7 @@
sequence_manager_->BindToMessagePump(
std::move(message_pump_factory_).Run());
sequence_manager_->SetTimerSlack(timer_slack);
- simple_task_executor_.emplace(sequence_manager_.get(),
- GetDefaultTaskRunner());
+ simple_task_executor_.emplace(GetDefaultTaskRunner());
}
private:
diff --git a/content/browser/scheduler/browser_io_thread_delegate.cc b/content/browser/scheduler/browser_io_thread_delegate.cc
index 5f13084..cac4e866 100644
--- a/content/browser/scheduler/browser_io_thread_delegate.cc
+++ b/content/browser/scheduler/browser_io_thread_delegate.cc
@@ -112,10 +112,4 @@
}
}
-const scoped_refptr<base::SequencedTaskRunner>&
-BrowserIOThreadDelegate::GetTaskRunnerForCurrentTask() const {
- DCHECK(sequence_manager_);
- return sequence_manager_->GetTaskRunnerForCurrentTask();
-}
-
} // namespace content
diff --git a/content/browser/scheduler/browser_io_thread_delegate.h b/content/browser/scheduler/browser_io_thread_delegate.h
index 69699369..0954c5e 100644
--- a/content/browser/scheduler/browser_io_thread_delegate.h
+++ b/content/browser/scheduler/browser_io_thread_delegate.h
@@ -55,10 +55,6 @@
scoped_refptr<Handle> GetHandle() { return task_queues_->GetHandle(); }
- // Must be called on the IO thread.
- const scoped_refptr<base::SequencedTaskRunner>& GetTaskRunnerForCurrentTask()
- const;
-
private:
class TLSMultiplexer;
diff --git a/content/browser/scheduler/browser_task_executor.cc b/content/browser/scheduler/browser_task_executor.cc
index 3f8a9f2..ec6b138 100644
--- a/content/browser/scheduler/browser_task_executor.cc
+++ b/content/browser/scheduler/browser_task_executor.cc
@@ -65,12 +65,6 @@
}
}
-const scoped_refptr<base::SequencedTaskRunner>& GetNullTaskRunner() {
- static const base::NoDestructor<scoped_refptr<base::SequencedTaskRunner>>
- null_task_runner;
- return *null_task_runner;
-}
-
} // namespace
BaseBrowserTaskExecutor::BaseBrowserTaskExecutor() = default;
@@ -398,13 +392,6 @@
return BrowserThread::UI;
}
-const scoped_refptr<base::SequencedTaskRunner>&
-BrowserTaskExecutor::GetContinuationTaskRunner() {
- NOTREACHED()
- << "Should have been routed to UIThreadExecutor or IOThreadExecutor";
- return GetNullTaskRunner();
-}
-
BrowserTaskExecutor::UIThreadExecutor::UIThreadExecutor(
std::unique_ptr<BrowserUIThreadScheduler> browser_ui_thread_scheduler)
: browser_ui_thread_scheduler_(std::move(browser_ui_thread_scheduler)) {
@@ -436,11 +423,6 @@
return BrowserThread::UI;
}
-const scoped_refptr<base::SequencedTaskRunner>&
-BrowserTaskExecutor::UIThreadExecutor::GetContinuationTaskRunner() {
- return browser_ui_thread_scheduler_->GetTaskRunnerForCurrentTask();
-}
-
BrowserTaskExecutor::IOThreadExecutor::IOThreadExecutor(
std::unique_ptr<BrowserIOThreadDelegate> browser_io_thread_delegate)
: browser_io_thread_delegate_(std::move(browser_io_thread_delegate)) {
@@ -468,10 +450,4 @@
return BrowserThread::IO;
}
-const scoped_refptr<base::SequencedTaskRunner>&
-BrowserTaskExecutor::IOThreadExecutor::GetContinuationTaskRunner() {
- DCHECK(browser_io_thread_delegate_);
- return browser_io_thread_delegate_->GetTaskRunnerForCurrentTask();
-}
-
} // namespace content
diff --git a/content/browser/scheduler/browser_task_executor.h b/content/browser/scheduler/browser_task_executor.h
index af97160..65ec34c2 100644
--- a/content/browser/scheduler/browser_task_executor.h
+++ b/content/browser/scheduler/browser_task_executor.h
@@ -173,10 +173,6 @@
BrowserTaskQueues::Validator* validator);
#endif // DCHECK_IS_ON()
- // base::TaskExecutor implementation.
- const scoped_refptr<base::SequencedTaskRunner>& GetContinuationTaskRunner()
- override;
-
private:
friend class BrowserIOThreadDelegate;
friend class BrowserTaskExecutorTest;
@@ -190,10 +186,6 @@
~UIThreadExecutor() override;
- // base::TaskExecutor implementation.
- const scoped_refptr<base::SequencedTaskRunner>& GetContinuationTaskRunner()
- override;
-
scoped_refptr<BrowserUIThreadScheduler::Handle> GetUIThreadHandle();
void SetIOThreadHandle(
@@ -217,10 +209,6 @@
~IOThreadExecutor() override;
- // base::TaskExecutor implementation.
- const scoped_refptr<base::SequencedTaskRunner>& GetContinuationTaskRunner()
- override;
-
scoped_refptr<BrowserUIThreadScheduler::Handle> GetIOThreadHandle();
void SetUIThreadHandle(
diff --git a/content/browser/scheduler/browser_task_executor_unittest.cc b/content/browser/scheduler/browser_task_executor_unittest.cc
index 5dbac91..9ef50ad 100644
--- a/content/browser/scheduler/browser_task_executor_unittest.cc
+++ b/content/browser/scheduler/browser_task_executor_unittest.cc
@@ -15,7 +15,6 @@
#include "base/task/task_traits.h"
#include "base/task/thread_pool/thread_pool_instance.h"
#include "base/test/bind_test_util.h"
-#include "base/test/gtest_util.h"
#include "base/test/mock_callback.h"
#include "base/test/task_environment.h"
#include "base/threading/thread_task_runner_handle.h"
@@ -133,14 +132,6 @@
NOTREACHED();
return BrowserThread::UI;
}
-
- const scoped_refptr<base::SequencedTaskRunner>& GetContinuationTaskRunner()
- override {
- return dummy_;
- }
-
- private:
- scoped_refptr<base::SequencedTaskRunner> dummy_;
};
template <BrowserThread::ID ID>
@@ -319,35 +310,4 @@
{base::CurrentThread(), BrowserTaskType::kNavigation}));
}
-TEST_F(BrowserTaskExecutorTest, GetContinuationTaskRunner) {
- // Ensure task queue priorities are set.
- BrowserTaskExecutor::PostFeatureListSetup();
- std::vector<int> order;
- base::RunLoop run_loop;
-
- auto task1 = base::BindLambdaForTesting([&]() {
- order.push_back(1);
- run_loop.Quit();
- });
- auto task2 = base::BindLambdaForTesting([&]() { order.push_back(2); });
- auto task3 = base::BindLambdaForTesting([&]() { order.push_back(3); });
-
- base::PostTask(FROM_HERE, {BrowserThread::UI}, task1);
-
- // Post a bootstrap task whose continuation tasks should run before |task1|.
- base::PostTask(
- FROM_HERE, {BrowserThread::UI, BrowserTaskType::kBootstrap},
- base::BindLambdaForTesting([&]() {
- base::GetContinuationTaskRunner()->PostTask(FROM_HERE, task2);
- base::GetContinuationTaskRunner()->PostTask(FROM_HERE, task3);
- }));
-
- run_loop.Run();
- EXPECT_THAT(order, ElementsAre(2, 3, 1));
-}
-
-TEST_F(BrowserTaskExecutorTest, GetContinuationTaskRunnerWithNoTaskExecuting) {
- EXPECT_DCHECK_DEATH(base::GetContinuationTaskRunner());
-}
-
} // namespace content
diff --git a/content/browser/scheduler/browser_ui_thread_scheduler.cc b/content/browser/scheduler/browser_ui_thread_scheduler.cc
index 81d6a51..0925f8f 100644
--- a/content/browser/scheduler/browser_ui_thread_scheduler.cc
+++ b/content/browser/scheduler/browser_ui_thread_scheduler.cc
@@ -63,14 +63,7 @@
void BrowserUIThreadScheduler::CommonSequenceManagerSetup(
base::sequence_manager::SequenceManager* sequence_manager) {
- sequence_manager_ = sequence_manager;
- sequence_manager_->EnableCrashKeys("ui_scheduler_async_stack");
-}
-
-const scoped_refptr<base::SequencedTaskRunner>&
-BrowserUIThreadScheduler::GetTaskRunnerForCurrentTask() const {
- DCHECK(sequence_manager_);
- return sequence_manager_->GetTaskRunnerForCurrentTask();
+ sequence_manager->EnableCrashKeys("ui_scheduler_async_stack");
}
} // namespace content
diff --git a/content/browser/scheduler/browser_ui_thread_scheduler.h b/content/browser/scheduler/browser_ui_thread_scheduler.h
index 88a3e14e..45a7d31 100644
--- a/content/browser/scheduler/browser_ui_thread_scheduler.h
+++ b/content/browser/scheduler/browser_ui_thread_scheduler.h
@@ -40,10 +40,6 @@
scoped_refptr<Handle> GetHandle() const { return handle_; }
- // Must be called on the UI thread.
- const scoped_refptr<base::SequencedTaskRunner>& GetTaskRunnerForCurrentTask()
- const;
-
private:
friend class BrowserTaskExecutor;
@@ -59,7 +55,6 @@
std::unique_ptr<base::sequence_manager::SequenceManager>
owned_sequence_manager_;
- base::sequence_manager::SequenceManager* sequence_manager_ = nullptr;
BrowserTaskQueues task_queues_;
scoped_refptr<Handle> handle_;
diff --git a/content/public/test/browser_task_environment_unittest.cc b/content/public/test/browser_task_environment_unittest.cc
index 854221d..cca1c2c 100644
--- a/content/public/test/browser_task_environment_unittest.cc
+++ b/content/public/test/browser_task_environment_unittest.cc
@@ -11,15 +11,12 @@
#include "base/synchronization/waitable_event.h"
#include "base/task/post_task.h"
#include "base/test/bind_test_util.h"
-#include "base/test/gtest_util.h"
#include "content/public/browser/browser_task_traits.h"
#include "content/public/browser/browser_thread.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
using base::test::TaskEnvironment;
-using ::testing::IsNull;
-using ::testing::NotNull;
namespace content {
@@ -226,37 +223,4 @@
run_loop.Run();
}
-TEST(BrowserTaskEnvironmentTest, GetCurrentTaskWithNoTaskRunning) {
- BrowserTaskEnvironment task_environment;
- EXPECT_DCHECK_DEATH(base::GetContinuationTaskRunner());
-}
-
-TEST(BrowserTaskEnvironmentTest, GetContinuationTaskRunnerUI) {
- BrowserTaskEnvironment task_environment;
- base::RunLoop run_loop;
- auto ui_task_runner = base::CreateSingleThreadTaskRunner({BrowserThread::UI});
-
- ui_task_runner->PostTask(FROM_HERE, base::BindLambdaForTesting([&]() {
- EXPECT_EQ(ui_task_runner,
- base::GetContinuationTaskRunner());
- run_loop.Quit();
- }));
-
- run_loop.Run();
-}
-
-TEST(BrowserTaskEnvironmentTest, GetContinuationTaskRunnerIO) {
- BrowserTaskEnvironment task_environment;
- base::RunLoop run_loop;
- auto io_task_runner = base::CreateSingleThreadTaskRunner({BrowserThread::IO});
-
- io_task_runner->PostTask(FROM_HERE, base::BindLambdaForTesting([&]() {
- EXPECT_EQ(io_task_runner,
- base::GetContinuationTaskRunner());
- run_loop.Quit();
- }));
-
- run_loop.Run();
-}
-
} // namespace content
diff --git a/docs/threading_and_tasks.md b/docs/threading_and_tasks.md
index bb1a725..5a705c2c 100644
--- a/docs/threading_and_tasks.md
+++ b/docs/threading_and_tasks.md
@@ -376,6 +376,28 @@
threads](#prefer-sequences-to-physical-threads) and that this thus should rarely
be necessary.
+### Posting to the Current Thread
+
+*** note
+**IMPORTANT:** To post a task that needs mutual exclusion with the current
+sequence of tasks but doesn’t absolutely need to run on the current physical thread,
+use `base::SequencedTaskRunnerHandle::Get()` instead of
+`base::ThreadTaskRunnerHandle::Get()` (ref. [Posting to the Current
+Sequence](#Posting-to-the-Current-Virtual_Thread)). That will better document the
+requirements of the posted task and will avoid unnecessarily making your API
+physical thread-affine. In a single-thread task, `base::SequencedTaskRunnerHandle::Get()`
+is equivalent to `base::ThreadTaskRunnerHandle::Get()`.
+***
+
+If you must post a task to the current physical thread nonetheless, use
+[`base::ThreadTaskRunnerHandle`](https://cs.chromium.org/chromium/src/base/threading/thread_task_runner_handle.h).
+
+```cpp
+// The task will run on the current thread in the future.
+base::ThreadTaskRunnerHandle::Get()->PostTask(
+ FROM_HERE, base::BindOnce(&Task));
+```
+
## Posting Tasks to a COM Single-Thread Apartment (STA) Thread (Windows)
Tasks that need to run on a COM Single-Thread Apartment (STA) thread must be
diff --git a/ios/web/web_thread_impl.cc b/ios/web/web_thread_impl.cc
index 8e35fb9..f7cbf99a 100644
--- a/ios/web/web_thread_impl.cc
+++ b/ios/web/web_thread_impl.cc
@@ -13,7 +13,6 @@
#include "base/compiler_specific.h"
#include "base/lazy_instance.h"
#include "base/macros.h"
-#include "base/no_destructor.h"
#include "base/run_loop.h"
#include "base/single_thread_task_runner.h"
#include "base/task/post_task.h"
@@ -145,13 +144,6 @@
return accepting_tasks;
}
-const scoped_refptr<base::SequencedTaskRunner>& GetNullTaskRunner() {
- static const base::NoDestructor<scoped_refptr<base::SequencedTaskRunner>>
- null_task_runner;
- return *null_task_runner;
-}
-
-// Task executor for UI and IO threads.
class WebThreadTaskExecutor : public base::TaskExecutor {
public:
WebThreadTaskExecutor() {}
@@ -185,22 +177,12 @@
return GetTaskRunnerForThread(GetWebThreadIdentifier(traits));
}
- const scoped_refptr<base::SequencedTaskRunner>& GetContinuationTaskRunner()
- override {
- NOTREACHED() << "WebThreadTaskExecutor isn't registered via "
- "base::SetTaskExecutorForCurrentThread";
- return GetNullTaskRunner();
- }
-
private:
WebThread::ID GetWebThreadIdentifier(const base::TaskTraits& traits) {
DCHECK_EQ(traits.extension_id(), WebTaskTraitsExtension::kExtensionId);
WebThread::ID id =
traits.GetExtension<WebTaskTraitsExtension>().web_thread();
DCHECK_LT(id, WebThread::ID_COUNT);
- DCHECK(!traits.use_current_thread())
- << "WebThreadTaskExecutor isn't registered via "
- "base::SetTaskExecutorForCurrentThread";
// TODO(crbug.com/872372): Support shutdown behavior on UI/IO threads.
if (traits.shutdown_behavior_set_explicitly()) {
@@ -235,13 +217,6 @@
: identifier_(identifier) {
DCHECK(task_runner);
- if (identifier == WebThread::UI) {
- DCHECK(task_runner->BelongsToCurrentThread());
- // TODO(scheduler-dev): Pass the backing SequenceManager in here to ensure
- // GetContinuationTaskRunner DCHECKS when there's no task running.
- ui_thread_tls_executor_.emplace(nullptr, task_runner);
- }
-
WebThreadGlobals& globals = g_globals.Get();
base::AutoLock lock(globals.lock);
diff --git a/ios/web/web_thread_impl.h b/ios/web/web_thread_impl.h
index 51df75bd..401dc2f6 100644
--- a/ios/web/web_thread_impl.h
+++ b/ios/web/web_thread_impl.h
@@ -7,7 +7,6 @@
#include "base/callback.h"
#include "base/memory/scoped_refptr.h"
-#include "base/task/simple_task_executor.h"
#include "base/threading/thread.h"
#include "ios/web/public/thread/web_thread.h"
@@ -66,10 +65,6 @@
// The identifier of this thread. Only one thread can exist with a given
// identifier at a given time.
ID identifier_;
-
- // Here to support base::CurrentThread and base::GetContinuationTaskRunner on
- // the UI thread.
- base::Optional<base::SimpleTaskExecutor> ui_thread_tls_executor_;
};
} // namespace web
diff --git a/ios/web/web_thread_unittest.cc b/ios/web/web_thread_unittest.cc
index 98b4ca8..13011d811 100644
--- a/ios/web/web_thread_unittest.cc
+++ b/ios/web/web_thread_unittest.cc
@@ -6,16 +6,12 @@
#include "base/bind.h"
#include "base/task/post_task.h"
-#include "base/test/bind_test_util.h"
#include "ios/web/public/test/web_task_environment.h"
#include "ios/web/public/thread/web_task_traits.h"
#include "ios/web/web_thread_impl.h"
-#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "testing/platform_test.h"
-using testing::NotNull;
-
namespace web {
class WebThreadTest : public PlatformTest {
@@ -68,37 +64,4 @@
run_loop.Run();
}
-TEST_F(WebThreadTest, CurrentThread) {
- base::RunLoop run_loop;
-
- base::PostTask(
- FROM_HERE, {base::CurrentThread()}, base::BindLambdaForTesting([&]() {
- PostTask(FROM_HERE, {base::CurrentThread()}, run_loop.QuitClosure());
- }));
-
- run_loop.Run();
-}
-
-TEST_F(WebThreadTest, GetContinuationTaskRunner) {
- base::RunLoop run_loop;
- auto task_runner =
- base::CreateSingleThreadTaskRunner({base::CurrentThread()});
-
- task_runner->PostTask(FROM_HERE, base::BindLambdaForTesting([&]() {
- EXPECT_EQ(task_runner,
- base::GetContinuationTaskRunner());
- run_loop.Quit();
- }));
-
- run_loop.Run();
-}
-
-TEST_F(WebThreadTest, GetContinuationTaskRunnerWithNoTaskRunning) {
- // TODO(scheduler-dev): GetContinuationTaskRunner should DCHECK if there's no
- // task running.
- EXPECT_EQ(base::CreateSequencedTaskRunner({base::CurrentThread()}),
- base::GetContinuationTaskRunner());
- EXPECT_THAT(base::GetContinuationTaskRunner().get(), NotNull());
-}
-
} // namespace web
diff --git a/third_party/blink/renderer/platform/scheduler/common/scheduler_helper.cc b/third_party/blink/renderer/platform/scheduler/common/scheduler_helper.cc
index ef55b44..c751d9c 100644
--- a/third_party/blink/renderer/platform/scheduler/common/scheduler_helper.cc
+++ b/third_party/blink/renderer/platform/scheduler/common/scheduler_helper.cc
@@ -41,7 +41,7 @@
DCHECK(sequence_manager_);
sequence_manager_->SetDefaultTaskRunner(default_task_runner_);
- blink_task_executor_.emplace(default_task_runner_, sequence_manager_);
+ simple_task_executor_.emplace(default_task_runner_);
}
SchedulerHelper::~SchedulerHelper() {
@@ -182,18 +182,5 @@
return false;
}
-SchedulerHelper::BlinkTaskExecutor::BlinkTaskExecutor(
- scoped_refptr<base::SingleThreadTaskRunner> default_task_queue,
- base::sequence_manager::SequenceManager* sequence_manager)
- : base::SimpleTaskExecutor(sequence_manager, std::move(default_task_queue)),
- sequence_manager_(sequence_manager) {}
-
-SchedulerHelper::BlinkTaskExecutor::~BlinkTaskExecutor() = default;
-
-const scoped_refptr<base::SequencedTaskRunner>&
-SchedulerHelper::BlinkTaskExecutor::GetContinuationTaskRunner() {
- return sequence_manager_->GetTaskRunnerForCurrentTask();
-}
-
} // namespace scheduler
} // namespace blink
diff --git a/third_party/blink/renderer/platform/scheduler/common/scheduler_helper.h b/third_party/blink/renderer/platform/scheduler/common/scheduler_helper.h
index 52b84746..3f2267e 100644
--- a/third_party/blink/renderer/platform/scheduler/common/scheduler_helper.h
+++ b/third_party/blink/renderer/platform/scheduler/common/scheduler_helper.h
@@ -130,29 +130,12 @@
private:
friend class SchedulerHelperTest;
- // Like SimpleTaskExecutor except it knows how to get the current task runner
- // from the SequenceManager to implement GetContinuationTaskRunner.
- class BlinkTaskExecutor : public base::SimpleTaskExecutor {
- public:
- BlinkTaskExecutor(
- scoped_refptr<base::SingleThreadTaskRunner> default_task_queue,
- base::sequence_manager::SequenceManager* sequence_manager);
-
- ~BlinkTaskExecutor() override;
-
- // base::TaskExecutor implementation.
- const scoped_refptr<base::SequencedTaskRunner>& GetContinuationTaskRunner()
- override;
-
- private:
- base::sequence_manager::SequenceManager* sequence_manager_; // NOT OWNED
- };
scoped_refptr<base::SingleThreadTaskRunner> default_task_runner_;
Observer* observer_; // NOT OWNED
UkmTaskSampler ukm_task_sampler_;
- base::Optional<BlinkTaskExecutor> blink_task_executor_;
+ base::Optional<base::SimpleTaskExecutor> simple_task_executor_;
DISALLOW_COPY_AND_ASSIGN(SchedulerHelper);
};
diff --git a/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl_unittest.cc b/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl_unittest.cc
index c44eecf..1592325c 100644
--- a/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl_unittest.cc
+++ b/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl_unittest.cc
@@ -18,7 +18,6 @@
#include "base/task/sequence_manager/test/sequence_manager_for_test.h"
#include "base/task/task_executor.h"
#include "base/test/bind_test_util.h"
-#include "base/test/gtest_util.h"
#include "base/test/metrics/histogram_tester.h"
#include "base/test/scoped_feature_list.h"
#include "base/test/simple_test_tick_clock.h"
@@ -47,7 +46,6 @@
// To avoid symbol collisions in jumbo builds.
namespace main_thread_scheduler_impl_unittest {
-using testing::IsNull;
using testing::Mock;
using testing::NotNull;
using InputEventState = WebThreadScheduler::InputEventState;
@@ -2090,25 +2088,6 @@
{base::CurrentThread(), base::TaskPriority::BEST_EFFORT}));
}
-TEST_F(MainThreadSchedulerImplTest, GetContinuationTaskRunner) {
- scoped_refptr<MainThreadTaskQueue> timer_tq = scheduler_->NewTimerTaskQueue(
- MainThreadTaskQueue::QueueType::kFrameThrottleable, nullptr);
- auto task_runner = timer_tq->CreateTaskRunner(TaskType::kJavascriptTimer);
-
- base::RunLoop run_loop;
- task_runner->PostTask(FROM_HERE, base::BindLambdaForTesting([&]() {
- EXPECT_EQ(task_runner,
- base::GetContinuationTaskRunner());
- run_loop.Quit();
- }));
- run_loop.Run();
-}
-
-TEST_F(MainThreadSchedulerImplTest,
- GetContinuationTaskRunnerWithNoTaskRunning) {
- EXPECT_DCHECK_DEATH(base::GetContinuationTaskRunner());
-}
-
TEST_F(MainThreadSchedulerImplTest, TestBeginMainFrameNotExpectedUntil) {
base::TimeDelta ten_millis(base::TimeDelta::FromMilliseconds(10));
base::TimeTicks expected_deadline = Now() + ten_millis;