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

Side by Side Diff: chrome/browser/bookmarks/bookmark_model.cc

Issue 7891018: Fixes possible deadlock between history and bookmarks. The deadlock (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 9 years, 3 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 | Annotate | Revision Log
« no previous file with comments | « chrome/browser/bookmarks/bookmark_model.h ('k') | chrome/browser/profiles/profile_impl.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 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/bookmarks/bookmark_model.h" 5 #include "chrome/browser/bookmarks/bookmark_model.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <functional> 8 #include <functional>
9 9
10 #include "base/callback.h" 10 #include "base/callback.h"
(...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after
113 BookmarkModel::BookmarkModel(Profile* profile) 113 BookmarkModel::BookmarkModel(Profile* profile)
114 : profile_(profile), 114 : profile_(profile),
115 loaded_(false), 115 loaded_(false),
116 file_changed_(false), 116 file_changed_(false),
117 root_(GURL()), 117 root_(GURL()),
118 bookmark_bar_node_(NULL), 118 bookmark_bar_node_(NULL),
119 other_node_(NULL), 119 other_node_(NULL),
120 synced_node_(NULL), 120 synced_node_(NULL),
121 next_node_id_(1), 121 next_node_id_(1),
122 observers_(ObserverList<BookmarkModelObserver>::NOTIFY_EXISTING_ONLY), 122 observers_(ObserverList<BookmarkModelObserver>::NOTIFY_EXISTING_ONLY),
123 loaded_signal_(TRUE, FALSE) { 123 loaded_signal_(true, false) {
124 if (!profile_) { 124 if (!profile_) {
125 // Profile is null during testing. 125 // Profile is null during testing.
126 DoneLoading(CreateLoadDetails()); 126 DoneLoading(CreateLoadDetails());
127 } 127 }
128 } 128 }
129 129
130 BookmarkModel::~BookmarkModel() { 130 BookmarkModel::~BookmarkModel() {
131 FOR_EACH_OBSERVER(BookmarkModelObserver, observers_, 131 FOR_EACH_OBSERVER(BookmarkModelObserver, observers_,
132 BookmarkModelBeingDeleted(this)); 132 BookmarkModelBeingDeleted(this));
133 133
134 if (store_) { 134 if (store_) {
135 // The store maintains a reference back to us. We need to tell it we're gone 135 // The store maintains a reference back to us. We need to tell it we're gone
136 // so that it doesn't try and invoke a method back on us again. 136 // so that it doesn't try and invoke a method back on us again.
137 store_->BookmarkModelDeleted(); 137 store_->BookmarkModelDeleted();
138 } 138 }
139 } 139 }
140 140
141 // static 141 // static
142 void BookmarkModel::RegisterUserPrefs(PrefService* prefs) { 142 void BookmarkModel::RegisterUserPrefs(PrefService* prefs) {
143 prefs->RegisterListPref(prefs::kBookmarkEditorExpandedNodes, new ListValue, 143 prefs->RegisterListPref(prefs::kBookmarkEditorExpandedNodes, new ListValue,
144 PrefService::SYNCABLE_PREF); 144 PrefService::SYNCABLE_PREF);
145 } 145 }
146 146
147 void BookmarkModel::Cleanup() {
148 if (loaded_)
149 return;
150
151 // See comment in Profile shutdown code where this is invoked for details.
152 loaded_signal_.Signal();
153 }
154
147 void BookmarkModel::Load() { 155 void BookmarkModel::Load() {
148 if (store_.get()) { 156 if (store_.get()) {
149 // If the store is non-null, it means Load was already invoked. Load should 157 // If the store is non-null, it means Load was already invoked. Load should
150 // only be invoked once. 158 // only be invoked once.
151 NOTREACHED(); 159 NOTREACHED();
152 return; 160 return;
153 } 161 }
154 162
155 expanded_state_tracker_.reset(new BookmarkExpandedStateTracker( 163 expanded_state_tracker_.reset(new BookmarkExpandedStateTracker(
156 profile_, prefs::kBookmarkEditorExpandedNodes)); 164 profile_, prefs::kBookmarkEditorExpandedNodes));
(...skipping 646 matching lines...) Expand 10 before | Expand all | Expand 10 after
803 file_changed_ = true; 811 file_changed_ = true;
804 } 812 }
805 813
806 BookmarkLoadDetails* BookmarkModel::CreateLoadDetails() { 814 BookmarkLoadDetails* BookmarkModel::CreateLoadDetails() {
807 BookmarkNode* bb_node = CreatePermanentNode(BookmarkNode::BOOKMARK_BAR); 815 BookmarkNode* bb_node = CreatePermanentNode(BookmarkNode::BOOKMARK_BAR);
808 BookmarkNode* other_node = CreatePermanentNode(BookmarkNode::OTHER_NODE); 816 BookmarkNode* other_node = CreatePermanentNode(BookmarkNode::OTHER_NODE);
809 BookmarkNode* synced_node = CreatePermanentNode(BookmarkNode::SYNCED); 817 BookmarkNode* synced_node = CreatePermanentNode(BookmarkNode::SYNCED);
810 return new BookmarkLoadDetails(bb_node, other_node, synced_node, 818 return new BookmarkLoadDetails(bb_node, other_node, synced_node,
811 new BookmarkIndex(profile_), next_node_id_); 819 new BookmarkIndex(profile_), next_node_id_);
812 } 820 }
OLDNEW
« no previous file with comments | « chrome/browser/bookmarks/bookmark_model.h ('k') | chrome/browser/profiles/profile_impl.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698