pub struct SharedSnapshot {
pub sequence: AtomicU64,
pub magic: u32,
pub version: u32,
pub hot_cycle: AtomicU64,
pub hot_surprise_bits: AtomicU32,
pub hot_curiosity_bits: AtomicU32,
pub hot_predicted_hash: AtomicU64,
/* private fields */
}Expand description
96-byte snapshot of the consciousness stream. All fields are
pre-computed by the writer; readers do no derivation.
#[repr(C)] keeps the seqlock header and data block layout stable
(relevant if a future file-mmap layer is ever built).
The data fields live inside UnsafeCell so the writer can mutate them
through &self (required for the seqlock protocol). The seqlock
guarantees readers never see a torn write.
Fields§
§sequence: AtomicU64Seqlock counter. Even = stable, odd = write in progress.
magic: u32SNAPSHOT_MAGIC. Lets readers detect a fresh/uninitialized snapshot.
version: u32SNAPSHOT_VERSION. Bumped on layout change.
hot_cycle: AtomicU64Lock-free cycle counter. Readers can check freshness without seqlock.
hot_surprise_bits: AtomicU32Lock-free surprise level (f32 stored as u32 bits).
hot_curiosity_bits: AtomicU32Lock-free curiosity level (f32 stored as u32 bits).
hot_predicted_hash: AtomicU64Lock-free predicted query hash.
Implementations§
Sourcepub fn new_zeroed() -> Self
pub fn new_zeroed() -> Self
Build a zeroed snapshot, ready to be written.
Sourcepub fn begin_write(&self) -> u64
pub fn begin_write(&self) -> u64
Begin a write. Increments sequence to an odd value, returns the
value the writer must restore after the write to mark completion.
Caller MUST call end_write with the returned value, even on panic.
Sourcepub fn end_write(&self, expected: u64)
pub fn end_write(&self, expected: u64)
End a write. Stores an even sequence value, signaling readers that the data is consistent.
Sourcepub unsafe fn data_mut(&self) -> &mut SnapshotData
pub unsafe fn data_mut(&self) -> &mut SnapshotData
Get an exclusive &mut reference to the data block. The seqlock
protocol guarantees no reader can be accessing the data while this
is held (the sequence is odd, so readers retry).
§Safety
Caller must hold the seqlock by having called begin_write and
not yet called end_write. Only one writer at a time.
Sourcepub fn read_cached_format(&self) -> String
pub fn read_cached_format(&self) -> String
Read the pre-formatted consciousness string. O(1) clone, no format!(). This is the fastest path for the MCP tool: ~50-100ns per call.
Sourcepub fn read_hot_fields(&self) -> (u64, f32, f32, u64)
pub fn read_hot_fields(&self) -> (u64, f32, f32, u64)
Read hot fields atomically without seqlock. ~5-20ns. Returns (cycle, surprise, curiosity, predicted_hash).
Sourcepub fn is_fresh(&self, expected_cycle: u64) -> bool
pub fn is_fresh(&self, expected_cycle: u64) -> bool
Check if the snapshot is fresh (hot_cycle matches or exceeds expected).
Sourcepub fn set_cached_format(&self, s: String)
pub fn set_cached_format(&self, s: String)
Update cached format string. Called by the background cycle.
Sourcepub fn set_hot_fields(
&self,
cycle: u64,
surprise: f32,
curiosity: f32,
predicted_hash: u64,
)
pub fn set_hot_fields( &self, cycle: u64, surprise: f32, curiosity: f32, predicted_hash: u64, )
Update hot atomic fields. Called by the background cycle.
Sourcepub fn read(&self) -> Option<SnapshotData>
pub fn read(&self) -> Option<SnapshotData>
Read the snapshot. Returns None after SNAPSHOT_MAX_RETRIES torn reads.
The returned SnapshotData is a copy — no lock required to use it.
Trait Implementations§
Auto Trait Implementations§
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
impl<A, B, T> HttpServerConnExec<A, B> for Twhere
B: Body,
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
Source§fn in_current_span(self) -> Instrumented<Self> ⓘ
fn in_current_span(self) -> Instrumented<Self> ⓘ
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more