Trait Trace

Source
pub trait Trace: 'static {
    // Provided methods
    fn trace(&self, tracer: &mut Tracer<'_>) { ... }
    fn is_type_tracked() -> bool
       where Self: Sized { ... }
}
Expand description

Defines how the cycle collector should collect a type.

§The 'static bound

Types tracked by the collector can potentially be kept alive forever. Therefore types with non-static references are not allowed.

Provided Methods§

Source

fn trace(&self, tracer: &mut Tracer<'_>)

Define how to visit values referred by this value.

For example, if self.x is a value referred by self, call self.x.trace(tracer) to visit it.

The values that are visited must match the Drop::drop implementation. Otherwise memory leak or panic might happen. After the panic, dereferencing already collected Cc<T> can trigger:

  • Undefined behavior on release build.
  • Another panic on debug build.

Ideally this can be generated by the compiler, since the compiler already knows how to generate Drop::drop.

Source

fn is_type_tracked() -> bool
where Self: Sized,

Whether this type should be tracked by the collector.

Types that might include Cc<T> where T can form a cycle should be tracked. This allows the collector to visit the Cc values from its parents and count references correctly.

If a type T is tracked, Cc<T> will be 3 usize larger and the collector will check them.

For example,

  • Vec<u8> is not tracked. It does include any kind of Cc<T>.
  • Box<Cc<u8>> is not tracked. It includes Cc<u8> but u8 cannot create cycles.
  • Box<dyn Trace> is tracked. The trait object can be anything, including any kinds of types that contains a Cc<T>.

Usually, concrete Rust types can opt-out the cycle collector. There are a few exceptions:

  • Trait objects, and types containing trait objects. Trait objects can be anything so they should be tracked.
  • Recursive types. Such as, struct S(RefCell<Option<Rc<Box<S>>>>). Those types need an explicit name like S, and a manual implementation of the Trace trait. That implementation should make is_type_tracked return true directly.

This is an optimization for performance. When in-doubt, return true for correctness.

Trait Implementations§

Source§

impl Trace for Box<dyn Trace>

Source§

fn trace(&self, tracer: &mut Tracer<'_>)

Define how to visit values referred by this value. Read more
Source§

fn is_type_tracked() -> bool

Whether this type should be tracked by the collector. Read more
Source§

impl Trace for Box<dyn Trace + Send>

Source§

fn trace(&self, tracer: &mut Tracer<'_>)

Define how to visit values referred by this value. Read more
Source§

fn is_type_tracked() -> bool

Whether this type should be tracked by the collector. Read more
Source§

impl Trace for Box<dyn Trace + Send + Sync>

Source§

fn trace(&self, tracer: &mut Tracer<'_>)

Define how to visit values referred by this value. Read more
Source§

fn is_type_tracked() -> bool

Whether this type should be tracked by the collector. Read more

Implementations on Foreign Types§

Source§

impl Trace for &'static str

Source§

fn is_type_tracked() -> bool
where Self: Sized,

Source§

impl Trace for bool

Source§

fn is_type_tracked() -> bool
where Self: Sized,

Source§

impl Trace for char

Source§

fn is_type_tracked() -> bool
where Self: Sized,

Source§

impl Trace for f32

Source§

fn is_type_tracked() -> bool
where Self: Sized,

Source§

impl Trace for f64

Source§

fn is_type_tracked() -> bool
where Self: Sized,

Source§

impl Trace for i8

Source§

fn is_type_tracked() -> bool
where Self: Sized,

Source§

impl Trace for i16

Source§

fn is_type_tracked() -> bool
where Self: Sized,

Source§

impl Trace for i32

Source§

fn is_type_tracked() -> bool
where Self: Sized,

Source§

impl Trace for i64

Source§

fn is_type_tracked() -> bool
where Self: Sized,

Source§

impl Trace for isize

Source§

fn is_type_tracked() -> bool
where Self: Sized,

Source§

impl Trace for u8

Source§

fn is_type_tracked() -> bool
where Self: Sized,

Source§

impl Trace for u16

Source§

fn is_type_tracked() -> bool
where Self: Sized,

Source§

impl Trace for u32

Source§

fn is_type_tracked() -> bool
where Self: Sized,

Source§

impl Trace for u64

Source§

fn is_type_tracked() -> bool
where Self: Sized,

Source§

impl Trace for ()

Source§

fn is_type_tracked() -> bool
where Self: Sized,

Source§

impl Trace for usize

Source§

fn is_type_tracked() -> bool
where Self: Sized,

Source§

impl Trace for Box<dyn Trace + Send + Sync>

Source§

fn trace(&self, tracer: &mut Tracer<'_>)

Source§

fn is_type_tracked() -> bool

Source§

impl Trace for Box<dyn Trace + Send>

Source§

fn trace(&self, tracer: &mut Tracer<'_>)

Source§

fn is_type_tracked() -> bool

Source§

impl Trace for Box<dyn Trace>

Source§

fn trace(&self, tracer: &mut Tracer<'_>)

Source§

fn is_type_tracked() -> bool

Source§

impl Trace for CString

Source§

fn is_type_tracked() -> bool
where Self: Sized,

Source§

impl Trace for NulError

Source§

fn is_type_tracked() -> bool
where Self: Sized,

Source§

impl Trace for String

Source§

fn is_type_tracked() -> bool
where Self: Sized,

Source§

impl Trace for Ipv4Addr

Source§

fn is_type_tracked() -> bool
where Self: Sized,

Source§

impl Trace for Ipv6Addr

Source§

fn is_type_tracked() -> bool
where Self: Sized,

Source§

impl Trace for AddrParseError

Source§

fn is_type_tracked() -> bool
where Self: Sized,

Source§

impl Trace for SocketAddrV4

Source§

fn is_type_tracked() -> bool
where Self: Sized,

Source§

impl Trace for SocketAddrV6

Source§

fn is_type_tracked() -> bool
where Self: Sized,

Source§

impl Trace for OsString

Source§

fn is_type_tracked() -> bool
where Self: Sized,

Source§

impl Trace for TcpListener

Source§

fn is_type_tracked() -> bool
where Self: Sized,

Source§

impl Trace for TcpStream

Source§

fn is_type_tracked() -> bool
where Self: Sized,

Source§

impl Trace for UdpSocket

Source§

fn is_type_tracked() -> bool
where Self: Sized,

Source§

impl Trace for PathBuf

Source§

fn is_type_tracked() -> bool
where Self: Sized,

Source§

impl Trace for Child

Source§

fn is_type_tracked() -> bool
where Self: Sized,

Source§

impl Trace for ChildStderr

Source§

fn is_type_tracked() -> bool
where Self: Sized,

Source§

impl Trace for ChildStdin

Source§

fn is_type_tracked() -> bool
where Self: Sized,

Source§

impl Trace for ChildStdout

Source§

fn is_type_tracked() -> bool
where Self: Sized,

Source§

impl Trace for Command

Source§

fn is_type_tracked() -> bool
where Self: Sized,

Source§

impl Trace for ExitStatus

Source§

fn is_type_tracked() -> bool
where Self: Sized,

Source§

impl Trace for Output

Source§

fn is_type_tracked() -> bool
where Self: Sized,

Source§

impl Trace for Stdio

Source§

fn is_type_tracked() -> bool
where Self: Sized,

Source§

impl Trace for Thread

Source§

fn is_type_tracked() -> bool
where Self: Sized,

Source§

impl<A: 'static, B: 'static, C: 'static, D: 'static, E: 'static, F: 'static, X: 'static> Trace for fn(A, B, C, D, E, F) -> X

Source§

fn is_type_tracked() -> bool
where Self: Sized,

Source§

impl<A: 'static, B: 'static, C: 'static, D: 'static, E: 'static, X: 'static> Trace for fn(A, B, C, D, E) -> X

Source§

fn is_type_tracked() -> bool
where Self: Sized,

Source§

impl<A: 'static, B: 'static, C: 'static, D: 'static, X: 'static> Trace for fn(&A, &B, &C, &D) -> X

Source§

fn is_type_tracked() -> bool
where Self: Sized,

Source§

impl<A: 'static, B: 'static, C: 'static, D: 'static, X: 'static> Trace for fn(&A, &B, &C, D) -> X

Source§

fn is_type_tracked() -> bool
where Self: Sized,

Source§

impl<A: 'static, B: 'static, C: 'static, D: 'static, X: 'static> Trace for fn(&A, &B, C, &D) -> X

Source§

fn is_type_tracked() -> bool
where Self: Sized,

Source§

impl<A: 'static, B: 'static, C: 'static, D: 'static, X: 'static> Trace for fn(&A, &B, C, D) -> X

Source§

fn is_type_tracked() -> bool
where Self: Sized,

Source§

impl<A: 'static, B: 'static, C: 'static, D: 'static, X: 'static> Trace for fn(&A, B, &C, &D) -> X

Source§

fn is_type_tracked() -> bool
where Self: Sized,

Source§

impl<A: 'static, B: 'static, C: 'static, D: 'static, X: 'static> Trace for fn(&A, B, &C, D) -> X

Source§

fn is_type_tracked() -> bool
where Self: Sized,

Source§

impl<A: 'static, B: 'static, C: 'static, D: 'static, X: 'static> Trace for fn(&A, B, C, &D) -> X

Source§

fn is_type_tracked() -> bool
where Self: Sized,

Source§

impl<A: 'static, B: 'static, C: 'static, D: 'static, X: 'static> Trace for fn(&A, B, C, D) -> X

Source§

fn is_type_tracked() -> bool
where Self: Sized,

Source§

impl<A: 'static, B: 'static, C: 'static, D: 'static, X: 'static> Trace for fn(A, &B, &C, &D) -> X

Source§

fn is_type_tracked() -> bool
where Self: Sized,

Source§

impl<A: 'static, B: 'static, C: 'static, D: 'static, X: 'static> Trace for fn(A, &B, &C, D) -> X

Source§

fn is_type_tracked() -> bool
where Self: Sized,

Source§

impl<A: 'static, B: 'static, C: 'static, D: 'static, X: 'static> Trace for fn(A, &B, C, &D) -> X

Source§

fn is_type_tracked() -> bool
where Self: Sized,

Source§

impl<A: 'static, B: 'static, C: 'static, D: 'static, X: 'static> Trace for fn(A, &B, C, D) -> X

Source§

fn is_type_tracked() -> bool
where Self: Sized,

Source§

impl<A: 'static, B: 'static, C: 'static, D: 'static, X: 'static> Trace for fn(A, B, &C, &D) -> X

Source§

fn is_type_tracked() -> bool
where Self: Sized,

Source§

impl<A: 'static, B: 'static, C: 'static, D: 'static, X: 'static> Trace for fn(A, B, &C, D) -> X

Source§

fn is_type_tracked() -> bool
where Self: Sized,

Source§

impl<A: 'static, B: 'static, C: 'static, D: 'static, X: 'static> Trace for fn(A, B, C, &D) -> X

Source§

fn is_type_tracked() -> bool
where Self: Sized,

Source§

impl<A: 'static, B: 'static, C: 'static, D: 'static, X: 'static> Trace for fn(A, B, C, D) -> X

Source§

fn is_type_tracked() -> bool
where Self: Sized,

Source§

impl<A: 'static, B: 'static, C: 'static, X: 'static> Trace for fn(&A, &B, &C) -> X

Source§

fn is_type_tracked() -> bool
where Self: Sized,

Source§

impl<A: 'static, B: 'static, C: 'static, X: 'static> Trace for fn(&A, &B, C) -> X

Source§

fn is_type_tracked() -> bool
where Self: Sized,

Source§

impl<A: 'static, B: 'static, C: 'static, X: 'static> Trace for fn(&A, B, &C) -> X

Source§

fn is_type_tracked() -> bool
where Self: Sized,

Source§

impl<A: 'static, B: 'static, C: 'static, X: 'static> Trace for fn(&A, B, C) -> X

Source§

fn is_type_tracked() -> bool
where Self: Sized,

Source§

impl<A: 'static, B: 'static, C: 'static, X: 'static> Trace for fn(A, &B, &C) -> X

Source§

fn is_type_tracked() -> bool
where Self: Sized,

Source§

impl<A: 'static, B: 'static, C: 'static, X: 'static> Trace for fn(A, &B, C) -> X

Source§

fn is_type_tracked() -> bool
where Self: Sized,

Source§

impl<A: 'static, B: 'static, C: 'static, X: 'static> Trace for fn(A, B, &C) -> X

Source§

fn is_type_tracked() -> bool
where Self: Sized,

Source§

impl<A: 'static, B: 'static, C: 'static, X: 'static> Trace for fn(A, B, C) -> X

Source§

fn is_type_tracked() -> bool
where Self: Sized,

Source§

impl<A: 'static, B: 'static, X: 'static> Trace for fn(&A, &B) -> X

Source§

fn is_type_tracked() -> bool
where Self: Sized,

Source§

impl<A: 'static, B: 'static, X: 'static> Trace for fn(&A, B) -> X

Source§

fn is_type_tracked() -> bool
where Self: Sized,

Source§

impl<A: 'static, B: 'static, X: 'static> Trace for fn(A, &B) -> X

Source§

fn is_type_tracked() -> bool
where Self: Sized,

Source§

impl<A: 'static, B: 'static, X: 'static> Trace for fn(A, B) -> X

Source§

fn is_type_tracked() -> bool
where Self: Sized,

Source§

impl<A: 'static, X: 'static> Trace for fn(&A) -> X

Source§

fn is_type_tracked() -> bool
where Self: Sized,

Source§

impl<A: 'static, X: 'static> Trace for fn(A) -> X

Source§

fn is_type_tracked() -> bool
where Self: Sized,

Source§

impl<A: Trace, B: Trace> Trace for (A, B)

Source§

fn trace(&self, tracer: &mut Tracer<'_>)

Source§

fn is_type_tracked() -> bool

Source§

impl<A: Trace, B: Trace, C: Trace> Trace for (A, B, C)

Source§

fn trace(&self, tracer: &mut Tracer<'_>)

Source§

fn is_type_tracked() -> bool

Source§

impl<A: Trace, B: Trace, C: Trace, D: Trace> Trace for (A, B, C, D)

Source§

fn trace(&self, tracer: &mut Tracer<'_>)

Source§

fn is_type_tracked() -> bool

Source§

impl<A: Trace, B: Trace, C: Trace, D: Trace, E: Trace> Trace for (A, B, C, D, E)

Source§

fn trace(&self, tracer: &mut Tracer<'_>)

Source§

fn is_type_tracked() -> bool

Source§

impl<K: Eq + Hash + Trace, V: Trace> Trace for HashMap<K, V>

Source§

fn trace(&self, tracer: &mut Tracer<'_>)

Source§

fn is_type_tracked() -> bool

Source§

impl<K: Trace, V: Trace> Trace for BTreeMap<K, V>

Source§

fn trace(&self, tracer: &mut Tracer<'_>)

Source§

fn is_type_tracked() -> bool

Source§

impl<T: 'static> Trace for Rc<T>

Source§

fn is_type_tracked() -> bool
where Self: Sized,

Source§

impl<T: 'static> Trace for Weak<T>

Source§

fn is_type_tracked() -> bool
where Self: Sized,

Source§

impl<T: 'static> Trace for Arc<T>

Source§

fn is_type_tracked() -> bool
where Self: Sized,

Source§

impl<T: 'static> Trace for LocalKey<T>

Source§

fn is_type_tracked() -> bool
where Self: Sized,

Source§

impl<T: 'static> Trace for JoinHandle<T>

Source§

fn is_type_tracked() -> bool
where Self: Sized,

Source§

impl<T: ToOwned + ?Sized> Trace for Cow<'static, T>
where T::Owned: Trace,

Source§

fn trace(&self, tracer: &mut Tracer<'_>)

Source§

fn is_type_tracked() -> bool

Source§

impl<T: Copy + Trace> Trace for Cell<T>

Source§

fn trace(&self, tracer: &mut Tracer<'_>)

Source§

fn is_type_tracked() -> bool

Source§

impl<T: Trace> Trace for Option<T>

Source§

fn trace(&self, tracer: &mut Tracer<'_>)

Source§

fn is_type_tracked() -> bool

Source§

impl<T: Trace> Trace for Box<T>

Source§

fn trace(&self, tracer: &mut Tracer<'_>)

Source§

fn is_type_tracked() -> bool

Source§

impl<T: Trace> Trace for LinkedList<T>

Source§

fn trace(&self, tracer: &mut Tracer<'_>)

Source§

fn is_type_tracked() -> bool

Source§

impl<T: Trace> Trace for VecDeque<T>

Source§

fn trace(&self, tracer: &mut Tracer<'_>)

Source§

fn is_type_tracked() -> bool

Source§

impl<T: Trace> Trace for Vec<T>

Source§

fn trace(&self, tracer: &mut Tracer<'_>)

Source§

fn is_type_tracked() -> bool

Source§

impl<T: Trace> Trace for RefCell<T>

Source§

fn trace(&self, tracer: &mut Tracer<'_>)

Source§

fn is_type_tracked() -> bool

Source§

impl<T: Trace> Trace for Mutex<T>

Source§

fn trace(&self, tracer: &mut Tracer<'_>)

Source§

fn is_type_tracked() -> bool

Source§

impl<T: Trace> Trace for RwLock<T>

Source§

fn trace(&self, tracer: &mut Tracer<'_>)

Source§

fn is_type_tracked() -> bool

Source§

impl<T: Trace, U: Trace> Trace for Result<T, U>

Source§

fn trace(&self, tracer: &mut Tracer<'_>)

Source§

fn is_type_tracked() -> bool

Source§

impl<X: 'static> Trace for fn() -> X

Source§

fn is_type_tracked() -> bool
where Self: Sized,

Implementors§