OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 "chrome/browser/prerender/prerender_tracker.h" | 5 #include "chrome/browser/prerender/prerender_tracker.h" |
6 | 6 |
7 #include "base/bind.h" | 7 #include "base/bind.h" |
8 #include "base/logging.h" | 8 #include "base/logging.h" |
9 #include "chrome/browser/browser_process.h" | 9 #include "chrome/browser/browser_process.h" |
10 #include "chrome/browser/prerender/prerender_manager.h" | 10 #include "chrome/browser/prerender/prerender_manager.h" |
(...skipping 30 matching lines...) Expand all Loading... |
41 : final_status(FINAL_STATUS_MAX), | 41 : final_status(FINAL_STATUS_MAX), |
42 prerender_manager(prerender_manager->AsWeakPtr()) { | 42 prerender_manager(prerender_manager->AsWeakPtr()) { |
43 } | 43 } |
44 ~RenderViewInfo() {} | 44 ~RenderViewInfo() {} |
45 | 45 |
46 FinalStatus final_status; | 46 FinalStatus final_status; |
47 base::WeakPtr<PrerenderManager> prerender_manager; | 47 base::WeakPtr<PrerenderManager> prerender_manager; |
48 }; | 48 }; |
49 | 49 |
50 PrerenderTracker::PrerenderTracker() { | 50 PrerenderTracker::PrerenderTracker() { |
| 51 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
51 } | 52 } |
52 | 53 |
53 PrerenderTracker::~PrerenderTracker() { | 54 PrerenderTracker::~PrerenderTracker() { |
| 55 DCHECK(final_status_map_.empty()); |
54 } | 56 } |
55 | 57 |
56 bool PrerenderTracker::TryUse(int child_id, int route_id) { | 58 bool PrerenderTracker::TryUse(int child_id, int route_id) { |
57 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 59 DCHECK(CalledOnValidThread()); |
58 | |
59 return SetFinalStatus(child_id, route_id, FINAL_STATUS_USED, NULL); | 60 return SetFinalStatus(child_id, route_id, FINAL_STATUS_USED, NULL); |
60 } | 61 } |
61 | 62 |
62 bool PrerenderTracker::TryCancel( | 63 bool PrerenderTracker::TryCancel( |
63 int child_id, | 64 int child_id, |
64 int route_id, | 65 int route_id, |
65 FinalStatus final_status) { | 66 FinalStatus final_status) { |
66 DCHECK_NE(FINAL_STATUS_USED, final_status); | 67 DCHECK_NE(FINAL_STATUS_USED, final_status); |
67 DCHECK(final_status >= 0 && final_status < FINAL_STATUS_MAX); | 68 DCHECK(final_status >= 0 && final_status < FINAL_STATUS_MAX); |
68 | 69 |
69 FinalStatus actual_final_status; | 70 FinalStatus actual_final_status; |
70 SetFinalStatus(child_id, route_id, final_status, &actual_final_status); | 71 SetFinalStatus(child_id, route_id, final_status, &actual_final_status); |
71 return actual_final_status != FINAL_STATUS_USED && | 72 return actual_final_status != FINAL_STATUS_USED && |
72 actual_final_status != FINAL_STATUS_MAX; | 73 actual_final_status != FINAL_STATUS_MAX; |
73 } | 74 } |
74 | 75 |
75 bool PrerenderTracker::TryCancelOnIOThread( | 76 bool PrerenderTracker::TryCancelOnIOThread( |
76 int child_id, | 77 int child_id, |
77 int route_id, | 78 int route_id, |
78 FinalStatus final_status) { | 79 FinalStatus final_status) { |
79 DCHECK_NE(FINAL_STATUS_USED, final_status); | 80 DCHECK_NE(FINAL_STATUS_USED, final_status); |
80 DCHECK(final_status >= 0 && final_status < FINAL_STATUS_MAX); | 81 DCHECK_LE(0, final_status); |
| 82 DCHECK_GT(FINAL_STATUS_MAX, final_status); |
81 | 83 |
82 if (!IsPrerenderingOnIOThread(child_id, route_id)) | 84 if (!IsPrerenderingOnIOThread(child_id, route_id)) |
83 return false; | 85 return false; |
84 return TryCancel(child_id, route_id, final_status); | 86 return TryCancel(child_id, route_id, final_status); |
85 } | 87 } |
86 | 88 |
87 bool PrerenderTracker::GetFinalStatus(int child_id, int route_id, | 89 bool PrerenderTracker::GetFinalStatus(int child_id, int route_id, |
88 FinalStatus* final_status) const { | 90 FinalStatus* final_status) const { |
89 ChildRouteIdPair child_route_id_pair(child_id, route_id); | 91 ChildRouteIdPair child_route_id_pair(child_id, route_id); |
90 | 92 |
91 base::AutoLock lock(final_status_map_lock_); | 93 base::AutoLock lock(final_status_map_lock_); |
92 FinalStatusMap::const_iterator final_status_it = | 94 FinalStatusMap::const_iterator final_status_it = |
93 final_status_map_.find(child_route_id_pair); | 95 final_status_map_.find(child_route_id_pair); |
94 if (final_status_map_.end() == final_status_map_.find(child_route_id_pair)) | 96 if (final_status_it == final_status_map_.end()) |
95 return false; | 97 return false; |
96 *final_status = final_status_it->second.final_status; | 98 *final_status = final_status_it->second.final_status; |
97 return true; | 99 return true; |
98 } | 100 } |
99 | 101 |
100 void PrerenderTracker::OnPrerenderingStarted( | 102 void PrerenderTracker::OnPrerenderStart( |
101 int child_id, int route_id, PrerenderManager* prerender_manager) { | 103 PrerenderContents* prerender_contents) { |
102 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 104 DCHECK(CalledOnValidThread()); |
103 DCHECK_GE(child_id, 0); | 105 int child_id, route_id; |
104 DCHECK_GE(route_id, 0); | 106 bool got_child_id = prerender_contents->GetChildId(&child_id); |
| 107 DCHECK(got_child_id); |
| 108 bool got_route_id = prerender_contents->GetRouteId(&route_id); |
| 109 DCHECK(got_route_id); |
105 | 110 |
106 ChildRouteIdPair child_route_id_pair(child_id, route_id); | 111 ChildRouteIdPair child_route_id_pair(child_id, route_id); |
107 | 112 |
108 // The RenderView should not already be prerendering. | |
109 DCHECK(final_status_map_.end() == | |
110 final_status_map_.find(child_route_id_pair)); | |
111 | |
112 BrowserThread::PostTask( | 113 BrowserThread::PostTask( |
113 BrowserThread::IO, FROM_HERE, | 114 BrowserThread::IO, FROM_HERE, |
114 base::Bind(&AddPrerenderOnIOThreadTask, child_route_id_pair)); | 115 base::Bind(&AddPrerenderOnIOThreadTask, child_route_id_pair)); |
115 | 116 |
116 base::AutoLock lock(final_status_map_lock_); | 117 base::AutoLock lock(final_status_map_lock_); |
| 118 // The RenderView should not already be prerendering. |
| 119 DCHECK_EQ(0u, final_status_map_.count(child_route_id_pair)); |
117 | 120 |
118 final_status_map_.insert( | 121 final_status_map_.insert( |
119 std::make_pair(child_route_id_pair, RenderViewInfo(prerender_manager))); | 122 std::make_pair(child_route_id_pair, |
| 123 RenderViewInfo(prerender_contents->prerender_manager()))); |
120 } | 124 } |
121 | 125 |
122 void PrerenderTracker::OnPrerenderingFinished(int child_id, int route_id) { | 126 void PrerenderTracker::OnPrerenderStop( |
123 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 127 PrerenderContents* prerender_contents) { |
124 DCHECK_GE(child_id, 0); | 128 DCHECK(CalledOnValidThread()); |
125 DCHECK_GE(route_id, 0); | 129 int child_id, route_id; |
| 130 bool got_child_id = prerender_contents->GetChildId(&child_id); |
| 131 DCHECK(got_child_id); |
| 132 bool got_route_id = prerender_contents->GetRouteId(&route_id); |
| 133 DCHECK(got_route_id); |
126 | 134 |
127 ChildRouteIdPair child_route_id_pair(child_id, route_id); | 135 ChildRouteIdPair child_route_id_pair(child_id, route_id); |
128 | 136 |
129 BrowserThread::PostTask( | 137 BrowserThread::PostTask( |
130 BrowserThread::IO, FROM_HERE, | 138 BrowserThread::IO, FROM_HERE, |
131 base::Bind(&RemovePrerenderOnIOThreadTask, child_route_id_pair)); | 139 base::Bind(&RemovePrerenderOnIOThreadTask, child_route_id_pair)); |
132 | 140 |
133 base::AutoLock lock(final_status_map_lock_); | 141 base::AutoLock lock(final_status_map_lock_); |
134 size_t num_erased = final_status_map_.erase(child_route_id_pair); | 142 size_t num_erased = final_status_map_.erase(child_route_id_pair); |
135 DCHECK_EQ(1u, num_erased); | 143 DCHECK_EQ(1u, num_erased); |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
171 if (actual_final_status) | 179 if (actual_final_status) |
172 *actual_final_status = final_status_it->second.final_status; | 180 *actual_final_status = final_status_it->second.final_status; |
173 return false; | 181 return false; |
174 } | 182 } |
175 | 183 |
176 bool PrerenderTracker::IsPrerenderingOnIOThread(int child_id, | 184 bool PrerenderTracker::IsPrerenderingOnIOThread(int child_id, |
177 int route_id) const { | 185 int route_id) const { |
178 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 186 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
179 | 187 |
180 ChildRouteIdPair child_route_id_pair(child_id, route_id); | 188 ChildRouteIdPair child_route_id_pair(child_id, route_id); |
181 return possibly_prerendering_io_thread_set_.end() != | 189 return possibly_prerendering_io_thread_set_.count(child_route_id_pair) > 0; |
182 possibly_prerendering_io_thread_set_.find(child_route_id_pair); | |
183 } | 190 } |
184 | 191 |
185 void PrerenderTracker::AddPrerenderOnIOThread( | 192 void PrerenderTracker::AddPrerenderOnIOThread( |
186 const ChildRouteIdPair& child_route_id_pair) { | 193 const ChildRouteIdPair& child_route_id_pair) { |
187 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 194 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
188 DCHECK(!IsPrerenderingOnIOThread(child_route_id_pair.first, | 195 DCHECK(!IsPrerenderingOnIOThread(child_route_id_pair.first, |
189 child_route_id_pair.second)); | 196 child_route_id_pair.second)); |
190 | 197 |
191 possibly_prerendering_io_thread_set_.insert(child_route_id_pair); | 198 possibly_prerendering_io_thread_set_.insert(child_route_id_pair); |
192 } | 199 } |
(...skipping 18 matching lines...) Expand all Loading... |
211 GetDefault()->AddPrerenderOnIOThread(child_route_id_pair); | 218 GetDefault()->AddPrerenderOnIOThread(child_route_id_pair); |
212 } | 219 } |
213 | 220 |
214 // static | 221 // static |
215 void PrerenderTracker::RemovePrerenderOnIOThreadTask( | 222 void PrerenderTracker::RemovePrerenderOnIOThreadTask( |
216 const ChildRouteIdPair& child_route_id_pair) { | 223 const ChildRouteIdPair& child_route_id_pair) { |
217 GetDefault()->RemovePrerenderOnIOThread(child_route_id_pair); | 224 GetDefault()->RemovePrerenderOnIOThread(child_route_id_pair); |
218 } | 225 } |
219 | 226 |
220 } // namespace prerender | 227 } // namespace prerender |
OLD | NEW |