Chromium Code Reviews| Index: chrome/browser/sync_file_system/drive_backend/callback_tracker.cc |
| diff --git a/chrome/browser/sync_file_system/drive_backend/callback_tracker.cc b/chrome/browser/sync_file_system/drive_backend/callback_tracker.cc |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..6dd28327667f20031d8fd2c8273e8cc99bc705d0 |
| --- /dev/null |
| +++ b/chrome/browser/sync_file_system/drive_backend/callback_tracker.cc |
| @@ -0,0 +1,62 @@ |
| +// Copyright 2014 The Chromium Authors. All rights reserved. |
| +// Use of this source code is governed by a BSD-style license that can be |
| +// found in the LICENSE file. |
| + |
| +#include "chrome/browser/sync_file_system/drive_backend/callback_tracker.h" |
| + |
| +#include <algorithm> |
| + |
| +namespace sync_file_system { |
| +namespace drive_backend { |
| + |
| +namespace internal { |
| + |
| +AbortHelper::AbortHelper(CallbackTracker* tracker) |
|
nhiroki
2014/06/04 09:16:47
Why don't you move these definitions of AbortHelpe
tzik
2014/06/04 09:45:24
Done.
|
| + : tracker_(tracker), weak_ptr_factory_(this) { |
| +} |
| + |
| +AbortHelper::~AbortHelper() {} |
| + |
| +base::WeakPtr<AbortHelper> AbortHelper::AsWeakPtr() { |
| + return weak_ptr_factory_.GetWeakPtr(); |
| +} |
| + |
| +// static |
| +scoped_ptr<AbortHelper> AbortHelper::TakeOwnership( |
| + const base::WeakPtr<AbortHelper>& abort_helper) { |
| + if (!abort_helper) |
| + return scoped_ptr<AbortHelper>(); |
| + scoped_ptr<AbortHelper> result = |
| + abort_helper->tracker_->PassAbortHelper(abort_helper.get()); |
| + abort_helper->weak_ptr_factory_.InvalidateWeakPtrs(); |
| + return result.Pass(); |
| +} |
| + |
| +} // namespace internal |
| + |
| +CallbackTracker::CallbackTracker() { |
| +} |
| + |
| +CallbackTracker::~CallbackTracker() { |
| + AbortAll(); |
| +} |
| + |
| +void CallbackTracker::AbortAll() { |
| + AbortClosureByHelper helpers; |
| + std::swap(helpers, helpers_); |
| + for (AbortClosureByHelper::iterator itr = helpers.begin(); |
| + itr != helpers.end(); ++itr) { |
| + delete itr->first; |
| + itr->second.Run(); |
| + } |
| +} |
| + |
| +scoped_ptr<internal::AbortHelper> CallbackTracker::PassAbortHelper( |
| + internal::AbortHelper* helper) { |
| + if (helpers_.erase(helper) == 1) |
| + return scoped_ptr<internal::AbortHelper>(helper); |
| + return scoped_ptr<internal::AbortHelper>(); |
| +} |
| + |
| +} // namespace drive_backend |
| +} // namespace sync_file_system |