diff options
Diffstat (limited to 'sync/internal_api/http_bridge.cc')
-rw-r--r-- | sync/internal_api/http_bridge.cc | 47 |
1 files changed, 38 insertions, 9 deletions
diff --git a/sync/internal_api/http_bridge.cc b/sync/internal_api/http_bridge.cc index 0b3697f..48305eb 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; } |