Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(244)

Side by Side Diff: content/browser/background_fetch/background_fetch_data_manager.cc

Issue 2973233002: [Background Fetch] Cleanup/fix thread safety (Closed)
Patch Set: Created 3 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2017 The Chromium Authors. All rights reserved. 1 // Copyright 2017 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 "content/browser/background_fetch/background_fetch_data_manager.h" 5 #include "content/browser/background_fetch/background_fetch_data_manager.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <queue> 8 #include <queue>
9 9
10 #include "base/memory/ptr_util.h" 10 #include "base/memory/ptr_util.h"
(...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after
115 "RegistrationData::completed_requests_ assumes no parallelism"); 115 "RegistrationData::completed_requests_ assumes no parallelism");
116 116
117 std::vector<scoped_refptr<BackgroundFetchRequestInfo>> completed_requests_; 117 std::vector<scoped_refptr<BackgroundFetchRequestInfo>> completed_requests_;
118 118
119 DISALLOW_COPY_AND_ASSIGN(RegistrationData); 119 DISALLOW_COPY_AND_ASSIGN(RegistrationData);
120 }; 120 };
121 121
122 BackgroundFetchDataManager::BackgroundFetchDataManager( 122 BackgroundFetchDataManager::BackgroundFetchDataManager(
123 BrowserContext* browser_context) 123 BrowserContext* browser_context)
124 : weak_ptr_factory_(this) { 124 : weak_ptr_factory_(this) {
125 // Constructed on the UI thread, then used on a different thread.
125 DCHECK_CURRENTLY_ON(BrowserThread::UI); 126 DCHECK_CURRENTLY_ON(BrowserThread::UI);
127 DETACH_FROM_SEQUENCE(sequence_checker_);
128
126 DCHECK(browser_context); 129 DCHECK(browser_context);
127 130
128 // Store the blob storage context for the given |browser_context|. 131 // Store the blob storage context for the given |browser_context|.
129 blob_storage_context_ = 132 blob_storage_context_ =
130 make_scoped_refptr(ChromeBlobStorageContext::GetFor(browser_context)); 133 make_scoped_refptr(ChromeBlobStorageContext::GetFor(browser_context));
131 DCHECK(blob_storage_context_); 134 DCHECK(blob_storage_context_);
132 } 135 }
133 136
134 BackgroundFetchDataManager::~BackgroundFetchDataManager() = default; 137 BackgroundFetchDataManager::~BackgroundFetchDataManager() {
138 DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
139 }
135 140
136 void BackgroundFetchDataManager::CreateRegistration( 141 void BackgroundFetchDataManager::CreateRegistration(
137 const BackgroundFetchRegistrationId& registration_id, 142 const BackgroundFetchRegistrationId& registration_id,
138 const std::vector<ServiceWorkerFetchRequest>& requests, 143 const std::vector<ServiceWorkerFetchRequest>& requests,
139 const BackgroundFetchOptions& options, 144 const BackgroundFetchOptions& options,
140 CreateRegistrationCallback callback) { 145 CreateRegistrationCallback callback) {
146 DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
147
141 if (registrations_.find(registration_id) != registrations_.end()) { 148 if (registrations_.find(registration_id) != registrations_.end()) {
142 std::move(callback).Run( 149 std::move(callback).Run(
143 blink::mojom::BackgroundFetchError::DUPLICATED_TAG, 150 blink::mojom::BackgroundFetchError::DUPLICATED_TAG,
144 std::vector<scoped_refptr<BackgroundFetchRequestInfo>>()); 151 std::vector<scoped_refptr<BackgroundFetchRequestInfo>>());
145 return; 152 return;
146 } 153 }
147 154
148 std::unique_ptr<RegistrationData> registration_data = 155 std::unique_ptr<RegistrationData> registration_data =
149 base::MakeUnique<RegistrationData>(requests, options); 156 base::MakeUnique<RegistrationData>(requests, options);
150 157
(...skipping 12 matching lines...) Expand all
163 170
164 // Inform the |callback| of the newly created registration. 171 // Inform the |callback| of the newly created registration.
165 std::move(callback).Run(blink::mojom::BackgroundFetchError::NONE, 172 std::move(callback).Run(blink::mojom::BackgroundFetchError::NONE,
166 std::move(initial_requests)); 173 std::move(initial_requests));
167 } 174 }
168 175
169 void BackgroundFetchDataManager::MarkRequestAsStarted( 176 void BackgroundFetchDataManager::MarkRequestAsStarted(
170 const BackgroundFetchRegistrationId& registration_id, 177 const BackgroundFetchRegistrationId& registration_id,
171 BackgroundFetchRequestInfo* request, 178 BackgroundFetchRequestInfo* request,
172 const std::string& download_guid) { 179 const std::string& download_guid) {
180 DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
181
173 auto iter = registrations_.find(registration_id); 182 auto iter = registrations_.find(registration_id);
174 DCHECK(iter != registrations_.end()); 183 DCHECK(iter != registrations_.end());
175 184
176 RegistrationData* registration_data = iter->second.get(); 185 RegistrationData* registration_data = iter->second.get();
177 registration_data->MarkRequestAsStarted(request, download_guid); 186 registration_data->MarkRequestAsStarted(request, download_guid);
178 } 187 }
179 188
180 void BackgroundFetchDataManager::MarkRequestAsCompleteAndGetNextRequest( 189 void BackgroundFetchDataManager::MarkRequestAsCompleteAndGetNextRequest(
181 const BackgroundFetchRegistrationId& registration_id, 190 const BackgroundFetchRegistrationId& registration_id,
182 BackgroundFetchRequestInfo* request, 191 BackgroundFetchRequestInfo* request,
183 NextRequestCallback callback) { 192 NextRequestCallback callback) {
193 DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
194
184 auto iter = registrations_.find(registration_id); 195 auto iter = registrations_.find(registration_id);
185 DCHECK(iter != registrations_.end()); 196 DCHECK(iter != registrations_.end());
186 197
187 RegistrationData* registration_data = iter->second.get(); 198 RegistrationData* registration_data = iter->second.get();
188 registration_data->MarkRequestAsComplete(request); 199 registration_data->MarkRequestAsComplete(request);
189 200
190 scoped_refptr<BackgroundFetchRequestInfo> next_request; 201 scoped_refptr<BackgroundFetchRequestInfo> next_request;
191 if (registration_data->HasPendingRequests()) 202 if (registration_data->HasPendingRequests())
192 next_request = registration_data->GetPendingRequest(); 203 next_request = registration_data->GetPendingRequest();
193 204
194 std::move(callback).Run(std::move(next_request)); 205 std::move(callback).Run(std::move(next_request));
195 } 206 }
196 207
197 void BackgroundFetchDataManager::GetSettledFetchesForRegistration( 208 void BackgroundFetchDataManager::GetSettledFetchesForRegistration(
198 const BackgroundFetchRegistrationId& registration_id, 209 const BackgroundFetchRegistrationId& registration_id,
199 SettledFetchesCallback callback) { 210 SettledFetchesCallback callback) {
211 // This method calls ChromeBlobStorageContext, which must happen on IO thread.
212 DCHECK_CURRENTLY_ON(BrowserThread::IO);
Peter Beverloo 2017/07/10 13:13:21 ChromeBlobStorageContext::CreateFileBackedBlob() w
johnme 2017/07/10 13:41:07 Done.
213 DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
214
200 auto iter = registrations_.find(registration_id); 215 auto iter = registrations_.find(registration_id);
201 DCHECK(iter != registrations_.end()); 216 DCHECK(iter != registrations_.end());
202 217
203 RegistrationData* registration_data = iter->second.get(); 218 RegistrationData* registration_data = iter->second.get();
204 DCHECK(!registration_data->HasPendingRequests()); 219 DCHECK(!registration_data->HasPendingRequests());
205 220
206 const std::vector<scoped_refptr<BackgroundFetchRequestInfo>>& requests = 221 const std::vector<scoped_refptr<BackgroundFetchRequestInfo>>& requests =
207 registration_data->GetCompletedRequests(); 222 registration_data->GetCompletedRequests();
208 223
209 bool background_fetch_succeeded = true; 224 bool background_fetch_succeeded = true;
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
264 } 279 }
265 280
266 std::move(callback).Run(blink::mojom::BackgroundFetchError::NONE, 281 std::move(callback).Run(blink::mojom::BackgroundFetchError::NONE,
267 background_fetch_succeeded, 282 background_fetch_succeeded,
268 std::move(settled_fetches), std::move(blob_handles)); 283 std::move(settled_fetches), std::move(blob_handles));
269 } 284 }
270 285
271 void BackgroundFetchDataManager::DeleteRegistration( 286 void BackgroundFetchDataManager::DeleteRegistration(
272 const BackgroundFetchRegistrationId& registration_id, 287 const BackgroundFetchRegistrationId& registration_id,
273 DeleteRegistrationCallback callback) { 288 DeleteRegistrationCallback callback) {
289 DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
290
274 auto iter = registrations_.find(registration_id); 291 auto iter = registrations_.find(registration_id);
275 if (iter == registrations_.end()) { 292 if (iter == registrations_.end()) {
276 std::move(callback).Run(blink::mojom::BackgroundFetchError::INVALID_TAG); 293 std::move(callback).Run(blink::mojom::BackgroundFetchError::INVALID_TAG);
277 return; 294 return;
278 } 295 }
279 296
280 registrations_.erase(iter); 297 registrations_.erase(iter);
281 298
282 std::move(callback).Run(blink::mojom::BackgroundFetchError::NONE); 299 std::move(callback).Run(blink::mojom::BackgroundFetchError::NONE);
283 } 300 }
284 301
285 } // namespace content 302 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698