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;
12mod heap;
13
14pub use collector::{collect, collect_with_finalization};
15pub use correctness::CorrectnessDimension;
16pub use finalization::{FinalizationRecord, FinalizationRegistry};
17pub use heap::{ManagedHeap, ManagedHeapPolicy};
18
19#[derive(Clone, Copy, Debug, Eq, PartialEq)]
21pub struct CollectionLimits {
22 pub objects: usize,
24 pub edges: usize,
26 pub stack: usize,
28 pub work: usize,
30 pub clears: usize,
32 pub finalizers: usize,
34}
35
36#[derive(Clone, Copy, Debug, Eq, PartialEq)]
38pub enum LimitKind {
39 Objects,
41 Edges,
43 Stack,
45 Work,
47 Clears,
49 Finalizers,
51}
52
53#[derive(Clone, Debug, Eq, PartialEq)]
55pub struct FailureReceipt {
56 pub mutation_epoch: u64,
58 pub kind: LimitKind,
60 pub limit: usize,
62 pub required: usize,
64}
65
66#[derive(Clone, Debug, Eq, PartialEq)]
68pub struct CollectionReceipt {
69 pub mutation_epoch: u64,
71 pub marked: Vec<ManagedId>,
73 pub swept: Vec<ManagedId>,
75 pub edges: usize,
77 pub work: usize,
79 pub cleared_weak: Vec<(ManagedId, EdgeId)>,
81 pub cleared_ephemerons: Vec<(ManagedId, EdgeId)>,
83 pub finalization: Vec<FinalizationRecord>,
85}
86
87#[derive(Clone, Debug, Eq, PartialEq)]
89pub enum CollectionError {
90 Limit(FailureReceipt),
92 Arena(ArenaError),
94}
95
96impl fmt::Display for CollectionError {
97 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
98 match self {
99 Self::Limit(r) => write!(
100 f,
101 "collection {:?} limit {} requires {}",
102 r.kind, r.limit, r.required
103 ),
104 Self::Arena(error) => error.fmt(f),
105 }
106 }
107}
108impl Error for CollectionError {}
109impl From<ArenaError> for CollectionError {
110 fn from(value: ArenaError) -> Self {
111 Self::Arena(value)
112 }
113}
114
115#[cfg(test)]
116mod tests;