| Index: components/cronet/android/cronet_url_request_context_adapter.cc
|
| diff --git a/components/cronet/android/cronet_url_request_context_adapter.cc b/components/cronet/android/cronet_url_request_context_adapter.cc
|
| index eac1ea4f0c35d17b4e7719c70d6e212ab0357a31..c3dcc044e8596f8c5d7a92760bc3c11c48ca263c 100644
|
| --- a/components/cronet/android/cronet_url_request_context_adapter.cc
|
| +++ b/components/cronet/android/cronet_url_request_context_adapter.cc
|
| @@ -107,7 +107,12 @@ class BasicNetworkDelegate : public net::NetworkDelegateImpl {
|
|
|
| namespace cronet {
|
|
|
| -CronetURLRequestContextAdapter::CronetURLRequestContextAdapter() {
|
| +CronetURLRequestContextAdapter::CronetURLRequestContextAdapter()
|
| + : is_context_initialized_(false) {
|
| + network_thread_ = new base::Thread("network");
|
| + base::Thread::Options options;
|
| + options.message_loop_type = base::MessageLoop::TYPE_IO;
|
| + network_thread_->StartWithOptions(options);
|
| }
|
|
|
| CronetURLRequestContextAdapter::~CronetURLRequestContextAdapter() {
|
| @@ -115,14 +120,11 @@ CronetURLRequestContextAdapter::~CronetURLRequestContextAdapter() {
|
| StopNetLogOnNetworkThread();
|
| }
|
|
|
| -void CronetURLRequestContextAdapter::Initialize(
|
| +void CronetURLRequestContextAdapter::InitRequestContextOnMainThread(
|
| scoped_ptr<URLRequestContextConfig> config,
|
| const base::Closure& java_init_network_thread) {
|
| - network_thread_ = new base::Thread("network");
|
| - base::Thread::Options options;
|
| - options.message_loop_type = base::MessageLoop::TYPE_IO;
|
| - network_thread_->StartWithOptions(options);
|
| -
|
| + proxy_config_service_.reset(net::ProxyService::CreateSystemProxyConfigService(
|
| + GetNetworkTaskRunner(), NULL));
|
| GetNetworkTaskRunner()->PostTask(
|
| FROM_HERE,
|
| base::Bind(&CronetURLRequestContextAdapter::InitializeOnNetworkThread,
|
| @@ -189,6 +191,12 @@ void CronetURLRequestContextAdapter::InitializeOnNetworkThread(
|
| }
|
|
|
| java_init_network_thread.Run();
|
| +
|
| + is_context_initialized_ = true;
|
| + while (!tasks_waiting_for_context_.empty()) {
|
| + tasks_waiting_for_context_.front().Run();
|
| + tasks_waiting_for_context_.pop();
|
| + }
|
| }
|
|
|
| void CronetURLRequestContextAdapter::Destroy() {
|
| @@ -208,6 +216,25 @@ net::URLRequestContext* CronetURLRequestContextAdapter::GetURLRequestContext() {
|
| return context_.get();
|
| }
|
|
|
| +void CronetURLRequestContextAdapter::PostTaskToNetworkThread(
|
| + const tracked_objects::Location& posted_from,
|
| + const RunAfterContextInitTask& callback) {
|
| + GetNetworkTaskRunner()->PostTask(
|
| + posted_from, base::Bind(&CronetURLRequestContextAdapter::
|
| + RunTaskAfterContextInitOnNetworkThread,
|
| + base::Unretained(this), callback));
|
| +}
|
| +
|
| +void CronetURLRequestContextAdapter::RunTaskAfterContextInitOnNetworkThread(
|
| + const RunAfterContextInitTask& callback) {
|
| + DCHECK(GetNetworkTaskRunner()->BelongsToCurrentThread());
|
| + if (is_context_initialized_) {
|
| + callback.Run();
|
| + return;
|
| + }
|
| + tasks_waiting_for_context_.push(callback);
|
| +}
|
| +
|
| scoped_refptr<base::SingleThreadTaskRunner>
|
| CronetURLRequestContextAdapter::GetNetworkTaskRunner() const {
|
| return network_thread_->task_runner();
|
|
|