xo-gc/include/xo/gc/MutationLogEntry.hpp

70 lines
2.7 KiB
C++

/** @file MutationLogEntry.hpp
*
* @author Roland Conybeare, Mar 2026
**/
#pragma once
#include <xo/alloc2/GCObject.hpp>
namespace xo {
namespace mm {
class GCObjectStore; // see xo-gc/ GCObjectStore.hpp
/** @brief Track a cross-generational pointer
*
* GC must update pointer when collecting space that target occupies
*
* Design notes:
* - parent must be located at the beginning of an allocation,
* (so that it's immediately preceded by allocation header)
* - destination can be something like
* obj<AGCObject>
* but also something else such as
* {obj<AType>, obj<ASyntaxStateMachine>, ..}
* - for collector need to traverse data pointer *data
**/
class MutationLogEntry {
public:
using AGCObject = xo::mm::AGCObject;
public:
MutationLogEntry() = default;
MutationLogEntry(void * parent, void ** p_data, obj<AGCObject> snap);
void * parent() const { return parent_; }
void ** p_data() const { return p_data_; }
obj<AGCObject> snap() const { return snap_; }
/** true iff child pointer matches value when this mlog entry created **/
bool is_active() const noexcept { return *p_data_ == snap_.data(); }
/** true iff child pointer has been altered since this mlog entry created **/
bool is_superseded() const noexcept { return *p_data_ != snap_.data(); }
/** Refresh snapshot when *p_data_ does not match snap_.data_
* Get updated facet information from destination alloc header.
* It's possible that *p_data_ no longer points to gc-owned space
*
* @return true if snapshot updated. false if this entry should be discarded
**/
bool refresh_snapshot(Generation parent_gen,
GCObjectStore * gcos) noexcept;
private:
/** address of object containing logged mutation **/
void * parent_ = nullptr;
/** address of target member of object at address @ref parent_,
* driving this log entry.
**/
void ** p_data_ = nullptr;
/** AGCObject child pointer, asof assignment responsible for this log entry.
* If *p_data_ matches snap_.data(), then AGCObject interface is snap_.iface().
* Otherwise log entry has been superseded by another assignment.
**/
obj<AGCObject> snap_;
};
} /*namespace mm*/
} /*namespace xo*/
/* end MutationLogEntry.hpp */