blob: 3486932fe1fddad2c853b8e04f1a41d5c7fb925d [file] [log] [blame]
// Copyright (c) 2021 The Chromium 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 BASE_ALLOCATOR_PARTITION_ALLOCATOR_STARSCAN_SNAPSHOT_H_
#define BASE_ALLOCATOR_PARTITION_ALLOCATOR_STARSCAN_SNAPSHOT_H_
#include <memory>
#include <utility>
#include "base/allocator/partition_allocator/starscan/pcscan_internal.h"
#include "base/allocator/partition_allocator/starscan/raceful_worklist.h"
namespace partition_alloc::internal {
class StarScanSnapshot final : public AllocatedOnPCScanMetadataPartition {
public:
using SuperPageBase = uintptr_t;
using SuperPagesWorklist = RacefulWorklist<SuperPageBase>;
class ViewBase {
public:
template <typename Function>
void VisitConcurrently(Function);
template <typename Function>
void VisitNonConcurrently(Function);
protected:
explicit ViewBase(SuperPagesWorklist& worklist) : worklist_(worklist) {}
private:
SuperPagesWorklist& worklist_;
};
class ClearingView : public ViewBase {
public:
inline explicit ClearingView(StarScanSnapshot& snapshot);
};
class ScanningView : public ViewBase {
public:
inline explicit ScanningView(StarScanSnapshot& snapshot);
};
class SweepingView : public ViewBase {
public:
inline explicit SweepingView(StarScanSnapshot& snapshot);
};
class UnprotectingView : public ViewBase {
public:
inline explicit UnprotectingView(StarScanSnapshot& snapshot);
};
static std::unique_ptr<StarScanSnapshot> Create(const PCScanInternal&);
StarScanSnapshot(const StarScanSnapshot&) = delete;
StarScanSnapshot& operator=(const StarScanSnapshot&) = delete;
~StarScanSnapshot();
private:
explicit StarScanSnapshot(const PCScanInternal&);
SuperPagesWorklist clear_worklist_;
SuperPagesWorklist scan_worklist_;
SuperPagesWorklist unprotect_worklist_;
SuperPagesWorklist sweep_worklist_;
};
template <typename Function>
void StarScanSnapshot::ViewBase::VisitConcurrently(Function f) {
SuperPagesWorklist::RandomizedView view(worklist_);
view.Visit(std::move(f));
}
template <typename Function>
void StarScanSnapshot::ViewBase::VisitNonConcurrently(Function f) {
worklist_.VisitNonConcurrently(std::move(f));
}
StarScanSnapshot::ClearingView::ClearingView(StarScanSnapshot& snapshot)
: StarScanSnapshot::ViewBase(snapshot.clear_worklist_) {}
StarScanSnapshot::ScanningView::ScanningView(StarScanSnapshot& snapshot)
: StarScanSnapshot::ViewBase(snapshot.scan_worklist_) {}
StarScanSnapshot::SweepingView::SweepingView(StarScanSnapshot& snapshot)
: StarScanSnapshot::ViewBase(snapshot.sweep_worklist_) {}
StarScanSnapshot::UnprotectingView::UnprotectingView(StarScanSnapshot& snapshot)
: StarScanSnapshot::ViewBase(snapshot.unprotect_worklist_) {}
} // namespace partition_alloc::internal
#endif // BASE_ALLOCATOR_PARTITION_ALLOCATOR_STARSCAN_SNAPSHOT_H_