Stuart Langley | f51f341 | 2018-05-08 23:43:04 | [diff] [blame] | 1 | // Copyright 2018 The Chromium Authors. All rights reserved. |
| 2 | // Use of this source code is governed by a BSD-style license that can be |
| 3 | // found in the LICENSE file. |
| 4 | |
| 5 | #include "components/drive/chromeos/loader_controller.h" |
| 6 | |
Stuart Langley | 38148efd | 2018-08-30 01:35:24 | [diff] [blame] | 7 | #include <utility> |
| 8 | |
Sebastien Marchand | 53801a3 | 2019-01-25 16:26:11 | [diff] [blame] | 9 | #include "base/bind.h" |
Stuart Langley | f51f341 | 2018-05-08 23:43:04 | [diff] [blame] | 10 | #include "base/callback_helpers.h" |
| 11 | |
| 12 | namespace drive { |
| 13 | namespace internal { |
| 14 | |
Jeremy Roman | 47d432e | 2019-08-20 14:24:00 | [diff] [blame] | 15 | LoaderController::LoaderController() : lock_count_(0) {} |
Stuart Langley | f51f341 | 2018-05-08 23:43:04 | [diff] [blame] | 16 | |
| 17 | LoaderController::~LoaderController() { |
| 18 | DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); |
| 19 | } |
| 20 | |
| 21 | std::unique_ptr<base::ScopedClosureRunner> LoaderController::GetLock() { |
| 22 | DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); |
| 23 | |
| 24 | ++lock_count_; |
| 25 | return std::make_unique<base::ScopedClosureRunner>(base::BindOnce( |
| 26 | &LoaderController::Unlock, weak_ptr_factory_.GetWeakPtr())); |
| 27 | } |
| 28 | |
Stuart Langley | 38148efd | 2018-08-30 01:35:24 | [diff] [blame] | 29 | void LoaderController::ScheduleRun(base::OnceClosure task) { |
Stuart Langley | f51f341 | 2018-05-08 23:43:04 | [diff] [blame] | 30 | DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); |
| 31 | DCHECK(task); |
| 32 | |
| 33 | if (lock_count_ > 0) { |
Stuart Langley | 38148efd | 2018-08-30 01:35:24 | [diff] [blame] | 34 | pending_tasks_.push_back(std::move(task)); |
Stuart Langley | f51f341 | 2018-05-08 23:43:04 | [diff] [blame] | 35 | } else { |
Stuart Langley | 38148efd | 2018-08-30 01:35:24 | [diff] [blame] | 36 | std::move(task).Run(); |
Stuart Langley | f51f341 | 2018-05-08 23:43:04 | [diff] [blame] | 37 | } |
| 38 | } |
| 39 | |
| 40 | void LoaderController::Unlock() { |
| 41 | DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); |
| 42 | DCHECK_LT(0, lock_count_); |
| 43 | |
| 44 | if (--lock_count_ > 0) |
| 45 | return; |
| 46 | |
Stuart Langley | 38148efd | 2018-08-30 01:35:24 | [diff] [blame] | 47 | std::vector<base::OnceClosure> tasks; |
Stuart Langley | f51f341 | 2018-05-08 23:43:04 | [diff] [blame] | 48 | tasks.swap(pending_tasks_); |
| 49 | for (auto& task : tasks) |
Stuart Langley | 38148efd | 2018-08-30 01:35:24 | [diff] [blame] | 50 | std::move(task).Run(); |
Stuart Langley | f51f341 | 2018-05-08 23:43:04 | [diff] [blame] | 51 | } |
| 52 | |
| 53 | } // namespace internal |
| 54 | } // namespace drive |