2#include "pedigree/kernel/LockGuard.h"
3#include "pedigree/kernel/process/Rcu.h"
4#include "pedigree/kernel/process/TerminationDeferral.h"
5#include "pedigree/kernel/processor/Processor.h"
6#include "pedigree/kernel/processor/ProcessorInformation.h"
8RcuReadGuard::RcuReadGuard() : m_State(nullptr), m_Interrupts(
Processor::getInterrupts()) {
11 panic(
"RCU requires completed processor discovery.");
14 if (!Processor::onHostedExecutionThread()) {
15 panic(
"RCU guard requires the hosted execution thread.");
22RcuReadGuard::~RcuReadGuard() {
24 panic(
"RCU reader changed its execution context.");
30void Rcu::synchronize() {
32 panic(
"RCU grace period requires initialized processors and no local reader.");
38 const auto before = state.snapshot();
39 while (!state.passed(before)) {
45RcuRetireQueue::~RcuRetireQueue() {
49void RcuRetireQueue::retire(
void*
object, Reclaim reclaim) {
53 panic(
"RCU retirement requires a callback and ordinary task context.");
57 if (m_Count == Capacity) {
60 m_Entries[m_Count++] = {object, reclaim};
63void RcuRetireQueue::drain() {
66 panic(
"RCU reclamation requires ordinary task context.");
73void RcuRetireQueue::drainLocked() {
78 for (
size_t i = 0; i < m_Count; ++i) {
79 m_Entries[i].reclaim(m_Entries[i].
object);
static bool getInterrupts()
static ProcessorInformation & information()
static size_t m_Initialised
static bool inDeviceHardIrq()
static ProcessorInformation * informationAt(size_t cpu)
static void setInterrupts(bool bEnable)
void EXPORTED_PUBLIC panic(const char *msg) NORETURN