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

Side by Side Diff: content/browser/appcache/appcache_disk_cache.cc

Issue 1136373003: AppCache: Ensure inflight ActiveCalls are not destroyed (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 7 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
« no previous file with comments | « no previous file | no next file » | 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) 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 "content/browser/appcache/appcache_disk_cache.h" 5 #include "content/browser/appcache/appcache_disk_cache.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/bind_helpers.h" 8 #include "base/bind_helpers.h"
9 #include "base/files/file_path.h" 9 #include "base/files/file_path.h"
10 #include "base/logging.h" 10 #include "base/logging.h"
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after
112 AppCacheDiskCache* owner_; 112 AppCacheDiskCache* owner_;
113 }; 113 };
114 114
115 // Separate object to hold state for each Create, Delete, or Doom call 115 // Separate object to hold state for each Create, Delete, or Doom call
116 // while the call is in-flight and to produce an EntryImpl upon completion. 116 // while the call is in-flight and to produce an EntryImpl upon completion.
117 class AppCacheDiskCache::ActiveCall { 117 class AppCacheDiskCache::ActiveCall {
118 public: 118 public:
119 explicit ActiveCall(AppCacheDiskCache* owner) 119 explicit ActiveCall(AppCacheDiskCache* owner)
120 : entry_(NULL), 120 : entry_(NULL),
121 owner_(owner), 121 owner_(owner),
122 entry_ptr_(NULL) { 122 entry_ptr_(NULL),
123 weak_factory_(this) {
123 } 124 }
124 125
125 int CreateEntry(int64 key, Entry** entry, 126 int CreateEntry(int64 key, Entry** entry,
126 const net::CompletionCallback& callback) { 127 const net::CompletionCallback& callback) {
127 int rv = owner_->disk_cache()->CreateEntry( 128 int rv = owner_->disk_cache()->CreateEntry(
128 base::Int64ToString(key), &entry_ptr_, 129 base::Int64ToString(key), &entry_ptr_,
129 base::Bind(&ActiveCall::OnAsyncCompletion, base::Unretained(this))); 130 base::Bind(&ActiveCall::OnAsyncCompletion, weak_factory_.GetWeakPtr()));
michaeln 2015/05/14 02:25:01 I remember there being a difference in behavior be
nhiroki 2015/05/14 04:27:05 I haven't had an absolute proof yet, but it seems
130 return HandleImmediateReturnValue(rv, entry, callback); 131 return HandleImmediateReturnValue(rv, entry, callback);
131 } 132 }
132 133
133 int OpenEntry(int64 key, Entry** entry, 134 int OpenEntry(int64 key, Entry** entry,
134 const net::CompletionCallback& callback) { 135 const net::CompletionCallback& callback) {
135 int rv = owner_->disk_cache()->OpenEntry( 136 int rv = owner_->disk_cache()->OpenEntry(
136 base::Int64ToString(key), &entry_ptr_, 137 base::Int64ToString(key), &entry_ptr_,
137 base::Bind(&ActiveCall::OnAsyncCompletion, base::Unretained(this))); 138 base::Bind(&ActiveCall::OnAsyncCompletion, weak_factory_.GetWeakPtr()));
138 return HandleImmediateReturnValue(rv, entry, callback); 139 return HandleImmediateReturnValue(rv, entry, callback);
139 } 140 }
140 141
141 int DoomEntry(int64 key, const net::CompletionCallback& callback) { 142 int DoomEntry(int64 key, const net::CompletionCallback& callback) {
142 int rv = owner_->disk_cache()->DoomEntry( 143 int rv = owner_->disk_cache()->DoomEntry(
143 base::Int64ToString(key), 144 base::Int64ToString(key),
144 base::Bind(&ActiveCall::OnAsyncCompletion, base::Unretained(this))); 145 base::Bind(&ActiveCall::OnAsyncCompletion, weak_factory_.GetWeakPtr()));
145 return HandleImmediateReturnValue(rv, NULL, callback); 146 return HandleImmediateReturnValue(rv, NULL, callback);
146 } 147 }
147 148
149 void Abort() {
150 callback_.Run(net::ERR_ABORTED);
151 delete this;
152 }
153
148 private: 154 private:
149 int HandleImmediateReturnValue(int rv, Entry** entry, 155 int HandleImmediateReturnValue(int rv, Entry** entry,
150 const net::CompletionCallback& callback) { 156 const net::CompletionCallback& callback) {
151 if (rv == net::ERR_IO_PENDING) { 157 if (rv == net::ERR_IO_PENDING) {
152 // OnAsyncCompletion will be called later. 158 // OnAsyncCompletion will be called later.
153 callback_ = callback; 159 callback_ = callback;
154 entry_ = entry; 160 entry_ = entry;
155 owner_->AddActiveCall(this); 161 owner_->AddActiveCall(this);
156 return net::ERR_IO_PENDING; 162 return net::ERR_IO_PENDING;
157 } 163 }
158 if (rv == net::OK && entry) 164 if (rv == net::OK && entry)
159 *entry = new EntryImpl(entry_ptr_, owner_); 165 *entry = new EntryImpl(entry_ptr_, owner_);
160 delete this; 166 delete this;
161 return rv; 167 return rv;
162 } 168 }
163 169
164 void OnAsyncCompletion(int rv) { 170 void OnAsyncCompletion(int rv) {
165 owner_->RemoveActiveCall(this); 171 owner_->RemoveActiveCall(this);
166 if (rv == net::OK && entry_) 172 if (rv == net::OK && entry_)
167 *entry_ = new EntryImpl(entry_ptr_, owner_); 173 *entry_ = new EntryImpl(entry_ptr_, owner_);
168 callback_.Run(rv); 174 callback_.Run(rv);
169 callback_.Reset();
170 delete this; 175 delete this;
171 } 176 }
172 177
173 Entry** entry_; 178 Entry** entry_;
174 net::CompletionCallback callback_; 179 net::CompletionCallback callback_;
175 AppCacheDiskCache* owner_; 180 AppCacheDiskCache* owner_;
176 disk_cache::Entry* entry_ptr_; 181 disk_cache::Entry* entry_ptr_;
182
183 base::WeakPtrFactory<AppCacheDiskCache::ActiveCall> weak_factory_;
177 }; 184 };
178 185
179 AppCacheDiskCache::AppCacheDiskCache() 186 AppCacheDiskCache::AppCacheDiskCache()
180 : is_disabled_(false) { 187 : is_disabled_(false) {
181 } 188 }
182 189
183 AppCacheDiskCache::~AppCacheDiskCache() { 190 AppCacheDiskCache::~AppCacheDiskCache() {
184 Disable(); 191 Disable();
185 } 192 }
186 193
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
218 225
219 // We need to close open file handles in order to reinitalize the 226 // We need to close open file handles in order to reinitalize the
220 // appcache system on the fly. File handles held in both entries and in 227 // appcache system on the fly. File handles held in both entries and in
221 // the main disk_cache::Backend class need to be released. 228 // the main disk_cache::Backend class need to be released.
222 for (OpenEntries::const_iterator iter = open_entries_.begin(); 229 for (OpenEntries::const_iterator iter = open_entries_.begin();
223 iter != open_entries_.end(); ++iter) { 230 iter != open_entries_.end(); ++iter) {
224 (*iter)->Abandon(); 231 (*iter)->Abandon();
225 } 232 }
226 open_entries_.clear(); 233 open_entries_.clear();
227 disk_cache_.reset(); 234 disk_cache_.reset();
228 STLDeleteElements(&active_calls_); 235
236 for (AppCacheDiskCache::ActiveCall* active_call : active_calls_)
237 active_call->Abort();
238 active_calls_.clear();
229 } 239 }
230 240
231 int AppCacheDiskCache::CreateEntry(int64 key, Entry** entry, 241 int AppCacheDiskCache::CreateEntry(int64 key, Entry** entry,
232 const net::CompletionCallback& callback) { 242 const net::CompletionCallback& callback) {
233 DCHECK(entry); 243 DCHECK(entry);
234 DCHECK(!callback.is_null()); 244 DCHECK(!callback.is_null());
235 if (is_disabled_) 245 if (is_disabled_)
236 return net::ERR_ABORTED; 246 return net::ERR_ABORTED;
237 247
238 if (is_initializing()) { 248 if (is_initializing()) {
(...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after
363 NOTREACHED(); 373 NOTREACHED();
364 break; 374 break;
365 } 375 }
366 if (rv != net::ERR_IO_PENDING) 376 if (rv != net::ERR_IO_PENDING)
367 iter->callback.Run(rv); 377 iter->callback.Run(rv);
368 } 378 }
369 pending_calls_.clear(); 379 pending_calls_.clear();
370 } 380 }
371 381
372 } // namespace content 382 } // namespace content
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698