#pragma once
#include <memory>
#include <vector>
#include "storage/page_range.h"
namespace lbug::storage {
class PageAllocator;
struct SegmentState;
class PageReclaimDeferral {
public:
static std::shared_ptr<PageReclaimDeferral> create();
void defer(PageRange range, PageAllocator& pageAllocator);
void defer(const SegmentState& state, PageAllocator& pageAllocator);
void discard();
void commit(std::shared_ptr<PageReclaimDeferral> next) {
committed = true;
successor = std::move(next);
}
~PageReclaimDeferral();
static PageReclaimDeferral*& current();
private:
struct Free {
PageRange range;
PageAllocator* pageAllocator;
};
std::vector<Free> frees;
bool committed = false;
std::shared_ptr<PageReclaimDeferral> successor;
};
class PageReclaimDeferralScope {
public:
explicit PageReclaimDeferralScope(PageReclaimDeferral* deferral)
: previous{PageReclaimDeferral::current()} {
PageReclaimDeferral::current() = deferral;
}
~PageReclaimDeferralScope() { PageReclaimDeferral::current() = previous; }
PageReclaimDeferralScope(const PageReclaimDeferralScope&) = delete;
PageReclaimDeferralScope& operator=(const PageReclaimDeferralScope&) = delete;
private:
PageReclaimDeferral* previous;
};
}