sim_lib_gc_tracing/
lib.rs1#![forbid(unsafe_code)]
2#![deny(missing_docs)]
3use std::{error::Error, fmt};
6
7use sim_lib_mutation::{ArenaError, EdgeId, ManagedId};
8
9mod collector;
10mod correctness;
11mod finalization;
12
13pub use collector::{collect, collect_with_finalization};
14pub use correctness::CorrectnessDimension;
15pub use finalization::{FinalizationRecord, FinalizationRegistry};
16
17#[derive(Clone, Copy, Debug, Eq, PartialEq)]
19pub struct CollectionLimits {
20 pub objects: usize,
22 pub edges: usize,
24 pub stack: usize,
26 pub work: usize,
28 pub clears: usize,
30 pub finalizers: usize,
32}
33
34#[derive(Clone, Copy, Debug, Eq, PartialEq)]
36pub enum LimitKind {
37 Objects,
39 Edges,
41 Stack,
43 Work,
45 Clears,
47 Finalizers,
49}
50
51#[derive(Clone, Debug, Eq, PartialEq)]
53pub struct FailureReceipt {
54 pub mutation_epoch: u64,
56 pub kind: LimitKind,
58 pub limit: usize,
60 pub required: usize,
62}
63
64#[derive(Clone, Debug, Eq, PartialEq)]
66pub struct CollectionReceipt {
67 pub mutation_epoch: u64,
69 pub marked: Vec<ManagedId>,
71 pub swept: Vec<ManagedId>,
73 pub edges: usize,
75 pub work: usize,
77 pub cleared_weak: Vec<(ManagedId, EdgeId)>,
79 pub cleared_ephemerons: Vec<(ManagedId, EdgeId)>,
81 pub finalization: Vec<FinalizationRecord>,
83}
84
85#[derive(Clone, Debug, Eq, PartialEq)]
87pub enum CollectionError {
88 Limit(FailureReceipt),
90 Arena(ArenaError),
92}
93
94impl fmt::Display for CollectionError {
95 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
96 match self {
97 Self::Limit(r) => write!(
98 f,
99 "collection {:?} limit {} requires {}",
100 r.kind, r.limit, r.required
101 ),
102 Self::Arena(error) => error.fmt(f),
103 }
104 }
105}
106impl Error for CollectionError {}
107impl From<ArenaError> for CollectionError {
108 fn from(value: ArenaError) -> Self {
109 Self::Arena(value)
110 }
111}
112
113#[cfg(test)]
114mod tests;