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

Side by Side Diff: chrome/browser/safe_browsing/incident_reporting/download_metadata_manager.cc

Issue 703463006: Fix DCHECK when shutting down safe browsing DownloadMetadataManager. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 6 years, 1 month 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 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 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/safe_browsing/incident_reporting/download_metadata_mana ger.h" 5 #include "chrome/browser/safe_browsing/incident_reporting/download_metadata_mana ger.h"
6 6
7 #include <list> 7 #include <list>
8 8
9 #include "base/bind.h" 9 #include "base/bind.h"
10 #include "base/callback.h" 10 #include "base/callback.h"
(...skipping 275 matching lines...) Expand 10 before | Expand all | Expand 10 after
286 write_runner_ = worker_pool->GetSequencedTaskRunnerWithShutdownBehavior( 286 write_runner_ = worker_pool->GetSequencedTaskRunnerWithShutdownBehavior(
287 token, base::SequencedWorkerPool::SKIP_ON_SHUTDOWN); 287 token, base::SequencedWorkerPool::SKIP_ON_SHUTDOWN);
288 } 288 }
289 289
290 DownloadMetadataManager::DownloadMetadataManager( 290 DownloadMetadataManager::DownloadMetadataManager(
291 const scoped_refptr<base::SequencedTaskRunner>& task_runner) 291 const scoped_refptr<base::SequencedTaskRunner>& task_runner)
292 : read_runner_(task_runner), write_runner_(task_runner) { 292 : read_runner_(task_runner), write_runner_(task_runner) {
293 } 293 }
294 294
295 DownloadMetadataManager::~DownloadMetadataManager() { 295 DownloadMetadataManager::~DownloadMetadataManager() {
296 // All download managers must have gone down prior to this. 296 // Destruction may have taken place before managers have gone down.
297 DCHECK(contexts_.empty()); 297 for (const auto& value : contexts_) {
298 value.first->RemoveObserver(this);
299 value.second->Detach();
300 }
301 contexts_.clear();
298 } 302 }
299 303
300 void DownloadMetadataManager::AddDownloadManager( 304 void DownloadMetadataManager::AddDownloadManager(
301 content::DownloadManager* download_manager) { 305 content::DownloadManager* download_manager) {
302 DCHECK_EQ(contexts_.count(download_manager), 0U); 306 DCHECK_EQ(contexts_.count(download_manager), 0U);
303 download_manager->AddObserver(this); 307 download_manager->AddObserver(this);
304 contexts_[download_manager] = 308 contexts_[download_manager] =
305 new ManagerContext(read_runner_, write_runner_, download_manager); 309 new ManagerContext(read_runner_, write_runner_, download_manager);
306 } 310 }
307 311
(...skipping 190 matching lines...) Expand 10 before | Expand all | Expand 10 after
498 else 502 else
499 iter->second.item = nullptr; 503 iter->second.item = nullptr;
500 } else if (item_) { 504 } else if (item_) {
501 // This item is no longer being observed. 505 // This item is no longer being observed.
502 DCHECK_EQ(item_, download); 506 DCHECK_EQ(item_, download);
503 item_ = nullptr; 507 item_ = nullptr;
504 } 508 }
505 } 509 }
506 510
507 DownloadMetadataManager::ManagerContext::~ManagerContext() { 511 DownloadMetadataManager::ManagerContext::~ManagerContext() {
508 // All downloads must have been destroyed prior to deleting the context and 512 // A context should not be deleted while waiting for a load to complete.
509 // all recorded operations and callbacks must have been handled.
510 DCHECK(pending_items_.empty()); 513 DCHECK(pending_items_.empty());
511 DCHECK_EQ(item_, static_cast<content::DownloadItem*>(nullptr));
512 DCHECK(get_details_callbacks_.empty()); 514 DCHECK(get_details_callbacks_.empty());
515
516 // The context may have detached while still observing the item of interest
517 // since a DownloadManager announces that it's going down before it destroyes
518 // its items.
519 if (item_) {
520 item_->RemoveObserver(this);
521 item_ = nullptr;
522 }
513 } 523 }
514 524
515 void DownloadMetadataManager::ManagerContext::ClearPendingItems() { 525 void DownloadMetadataManager::ManagerContext::ClearPendingItems() {
516 for (const auto& value : pending_items_) { 526 for (const auto& value : pending_items_) {
517 if (value.second.item) 527 if (value.second.item)
518 value.second.item->RemoveObserver(this); 528 value.second.item->RemoveObserver(this);
519 } 529 }
520 pending_items_.clear(); 530 pending_items_.clear();
521 } 531 }
522 532
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after
605 615
606 void DownloadMetadataManager::ManagerContext::WriteMetadata() { 616 void DownloadMetadataManager::ManagerContext::WriteMetadata() {
607 write_runner_->PostTask( 617 write_runner_->PostTask(
608 FROM_HERE, 618 FROM_HERE,
609 base::Bind(&WriteMetadataOnWorkerPool, 619 base::Bind(&WriteMetadataOnWorkerPool,
610 metadata_path_, 620 metadata_path_,
611 base::Owned(new DownloadMetadata(*download_metadata_)))); 621 base::Owned(new DownloadMetadata(*download_metadata_))));
612 } 622 }
613 623
614 } // namespace safe_browsing 624 } // namespace safe_browsing
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698