summaryrefslogtreecommitdiffstats
path: root/net/proxy
diff options
context:
space:
mode:
authoreroman@chromium.org <eroman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-10-20 19:32:43 +0000
committereroman@chromium.org <eroman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-10-20 19:32:43 +0000
commit770a28bb9e03a5761e8060d2037d2c360c227bf1 (patch)
tree43d6aedcd38febc978cfebe64ef8a87a8559a052 /net/proxy
parent8511b2c7075a3fbc9b27652deaab575f9d5ea49d (diff)
downloadchromium_src-770a28bb9e03a5761e8060d2037d2c360c227bf1.zip
chromium_src-770a28bb9e03a5761e8060d2037d2c360c227bf1.tar.gz
chromium_src-770a28bb9e03a5761e8060d2037d2c360c227bf1.tar.bz2
Fix a data race found by ThreadSanitizer in LoadLog::Release().
The scoped_refptr's destructor was being called at the very end of the function scope. This meant that worker_log->Release() was called *after* PostTask(). However since the posted task also called worker_log->Release() (but from a different thread) this was a race. BUG=22272 Review URL: http://codereview.chromium.org/308005 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@29551 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'net/proxy')
-rw-r--r--net/proxy/single_threaded_proxy_resolver.cc5
1 files changed, 3 insertions, 2 deletions
diff --git a/net/proxy/single_threaded_proxy_resolver.cc b/net/proxy/single_threaded_proxy_resolver.cc
index 02afcfc..ab13fa1 100644
--- a/net/proxy/single_threaded_proxy_resolver.cc
+++ b/net/proxy/single_threaded_proxy_resolver.cc
@@ -139,12 +139,13 @@ class SingleThreadedProxyResolver::Job
private:
// Runs on the worker thread.
void DoQuery(ProxyResolver* resolver) {
- scoped_refptr<LoadLog> worker_log(new LoadLog);
+ LoadLog* worker_log = new LoadLog;
+ worker_log->AddRef(); // Balanced in QueryComplete.
+
int rv = resolver->GetProxyForURL(url_, &results_buf_, NULL, NULL,
worker_log);
DCHECK_NE(rv, ERR_IO_PENDING);
- worker_log->AddRef(); // Balanced in QueryComplete.
origin_loop_->PostTask(FROM_HERE,
NewRunnableMethod(this, &Job::QueryComplete, rv, worker_log));
}