Index: net/proxy/proxy_service.cc |
=================================================================== |
--- net/proxy/proxy_service.cc (revision 51914) |
+++ net/proxy/proxy_service.cc (working copy) |
@@ -15,6 +15,7 @@ |
#include "net/base/net_errors.h" |
#include "net/base/net_util.h" |
#include "net/proxy/init_proxy_resolver.h" |
+#include "net/proxy/multi_threaded_proxy_resolver.h" |
#include "net/proxy/proxy_config_service_fixed.h" |
#include "net/proxy/proxy_script_fetcher.h" |
#if defined(OS_WIN) |
@@ -29,7 +30,6 @@ |
#include "net/proxy/proxy_resolver.h" |
#include "net/proxy/proxy_resolver_js_bindings.h" |
#include "net/proxy/proxy_resolver_v8.h" |
-#include "net/proxy/single_threaded_proxy_resolver.h" |
#include "net/proxy/sync_host_resolver_bridge.h" |
#include "net/url_request/url_request_context.h" |
@@ -75,6 +75,55 @@ |
} |
}; |
+// This factory creates V8ProxyResolvers with appropriate javascript bindings. |
+class ProxyResolverFactoryForV8 : public ProxyResolverFactory { |
+ public: |
+ // Both |async_host_resolver| and |host_resolver_loop| must remain valid for |
+ // duration of our lifetime. |
+ ProxyResolverFactoryForV8(HostResolver* async_host_resolver, |
+ MessageLoop* host_resolver_loop) |
+ : ProxyResolverFactory(true /*expects_pac_bytes*/), |
+ async_host_resolver_(async_host_resolver), |
+ host_resolver_loop_(host_resolver_loop) { |
+ } |
+ |
+ virtual ProxyResolver* CreateProxyResolver() { |
+ // Create a synchronous host resolver wrapper that operates |
+ // |async_host_resolver_| on |host_resolver_loop_|. |
+ SyncHostResolverBridge* sync_host_resolver = |
+ new SyncHostResolverBridge(async_host_resolver_, host_resolver_loop_); |
+ |
+ ProxyResolverJSBindings* js_bindings = |
+ ProxyResolverJSBindings::CreateDefault(sync_host_resolver); |
+ |
+ // ProxyResolverV8 takes ownership of |js_bindings|. |
+ return new ProxyResolverV8(js_bindings); |
+ } |
+ |
+ private: |
+ scoped_refptr<HostResolver> async_host_resolver_; |
+ MessageLoop* host_resolver_loop_; |
+}; |
+ |
+// Creates ProxyResolvers using a non-V8 implementation. |
+class ProxyResolverFactoryForNonV8 : public ProxyResolverFactory { |
+ public: |
+ ProxyResolverFactoryForNonV8() |
+ : ProxyResolverFactory(false /*expects_pac_bytes*/) {} |
+ |
+ virtual ProxyResolver* CreateProxyResolver() { |
+#if defined(OS_WIN) |
+ return new ProxyResolverWinHttp(); |
+#elif defined(OS_MACOSX) |
+ return new ProxyResolverMac(); |
+#else |
+ LOG(WARNING) << "PAC support disabled because there is no fallback " |
+ "non-V8 implementation"; |
+ return new ProxyResolverNull(); |
+#endif |
+ } |
+}; |
+ |
// ProxyService::PacRequest --------------------------------------------------- |
class ProxyService::PacRequest |
@@ -218,32 +267,22 @@ |
URLRequestContext* url_request_context, |
NetLog* net_log, |
MessageLoop* io_loop) { |
- ProxyResolver* proxy_resolver = NULL; |
+ ProxyResolverFactory* sync_resolver_factory; |
if (use_v8_resolver) { |
- // Use the IO thread's host resolver (but since it is not threadsafe, |
- // bridge requests from the PAC thread over to the IO thread). |
- SyncHostResolverBridge* sync_host_resolver = |
- new SyncHostResolverBridge(url_request_context->host_resolver(), |
- io_loop); |
- |
- // Send javascript errors and alerts to LOG(INFO). |
- ProxyResolverJSBindings* js_bindings = |
- ProxyResolverJSBindings::CreateDefault(sync_host_resolver); |
- |
- // Wrap the (synchronous) ProxyResolver implementation in a single-threaded |
- // asynchronous resolver. This version of SingleThreadedProxyResolver |
- // additionally aborts any synchronous host resolves to avoid deadlock |
- // during shutdown. |
- proxy_resolver = |
- new SingleThreadedProxyResolverUsingBridgedHostResolver( |
- new ProxyResolverV8(js_bindings), |
- sync_host_resolver); |
+ sync_resolver_factory = |
+ new ProxyResolverFactoryForV8( |
+ url_request_context->host_resolver(), |
+ io_loop); |
} else { |
- proxy_resolver = |
- new SingleThreadedProxyResolver(CreateNonV8ProxyResolver()); |
+ sync_resolver_factory = new ProxyResolverFactoryForNonV8(); |
} |
+ const size_t kMaxNumResolverThreads = 1u; |
+ ProxyResolver* proxy_resolver = |
+ new MultiThreadedProxyResolver(sync_resolver_factory, |
+ kMaxNumResolverThreads); |
+ |
ProxyService* proxy_service = |
new ProxyService(proxy_config_service, proxy_resolver, net_log); |
@@ -559,19 +598,6 @@ |
#endif |
} |
-// static |
-ProxyResolver* ProxyService::CreateNonV8ProxyResolver() { |
-#if defined(OS_WIN) |
- return new ProxyResolverWinHttp(); |
-#elif defined(OS_MACOSX) |
- return new ProxyResolverMac(); |
-#else |
- LOG(WARNING) << "PAC support disabled because there is no fallback " |
- "non-V8 implementation"; |
- return new ProxyResolverNull(); |
-#endif |
-} |
- |
void ProxyService::UpdateConfig(const BoundNetLog& net_log) { |
bool is_first_update = !config_has_been_initialized(); |