Index: chrome/browser/sync_file_system/sync_file_system_service.cc |
diff --git a/chrome/browser/sync_file_system/sync_file_system_service.cc b/chrome/browser/sync_file_system/sync_file_system_service.cc |
index 2750e9cad0f9e437fd5af9730a71e1e1aaed2ff8..1876141754a06b8ffe1748d14f39e0c2e3f7f5b7 100644 |
--- a/chrome/browser/sync_file_system/sync_file_system_service.cc |
+++ b/chrome/browser/sync_file_system/sync_file_system_service.cc |
@@ -36,10 +36,15 @@ class SharedCallbackRunner |
: public base::RefCounted<SharedCallbackRunner>, |
public base::NonThreadSafe { |
public: |
- SharedCallbackRunner(const SyncStatusCallback& join_callback) |
+ explicit SharedCallbackRunner(const SyncStatusCallback& join_callback) |
: join_callback_(join_callback), |
num_shared_callbacks_(0) {} |
+ SyncStatusCallback CreateCallback() { |
+ ++num_shared_callbacks_; |
+ return base::Bind(&SharedCallbackRunner::Done, this); |
+ } |
+ |
template <typename R> |
base::Callback<void(SyncStatusCode, const R& in)> |
CreateAssignAndRunCallback(R* out) { |
@@ -58,6 +63,10 @@ class SharedCallbackRunner |
if (join_callback_.is_null()) |
return; |
*out = in; |
+ Done(status); |
+ } |
+ |
+ void Done(SyncStatusCode status) { |
if (status != fileapi::SYNC_STATUS_OK) { |
join_callback_.Run(status); |
join_callback_.Reset(); |
@@ -128,13 +137,15 @@ void SyncFileSystemService::InitializeForApp( |
return; |
} |
+ scoped_refptr<SharedCallbackRunner> callback_runner( |
+ new SharedCallbackRunner(callback)); |
local_file_service_->MaybeInitializeFileSystemContext( |
- app_origin, service_name, file_system_context, callback); |
+ app_origin, service_name, file_system_context, |
+ callback_runner->CreateCallback()); |
if (remote_file_service_) { |
- // TODO(tzik): Handle errors in the completion callback. |
remote_file_service_->RegisterOriginForTrackingChanges( |
- app_origin, fileapi::SyncStatusCallback()); |
+ app_origin, callback_runner->CreateCallback()); |
} |
} |