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

Side by Side Diff: net/http/http_cache.cc

Issue 3016006: Http Cache: Don't delete the callback that is waiting for... (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: Created 10 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 | Annotate | Revision Log
« no previous file with comments | « no previous file | net/http/http_cache_unittest.cc » ('j') | net/http/http_cache_unittest.cc » ('J')
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2010 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 "net/http/http_cache.h" 5 #include "net/http/http_cache.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 8
9 #include "base/compiler_specific.h" 9 #include "base/compiler_specific.h"
10 10
(...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after
127 127
128 // This class is a specialized type of CompletionCallback that allows us to 128 // This class is a specialized type of CompletionCallback that allows us to
129 // pass multiple arguments to the completion routine. 129 // pass multiple arguments to the completion routine.
130 class HttpCache::BackendCallback : public CallbackRunner<Tuple1<int> > { 130 class HttpCache::BackendCallback : public CallbackRunner<Tuple1<int> > {
131 public: 131 public:
132 BackendCallback(HttpCache* cache, PendingOp* pending_op) 132 BackendCallback(HttpCache* cache, PendingOp* pending_op)
133 : cache_(cache), pending_op_(pending_op) {} 133 : cache_(cache), pending_op_(pending_op) {}
134 ~BackendCallback() {} 134 ~BackendCallback() {}
135 135
136 virtual void RunWithParams(const Tuple1<int>& params) { 136 virtual void RunWithParams(const Tuple1<int>& params) {
137 cache_->OnIOComplete(params.a, pending_op_); 137 if (cache_)
138 cache_->OnIOComplete(params.a, pending_op_);
138 delete this; 139 delete this;
139 } 140 }
140 141
142 void Cancel() {
143 cache_ = NULL;
144 }
145
141 private: 146 private:
142 HttpCache* cache_; 147 HttpCache* cache_;
143 PendingOp* pending_op_; 148 PendingOp* pending_op_;
144 DISALLOW_COPY_AND_ASSIGN(BackendCallback); 149 DISALLOW_COPY_AND_ASSIGN(BackendCallback);
145 }; 150 };
146 151
147 //----------------------------------------------------------------------------- 152 //-----------------------------------------------------------------------------
148 153
149 // This class encapsulates a transaction whose only purpose is to write metadata 154 // This class encapsulates a transaction whose only purpose is to write metadata
150 // to a given entry. 155 // to a given entry.
(...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after
276 } 281 }
277 282
278 STLDeleteElements(&doomed_entries_); 283 STLDeleteElements(&doomed_entries_);
279 284
280 PendingOpsMap::iterator pending_it = pending_ops_.begin(); 285 PendingOpsMap::iterator pending_it = pending_ops_.begin();
281 for (; pending_it != pending_ops_.end(); ++pending_it) { 286 for (; pending_it != pending_ops_.end(); ++pending_it) {
282 // We are not notifying the transactions about the cache going away, even 287 // We are not notifying the transactions about the cache going away, even
283 // though they are waiting for a callback that will never fire. 288 // though they are waiting for a callback that will never fire.
284 PendingOp* pending_op = pending_it->second; 289 PendingOp* pending_op = pending_it->second;
285 delete pending_op->writer; 290 delete pending_op->writer;
286 delete pending_op->callback; 291 if (building_backend_) {
292 // If we don't have a backend, when its construction finishes it will
293 // deliver the callbacks.
294 BackendCallback* callback =
295 static_cast<BackendCallback*>(pending_op->callback);
296 callback->Cancel();
297 } else {
298 delete pending_op->callback;
299 }
287 300
288 STLDeleteElements(&pending_op->pending_queue); 301 STLDeleteElements(&pending_op->pending_queue);
289 delete pending_op; 302 delete pending_op;
290 } 303 }
291 } 304 }
292 305
293 int HttpCache::GetBackend(disk_cache::Backend** backend, 306 int HttpCache::GetBackend(disk_cache::Backend** backend,
294 CompletionCallback* callback) { 307 CompletionCallback* callback) {
295 DCHECK(callback != NULL); 308 DCHECK(callback != NULL);
296 309
(...skipping 704 matching lines...) Expand 10 before | Expand all | Expand 10 after
1001 // This could be an external caller or a transaction waiting on Start(). 1014 // This could be an external caller or a transaction waiting on Start().
1002 pending_item->DoCallback(result, temp_backend_); 1015 pending_item->DoCallback(result, temp_backend_);
1003 pending_item->NotifyTransaction(result, NULL); 1016 pending_item->NotifyTransaction(result, NULL);
1004 } 1017 }
1005 1018
1006 DeletePendingOp(pending_op); 1019 DeletePendingOp(pending_op);
1007 building_backend_ = false; 1020 building_backend_ = false;
1008 } 1021 }
1009 1022
1010 } // namespace net 1023 } // namespace net
OLDNEW
« no previous file with comments | « no previous file | net/http/http_cache_unittest.cc » ('j') | net/http/http_cache_unittest.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698