OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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 "storage/browser/fileapi/timed_task_helper.h" | 5 #include "storage/browser/fileapi/timed_task_helper.h" |
6 | 6 |
7 #include <memory> | 7 #include <memory> |
8 #include <utility> | 8 #include <utility> |
9 | 9 |
10 #include "base/bind.h" | 10 #include "base/bind.h" |
(...skipping 18 matching lines...) Expand all Loading... |
29 : task_runner_(task_runner), | 29 : task_runner_(task_runner), |
30 tracker_(NULL) { | 30 tracker_(NULL) { |
31 } | 31 } |
32 | 32 |
33 TimedTaskHelper::~TimedTaskHelper() { | 33 TimedTaskHelper::~TimedTaskHelper() { |
34 if (tracker_) | 34 if (tracker_) |
35 tracker_->timer = NULL; | 35 tracker_->timer = NULL; |
36 } | 36 } |
37 | 37 |
38 bool TimedTaskHelper::IsRunning() const { | 38 bool TimedTaskHelper::IsRunning() const { |
39 DCHECK(task_runner_->RunsTasksOnCurrentThread()); | 39 DCHECK(task_runner_->RunsTasksInCurrentSequence()); |
40 return tracker_ != NULL; | 40 return tracker_ != NULL; |
41 } | 41 } |
42 | 42 |
43 void TimedTaskHelper::Start( | 43 void TimedTaskHelper::Start( |
44 const tracked_objects::Location& posted_from, | 44 const tracked_objects::Location& posted_from, |
45 base::TimeDelta delay, | 45 base::TimeDelta delay, |
46 const base::Closure& user_task) { | 46 const base::Closure& user_task) { |
47 posted_from_ = posted_from; | 47 posted_from_ = posted_from; |
48 delay_ = delay; | 48 delay_ = delay; |
49 user_task_ = user_task; | 49 user_task_ = user_task; |
50 Reset(); | 50 Reset(); |
51 } | 51 } |
52 | 52 |
53 void TimedTaskHelper::Reset() { | 53 void TimedTaskHelper::Reset() { |
54 DCHECK(task_runner_->RunsTasksOnCurrentThread()); | 54 DCHECK(task_runner_->RunsTasksInCurrentSequence()); |
55 DCHECK(!user_task_.is_null()); | 55 DCHECK(!user_task_.is_null()); |
56 desired_run_time_ = base::TimeTicks::Now() + delay_; | 56 desired_run_time_ = base::TimeTicks::Now() + delay_; |
57 | 57 |
58 if (tracker_) | 58 if (tracker_) |
59 return; | 59 return; |
60 | 60 |
61 // Initialize the tracker for the first time. | 61 // Initialize the tracker for the first time. |
62 tracker_ = new Tracker(this); | 62 tracker_ = new Tracker(this); |
63 PostDelayedTask(base::WrapUnique(tracker_), delay_); | 63 PostDelayedTask(base::WrapUnique(tracker_), delay_); |
64 } | 64 } |
65 | 65 |
66 // static | 66 // static |
67 void TimedTaskHelper::Fired(std::unique_ptr<Tracker> tracker) { | 67 void TimedTaskHelper::Fired(std::unique_ptr<Tracker> tracker) { |
68 if (!tracker->timer) | 68 if (!tracker->timer) |
69 return; | 69 return; |
70 TimedTaskHelper* timer = tracker->timer; | 70 TimedTaskHelper* timer = tracker->timer; |
71 timer->OnFired(std::move(tracker)); | 71 timer->OnFired(std::move(tracker)); |
72 } | 72 } |
73 | 73 |
74 void TimedTaskHelper::OnFired(std::unique_ptr<Tracker> tracker) { | 74 void TimedTaskHelper::OnFired(std::unique_ptr<Tracker> tracker) { |
75 DCHECK(task_runner_->RunsTasksOnCurrentThread()); | 75 DCHECK(task_runner_->RunsTasksInCurrentSequence()); |
76 base::TimeTicks now = base::TimeTicks::Now(); | 76 base::TimeTicks now = base::TimeTicks::Now(); |
77 if (desired_run_time_ > now) { | 77 if (desired_run_time_ > now) { |
78 PostDelayedTask(std::move(tracker), desired_run_time_ - now); | 78 PostDelayedTask(std::move(tracker), desired_run_time_ - now); |
79 return; | 79 return; |
80 } | 80 } |
81 tracker.reset(); | 81 tracker.reset(); |
82 base::Closure task = user_task_; | 82 base::Closure task = user_task_; |
83 user_task_.Reset(); | 83 user_task_.Reset(); |
84 task.Run(); | 84 task.Run(); |
85 } | 85 } |
86 | 86 |
87 void TimedTaskHelper::PostDelayedTask(std::unique_ptr<Tracker> tracker, | 87 void TimedTaskHelper::PostDelayedTask(std::unique_ptr<Tracker> tracker, |
88 base::TimeDelta delay) { | 88 base::TimeDelta delay) { |
89 task_runner_->PostDelayedTask( | 89 task_runner_->PostDelayedTask( |
90 posted_from_, | 90 posted_from_, |
91 base::Bind(&TimedTaskHelper::Fired, base::Passed(&tracker)), | 91 base::Bind(&TimedTaskHelper::Fired, base::Passed(&tracker)), |
92 delay); | 92 delay); |
93 } | 93 } |
94 | 94 |
95 } // namespace storage | 95 } // namespace storage |
OLD | NEW |