blob: 8d071a6e74fee3742fa87337a7da0d72867b1694 [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.
#ifndef VIRTUAL_FILE_PROVIDER_OPERATION_THROTTLE_H_
#define VIRTUAL_FILE_PROVIDER_OPERATION_THROTTLE_H_
#include <memory>
#include <base/callback_helpers.h>
#include <base/synchronization/condition_variable.h>
#include <base/synchronization/lock.h>
namespace virtual_file_provider {
// OperationThrottle limits the number of operations running at the same time,
// by blocking new operations until existing one finishes.
class OperationThrottle {
public:
explicit OperationThrottle(int max_operation_count);
~OperationThrottle();
// Increments the operation counter, possibly after blocking the caller until
// other operations finish.
// The caller should keep the returned object alive until the operation
// finishes.
std::unique_ptr<base::ScopedClosureRunner> StartOperation();
private:
void FinishOperation();
const int max_operation_count_;
int operation_count_ = 0;
base::Lock lock_;
base::ConditionVariable operation_count_changed_condition_;
DISALLOW_COPY_AND_ASSIGN(OperationThrottle);
};
} // namespace virtual_file_provider
#endif // VIRTUAL_FILE_PROVIDER_OPERATION_THROTTLE_H_