blob: 0fea8748254f4173c33735f97f629435c2f5d412 [file] [log] [blame]
// Copyright 2017 The Chromium OS 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 "virtual_file_provider/operation_throttle.h"
#include <base/bind.h>
#include <base/check_op.h>
namespace virtual_file_provider {
OperationThrottle::OperationThrottle(int max_operation_count)
: max_operation_count_(max_operation_count),
operation_count_changed_condition_(&lock_) {}
OperationThrottle::~OperationThrottle() {
DCHECK_EQ(0, operation_count_);
}
std::unique_ptr<base::ScopedClosureRunner> OperationThrottle::StartOperation() {
base::AutoLock lock(lock_);
while (operation_count_ >= max_operation_count_) {
operation_count_changed_condition_.Wait();
}
++operation_count_;
return std::make_unique<base::ScopedClosureRunner>(base::BindOnce(
&OperationThrottle::FinishOperation, base::Unretained(this)));
}
void OperationThrottle::FinishOperation() {
base::AutoLock lock(lock_);
--operation_count_;
operation_count_changed_condition_.Signal();
}
} // namespace virtual_file_provider