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

Unified Diff: net/base/cert_verifier.cc

Issue 5347001: Fix shutdown crash in CertVerifier by using a MessageLoopProxy. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Add DCHECK Created 10 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: net/base/cert_verifier.cc
diff --git a/net/base/cert_verifier.cc b/net/base/cert_verifier.cc
index 4e941335653adea573ae13ae3dadcb18ebed3c01..d5acd99faa47db5e260b7953e8d84f9097fa34ae 100644
--- a/net/base/cert_verifier.cc
+++ b/net/base/cert_verifier.cc
@@ -9,6 +9,7 @@
#endif
#include "base/message_loop.h"
wtc 2010/11/23 19:17:13 Nit: you should be able to remove #include "base/m
willchan no longer on Chromium 2010/11/23 20:32:42 Done.
+#include "base/message_loop_proxy.h"
#include "base/worker_pool.h"
#include "net/base/cert_verify_result.h"
#include "net/base/net_errors.h"
@@ -31,7 +32,7 @@ class CertVerifier::Request :
verifier_(verifier),
verify_result_(verify_result),
callback_(callback),
- origin_loop_(MessageLoop::current()),
+ origin_loop_(base::MessageLoopProxy::CreateForCurrentThread()),
wtc 2010/11/23 19:17:13 It would be nice to update the comment in message_
willchan no longer on Chromium 2010/11/23 20:32:42 Done.
error_(OK) {
}
@@ -49,20 +50,16 @@ class CertVerifier::Request :
PR_DetachThread();
#endif
- Task* reply = NewRunnableMethod(this, &Request::DoCallback);
+ scoped_ptr<Task> reply(NewRunnableMethod(this, &Request::DoCallback));
// The origin loop could go away while we are trying to post to it, so we
// need to call its PostTask method inside a lock. See ~CertVerifier.
- {
- AutoLock locked(origin_loop_lock_);
- if (origin_loop_) {
- origin_loop_->PostTask(FROM_HERE, reply);
- reply = NULL;
- }
+ AutoLock locked(origin_loop_lock_);
+ if (origin_loop_) {
+ bool posted = origin_loop_->PostTask(FROM_HERE, reply.release());
+ // Try to catch leaked CertVerifiers on shutdown with this DCHECK.
+ DCHECK(posted);
wtc 2010/11/23 19:17:13 I suggest using an LOG(ERROR) or LOG(WARNING) mess
willchan no longer on Chromium 2010/11/23 20:32:42 Done.
}
-
- // Does nothing if it got posted.
- delete reply;
}
void DoCallback() {
@@ -107,7 +104,9 @@ class CertVerifier::Request :
// Used to post ourselves onto the origin thread.
Lock origin_loop_lock_;
- MessageLoop* origin_loop_;
+ // Use a MessageLoopProxy in case the owner of the CertVerifier is leaked, so
wtc 2010/11/23 19:17:13 This comment should elaborate on how a leaked owne
willchan no longer on Chromium 2010/11/23 20:32:42 Done.
+ // this code won't crash: http://crbug.com/42275.
+ scoped_refptr<base::MessageLoopProxy> origin_loop_;
wtc 2010/11/23 19:17:13 Should we rename this member origin_loop_proxy_?
willchan no longer on Chromium 2010/11/23 20:32:42 Done.
// Assigned on the worker thread, read on the origin thread.
int error_;
« 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