blob: 639824e14d61303e3a269164fd3e965be45c5d47 [file] [log] [blame]
Stuart Langleyf51f3412018-05-08 23:43:041// 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 Langley38148efd2018-08-30 01:35:247#include <utility>
8
Sebastien Marchand53801a32019-01-25 16:26:119#include "base/bind.h"
Stuart Langleyf51f3412018-05-08 23:43:0410#include "base/callback_helpers.h"
11
12namespace drive {
13namespace internal {
14
Jeremy Roman47d432e2019-08-20 14:24:0015LoaderController::LoaderController() : lock_count_(0) {}
Stuart Langleyf51f3412018-05-08 23:43:0416
17LoaderController::~LoaderController() {
18 DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
19}
20
21std::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 Langley38148efd2018-08-30 01:35:2429void LoaderController::ScheduleRun(base::OnceClosure task) {
Stuart Langleyf51f3412018-05-08 23:43:0430 DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
31 DCHECK(task);
32
33 if (lock_count_ > 0) {
Stuart Langley38148efd2018-08-30 01:35:2434 pending_tasks_.push_back(std::move(task));
Stuart Langleyf51f3412018-05-08 23:43:0435 } else {
Stuart Langley38148efd2018-08-30 01:35:2436 std::move(task).Run();
Stuart Langleyf51f3412018-05-08 23:43:0437 }
38}
39
40void 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 Langley38148efd2018-08-30 01:35:2447 std::vector<base::OnceClosure> tasks;
Stuart Langleyf51f3412018-05-08 23:43:0448 tasks.swap(pending_tasks_);
49 for (auto& task : tasks)
Stuart Langley38148efd2018-08-30 01:35:2450 std::move(task).Run();
Stuart Langleyf51f3412018-05-08 23:43:0451}
52
53} // namespace internal
54} // namespace drive