Index: sync/engine/net/server_connection_manager.cc |
diff --git a/sync/engine/net/server_connection_manager.cc b/sync/engine/net/server_connection_manager.cc |
index 0076543374fcdcedae2a86bfe62f2a1491ecb5e0..99e62b0659e4b789b2d470fab64c835dd53a4938 100644 |
--- a/sync/engine/net/server_connection_manager.cc |
+++ b/sync/engine/net/server_connection_manager.cc |
@@ -16,6 +16,7 @@ |
#include "net/http/http_status_code.h" |
#include "sync/engine/net/url_translator.h" |
#include "sync/engine/syncer.h" |
+#include "sync/internal_api/public/base/cancelation_signal.h" |
#include "sync/protocol/sync.pb.h" |
#include "sync/syncable/directory.h" |
#include "url/gurl.h" |
@@ -177,7 +178,8 @@ ServerConnectionManager::ServerConnectionManager( |
const string& server, |
int port, |
bool use_ssl, |
- bool use_oauth2_token) |
+ bool use_oauth2_token, |
+ CancelationSignal* cancelation_signal) |
: sync_server_(server), |
sync_server_port_(port), |
use_ssl_(use_ssl), |
@@ -185,10 +187,22 @@ ServerConnectionManager::ServerConnectionManager( |
proto_sync_path_(kSyncServerSyncPath), |
server_status_(HttpResponse::NONE), |
terminated_(false), |
- active_connection_(NULL) { |
+ active_connection_(NULL), |
+ cancelation_signal_(cancelation_signal), |
+ signal_handler_registered_(false) { |
+ signal_handler_registered_ = cancelation_signal_->TryRegisterHandler(this); |
+ if (!signal_handler_registered_) { |
+ // Calling a virtual function from a constructor. We can get away with it |
+ // here because ServerConnectionManager::OnSignalReceived() is the function |
+ // we want to call. |
+ OnSignalReceived(); |
+ } |
} |
ServerConnectionManager::~ServerConnectionManager() { |
+ if (signal_handler_registered_) { |
+ cancelation_signal_->UnregisterHandler(this); |
+ } |
} |
ServerConnectionManager::Connection* |
@@ -348,7 +362,7 @@ ServerConnectionManager::Connection* ServerConnectionManager::MakeConnection() |
return NULL; // For testing. |
} |
-void ServerConnectionManager::TerminateAllIO() { |
+void ServerConnectionManager::OnSignalReceived() { |
base::AutoLock lock(terminate_connection_lock_); |
terminated_ = true; |
if (active_connection_) |