OLD | NEW |
---|---|
1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "platform/scheduler/test/fake_web_task_runner.h" | 5 #include "platform/scheduler/test/fake_web_task_runner.h" |
6 | 6 |
7 #include <deque> | 7 #include <deque> |
8 | 8 |
9 #include "base/callback.h" | 9 #include "base/callback.h" |
10 #include "base/logging.h" | 10 #include "base/logging.h" |
11 #include "base/single_thread_task_runner.h" | 11 #include "base/single_thread_task_runner.h" |
12 #include "wtf/RefCounted.h" | 12 #include "wtf/RefCounted.h" |
13 | 13 |
14 namespace blink { | 14 namespace blink { |
15 namespace scheduler { | 15 namespace scheduler { |
16 | 16 |
17 class FakeWebTaskRunner::Data : public WTF::ThreadSafeRefCounted<Data> { | 17 class FakeWebTaskRunner::Data : public WTF::ThreadSafeRefCounted<Data> { |
18 public: | 18 public: |
19 Data() : time_(0.0) {} | 19 Data() : time_(0.0) {} |
20 | 20 |
21 void PostTask(const base::Closure& task, base::TimeDelta delay) { | |
22 task_queue_.push_back(std::make_pair(task, time_ + delay.InSecondsF())); | |
23 } | |
24 | |
25 using QueueItem = std::pair<base::Closure, double>; | |
26 std::deque<QueueItem>::iterator FindRunnableTask() { | |
27 // TODO(tkent): This should return an item which has the minimum |second|. | |
28 return std::find_if( | |
29 task_queue_.begin(), task_queue_.end(), | |
30 [&](const QueueItem& item) { return item.second <= time_; }); | |
31 } | |
32 | |
21 scoped_refptr<base::SingleThreadTaskRunner> task_runner_; | 33 scoped_refptr<base::SingleThreadTaskRunner> task_runner_; |
22 std::deque<base::Closure> task_queue_; | 34 std::deque<QueueItem> task_queue_; |
23 double time_; | 35 double time_; |
24 | 36 |
25 private: | 37 private: |
26 ~Data() {} | 38 ~Data() {} |
27 | 39 |
28 friend ThreadSafeRefCounted<Data>; | 40 friend ThreadSafeRefCounted<Data>; |
29 DISALLOW_COPY_AND_ASSIGN(Data); | 41 DISALLOW_COPY_AND_ASSIGN(Data); |
30 }; | 42 }; |
31 | 43 |
32 class FakeWebTaskRunner::BaseTaskRunner : public base::SingleThreadTaskRunner { | 44 class FakeWebTaskRunner::BaseTaskRunner : public base::SingleThreadTaskRunner { |
33 public: | 45 public: |
34 explicit BaseTaskRunner(PassRefPtr<Data> data) : data_(std::move(data)) {} | 46 explicit BaseTaskRunner(PassRefPtr<Data> data) : data_(std::move(data)) {} |
35 | 47 |
36 bool PostDelayedTask(const tracked_objects::Location& from_here, | 48 bool PostDelayedTask(const tracked_objects::Location& from_here, |
37 const base::Closure& task, | 49 const base::Closure& task, |
38 base::TimeDelta delay) override { | 50 base::TimeDelta delay) override { |
39 data_->task_queue_.push_back(task); | 51 data_->PostTask(task, delay); |
40 return true; | 52 return true; |
41 } | 53 } |
42 | 54 |
43 bool PostNonNestableDelayedTask(const tracked_objects::Location& from_here, | 55 bool PostNonNestableDelayedTask(const tracked_objects::Location& from_here, |
44 const base::Closure& task, | 56 const base::Closure& task, |
45 base::TimeDelta delay) override { | 57 base::TimeDelta delay) override { |
46 data_->task_queue_.push_back(task); | 58 data_->PostTask(task, delay); |
47 return true; | 59 return true; |
48 } | 60 } |
49 | 61 |
50 bool RunsTasksOnCurrentThread() const { return true; } | 62 bool RunsTasksOnCurrentThread() const { return true; } |
51 | 63 |
52 private: | 64 private: |
53 RefPtr<Data> data_; | 65 RefPtr<Data> data_; |
54 }; | 66 }; |
55 | 67 |
56 FakeWebTaskRunner::FakeWebTaskRunner() | 68 FakeWebTaskRunner::FakeWebTaskRunner() |
57 : data_(adoptRef(new Data)), base_task_runner_(new BaseTaskRunner(data_)) {} | 69 : data_(adoptRef(new Data)), base_task_runner_(new BaseTaskRunner(data_)) {} |
58 | 70 |
59 FakeWebTaskRunner::FakeWebTaskRunner( | 71 FakeWebTaskRunner::FakeWebTaskRunner( |
60 PassRefPtr<Data> data, | 72 PassRefPtr<Data> data, |
61 scoped_refptr<BaseTaskRunner> base_task_runner) | 73 scoped_refptr<BaseTaskRunner> base_task_runner) |
62 : data_(std::move(data)), base_task_runner_(std::move(base_task_runner)) {} | 74 : data_(std::move(data)), base_task_runner_(std::move(base_task_runner)) {} |
63 | 75 |
64 FakeWebTaskRunner::~FakeWebTaskRunner() { | 76 FakeWebTaskRunner::~FakeWebTaskRunner() { |
65 } | 77 } |
66 | 78 |
67 void FakeWebTaskRunner::setTime(double new_time) { | 79 void FakeWebTaskRunner::setTime(double new_time) { |
68 data_->time_ = new_time; | 80 data_->time_ = new_time; |
69 } | 81 } |
70 | 82 |
71 void FakeWebTaskRunner::postDelayedTask(const WebTraceLocation&, | 83 void FakeWebTaskRunner::postDelayedTask(const WebTraceLocation&, |
72 const base::Closure& closure, | 84 const base::Closure& closure, |
73 double) { | 85 double delay_ms) { |
74 data_->task_queue_.push_back(closure); | 86 data_->PostTask(closure, base::TimeDelta::FromMillisecondsD(delay_ms)); |
75 } | 87 } |
76 | 88 |
77 bool FakeWebTaskRunner::runsTasksOnCurrentThread() { | 89 bool FakeWebTaskRunner::runsTasksOnCurrentThread() { |
78 return true; | 90 return true; |
79 } | 91 } |
80 | 92 |
81 double FakeWebTaskRunner::virtualTimeSeconds() const { | 93 double FakeWebTaskRunner::virtualTimeSeconds() const { |
82 return data_->time_; | 94 return data_->time_; |
83 } | 95 } |
84 | 96 |
85 double FakeWebTaskRunner::monotonicallyIncreasingVirtualTimeSeconds() const { | 97 double FakeWebTaskRunner::monotonicallyIncreasingVirtualTimeSeconds() const { |
86 return data_->time_; | 98 return data_->time_; |
87 } | 99 } |
88 | 100 |
89 SingleThreadTaskRunner* FakeWebTaskRunner::toSingleThreadTaskRunner() { | 101 SingleThreadTaskRunner* FakeWebTaskRunner::toSingleThreadTaskRunner() { |
90 return base_task_runner_.get(); | 102 return base_task_runner_.get(); |
91 } | 103 } |
92 | 104 |
93 void FakeWebTaskRunner::runUntilIdle() { | 105 void FakeWebTaskRunner::runUntilIdle() { |
94 while (!data_->task_queue_.empty()) { | 106 while (!data_->task_queue_.empty()) { |
95 // Move the task to run into a local variable in case it touches the | 107 // Move the task to run into a local variable in case it touches the |
96 // task queue by posting a new task. | 108 // task queue by posting a new task. |
97 base::Closure task = std::move(data_->task_queue_.front()); | 109 base::Closure task = std::move(data_->task_queue_.front()).first; |
98 data_->task_queue_.pop_front(); | 110 data_->task_queue_.pop_front(); |
99 task.Run(); | 111 task.Run(); |
100 } | 112 } |
101 } | 113 } |
102 | 114 |
103 std::deque<base::Closure> FakeWebTaskRunner::takePendingTasksForTesting() { | 115 void FakeWebTaskRunner::advanceTimeAndRun(double delta_seconds) { |
116 data_->time_ += delta_seconds; | |
117 for (auto i = data_->FindRunnableTask(); i != data_->task_queue_.end(); | |
yosin_UTC9
2017/03/01 03:21:07
nit: It is better to use "it" or something to avoi
tkent
2017/03/01 05:50:40
Done.
| |
118 i = data_->FindRunnableTask()) { | |
119 base::Closure task = std::move(*i).first; | |
120 data_->task_queue_.erase(i); | |
121 task.Run(); | |
122 } | |
123 } | |
124 | |
125 std::deque<std::pair<base::Closure, double>> | |
126 FakeWebTaskRunner::takePendingTasksForTesting() { | |
104 return std::move(data_->task_queue_); | 127 return std::move(data_->task_queue_); |
105 } | 128 } |
106 | 129 |
107 } // namespace scheduler | 130 } // namespace scheduler |
108 } // namespace blink | 131 } // namespace blink |
OLD | NEW |