Commit 55067f68 authored by Jesse McKenna's avatar Jesse McKenna Committed by Commit Bot

TaskScheduler: List posted Sequences on SchedulerParallelTaskRunner

Bug: 889029
Change-Id: I189f7a33aec070d882712f7360223cdc804b0fbf
Reviewed-on: https://chromium-review.googlesource.com/c/1312929
Commit-Queue: Jesse McKenna <jessemckenna@google.com>
Reviewed-by: default avatarFrançois Doray <fdoray@chromium.org>
Cr-Commit-Position: refs/heads/master@{#605103}
parent bcb53c0c
......@@ -3,6 +3,7 @@
// found in the LICENSE file.
#include "base/task/task_scheduler/scheduler_parallel_task_runner.h"
#include "base/task/task_scheduler/scheduler_task_runner_delegate.h"
#include "base/task/task_scheduler/sequence.h"
......@@ -24,14 +25,27 @@ bool SchedulerParallelTaskRunner::PostDelayedTask(const Location& from_here,
return false;
// Post the task as part of a one-off single-task Sequence.
scoped_refptr<Sequence> sequence = MakeRefCounted<Sequence>(traits_, this);
{
AutoSchedulerLock auto_lock(lock_);
sequences_.insert(sequence.get());
}
return scheduler_task_runner_delegate_->PostTaskWithSequence(
Task(from_here, std::move(closure), delay),
MakeRefCounted<Sequence>(traits_));
Task(from_here, std::move(closure), delay), std::move(sequence));
}
bool SchedulerParallelTaskRunner::RunsTasksInCurrentSequence() const {
return scheduler_task_runner_delegate_->IsRunningPoolWithTraits(traits_);
}
void SchedulerParallelTaskRunner::UnregisterSequence(Sequence* sequence) {
DCHECK(sequence);
AutoSchedulerLock auto_lock(lock_);
sequences_.erase(sequence);
}
} // namespace internal
} // namespace base
......@@ -7,8 +7,9 @@
#include "base/base_export.h"
#include "base/callback_forward.h"
#include "base/containers/flat_set.h"
#include "base/location.h"
#include "base/task/task_scheduler/scheduler_task_runner_delegate.h"
#include "base/task/task_scheduler/scheduler_lock.h"
#include "base/task/task_traits.h"
#include "base/task_runner.h"
#include "base/time/time.h"
......@@ -16,6 +17,9 @@
namespace base {
namespace internal {
class Sequence;
class SchedulerTaskRunnerDelegate;
// A task runner that runs tasks in parallel.
class BASE_EXPORT SchedulerParallelTaskRunner : public TaskRunner {
public:
......@@ -31,12 +35,23 @@ class BASE_EXPORT SchedulerParallelTaskRunner : public TaskRunner {
bool RunsTasksInCurrentSequence() const override;
// Removes |sequence| from |sequences_|.
void UnregisterSequence(Sequence* sequence);
private:
~SchedulerParallelTaskRunner() override;
const TaskTraits traits_;
SchedulerTaskRunnerDelegate* const scheduler_task_runner_delegate_;
// Synchronizes access to |sequences_|.
SchedulerLock lock_;
// List of alive Sequences instantiated by this SchedulerParallelTaskRunner.
// Sequences are added when they are instantiated, and removed when they are
// destroyed.
base::flat_set<Sequence*> sequences_;
DISALLOW_COPY_AND_ASSIGN(SchedulerParallelTaskRunner);
};
......
......@@ -13,7 +13,11 @@
namespace base {
namespace internal {
Sequence::Sequence(const TaskTraits& traits) : traits_(traits) {}
Sequence::Sequence(
const TaskTraits& traits,
scoped_refptr<SchedulerParallelTaskRunner> scheduler_parallel_task_runner)
: traits_(traits),
scheduler_parallel_task_runner_(scheduler_parallel_task_runner) {}
bool Sequence::PushTask(Task task) {
// Use CHECK instead of DCHECK to crash earlier. See http://crbug.com/711167
......@@ -64,7 +68,11 @@ SequenceSortKey Sequence::GetSortKey() const {
return SequenceSortKey(traits_.priority(), next_task_sequenced_time);
}
Sequence::~Sequence() = default;
Sequence::~Sequence() {
if (scheduler_parallel_task_runner_) {
scheduler_parallel_task_runner_->UnregisterSequence(this);
}
}
} // namespace internal
} // namespace base
......@@ -14,6 +14,7 @@
#include "base/optional.h"
#include "base/sequence_token.h"
#include "base/task/task_scheduler/scheduler_lock.h"
#include "base/task/task_scheduler/scheduler_parallel_task_runner.h"
#include "base/task/task_scheduler/sequence_sort_key.h"
#include "base/task/task_scheduler/task.h"
#include "base/task/task_traits.h"
......@@ -43,7 +44,11 @@ namespace internal {
class BASE_EXPORT Sequence : public RefCountedThreadSafe<Sequence> {
public:
// |traits| is metadata that applies to all Tasks in the Sequence.
explicit Sequence(const TaskTraits& traits);
// |scheduler_parallel_task_runner| is a reference to the
// SchedulerParallelTaskRunner that created this Sequence, if any.
Sequence(const TaskTraits& traits,
scoped_refptr<SchedulerParallelTaskRunner>
scheduler_parallel_task_runner = nullptr);
// Adds |task| in a new slot at the end of the Sequence. Returns true if the
// Sequence was empty before this operation.
......@@ -97,6 +102,12 @@ class BASE_EXPORT Sequence : public RefCountedThreadSafe<Sequence> {
// The TaskTraits of all Tasks in the Sequence.
const TaskTraits traits_;
// A reference to the SchedulerParallelTaskRunner that created this Sequence,
// if any. Used to remove Sequence from the TaskRunner's list of Sequence
// references when Sequence is deleted.
const scoped_refptr<SchedulerParallelTaskRunner>
scheduler_parallel_task_runner_;
DISALLOW_COPY_AND_ASSIGN(Sequence);
};
......
......@@ -56,7 +56,7 @@ TEST_F(TaskSchedulerTaskTrackerPosixTest, RunTask) {
Task task(FROM_HERE,
Bind([](bool* did_run) { *did_run = true; }, Unretained(&did_run)),
TimeDelta());
TaskTraits default_traits = {};
constexpr TaskTraits default_traits = {};
EXPECT_TRUE(tracker_.WillPostTask(&task, default_traits.shutdown_behavior()));
......@@ -78,7 +78,7 @@ TEST_F(TaskSchedulerTaskTrackerPosixTest, FileDescriptorWatcher) {
Bind(IgnoreResult(&FileDescriptorWatcher::WatchReadable), fds[0],
DoNothing()),
TimeDelta());
TaskTraits default_traits = {};
constexpr TaskTraits default_traits = {};
// FileDescriptorWatcher::WatchReadable needs a SequencedTaskRunnerHandle.
task.sequenced_task_runner_ref = MakeRefCounted<NullTaskRunner>();
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment