| Index: sync/internal_api/http_bridge.cc
|
| diff --git a/sync/internal_api/http_bridge.cc b/sync/internal_api/http_bridge.cc
|
| index 0b3697fb4b24e02ef6c8bb460069ed4977140496..48305eb0c9c6147216db09ffafeebd08effa76d6 100644
|
| --- a/sync/internal_api/http_bridge.cc
|
| +++ b/sync/internal_api/http_bridge.cc
|
| @@ -19,6 +19,7 @@
|
| #include "net/url_request/url_fetcher.h"
|
| #include "net/url_request/url_request_context.h"
|
| #include "net/url_request/url_request_status.h"
|
| +#include "sync/internal_api/public/base/cancelation_signal.h"
|
|
|
| namespace syncer {
|
|
|
| @@ -58,20 +59,45 @@ HttpBridge::RequestContextGetter::GetNetworkTaskRunner() const {
|
|
|
| HttpBridgeFactory::HttpBridgeFactory(
|
| net::URLRequestContextGetter* baseline_context_getter,
|
| - const std::string& user_agent,
|
| - const NetworkTimeUpdateCallback& network_time_update_callback)
|
| - : request_context_getter_(
|
| - new HttpBridge::RequestContextGetter(
|
| - baseline_context_getter, user_agent)),
|
| - network_time_update_callback_(network_time_update_callback) {
|
| + const NetworkTimeUpdateCallback& network_time_update_callback,
|
| + CancelationSignal* cancelation_signal)
|
| + : baseline_request_context_getter_(baseline_context_getter),
|
| + network_time_update_callback_(network_time_update_callback),
|
| + cancelation_signal_(cancelation_signal) {
|
| + // Registration should never fail. This should happen on the UI thread during
|
| + // init. It would be impossible for a shutdown to have been requested at this
|
| + // point.
|
| + bool result = cancelation_signal_->TryRegisterHandler(this);
|
| + DCHECK(result);
|
| }
|
|
|
| HttpBridgeFactory::~HttpBridgeFactory() {
|
| + cancelation_signal_->UnregisterHandler(this);
|
| +}
|
| +
|
| +void HttpBridgeFactory::Init(const std::string& user_agent) {
|
| + base::AutoLock lock(context_getter_lock_);
|
| +
|
| + if (!baseline_request_context_getter_.get()) {
|
| + // Uh oh. We've been aborted before we finsihed initializing.
|
| + // There's no point in initializating further; let's just return
|
| + // right away.
|
| + }
|
| +
|
| + request_context_getter_ =
|
| + new HttpBridge::RequestContextGetter(
|
| + baseline_request_context_getter_, user_agent);
|
| }
|
|
|
| HttpPostProviderInterface* HttpBridgeFactory::Create() {
|
| base::AutoLock lock(context_getter_lock_);
|
| +
|
| + // If we've been asked to shut down (something which may happen asynchronously
|
| + // and at pretty much any time), then we won't have a request_context_getter_.
|
| + // Some external mechanism must ensure that this function is not called after
|
| + // we've been asked to shut down.
|
| CHECK(request_context_getter_.get());
|
| +
|
| HttpBridge* http = new HttpBridge(request_context_getter_.get(),
|
| network_time_update_callback_);
|
| http->AddRef();
|
| @@ -82,10 +108,13 @@ void HttpBridgeFactory::Destroy(HttpPostProviderInterface* http) {
|
| static_cast<HttpBridge*>(http)->Release();
|
| }
|
|
|
| -void HttpBridgeFactory::Shutdown() {
|
| +void HttpBridgeFactory::OnSignalReceived() {
|
| base::AutoLock lock(context_getter_lock_);
|
| - // Release |request_context_getter_| as soon as possible so that it is
|
| - // destroyed in the right order on its network task runner.
|
| + // Release |baseline_request_context_getter_| as soon as possible so that it
|
| + // is destroyed in the right order on its network task runner. The
|
| + // |request_context_getter_| has a reference to the baseline, so we must
|
| + // drop our reference to it, too.
|
| + baseline_request_context_getter_ = NULL;
|
| request_context_getter_ = NULL;
|
| }
|
|
|
|
|