blob: 0e4df1714edae3f18ddf9e05a629249b52384ca8 [file] [log] [blame]
// Copyright 2020 the V8 project 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 V8_HEAP_INDEX_GENERATOR_H_
#define V8_HEAP_INDEX_GENERATOR_H_
#include <cstddef>
#include <queue>
#include <stack>
#include "src/base/macros.h"
#include "src/base/optional.h"
#include "src/base/platform/mutex.h"
namespace v8 {
namespace internal {
// A thread-safe data structure that generates heuristic starting points in a
// range to process items in parallel.
class V8_EXPORT_PRIVATE IndexGenerator {
public:
explicit IndexGenerator(size_t size);
IndexGenerator(const IndexGenerator&) = delete;
IndexGenerator& operator=(const IndexGenerator&) = delete;
base::Optional<size_t> GetNext();
void GiveBack(size_t index);
private:
base::Mutex lock_;
// Pending indices that are ready to be handed out, prioritized over
// |pending_ranges_| when non-empty.
std::stack<size_t> pending_indices_;
// Pending [start, end] (exclusive) ranges to split and hand out indices from.
std::queue<std::pair<size_t, size_t>> ranges_to_split_;
const size_t size_;
};
} // namespace internal
} // namespace v8
#endif // V8_HEAP_INDEX_GENERATOR_H_