[][src]Trait gcmodule::Trace

pub trait Trace: 'static {
    fn trace(&self, tracer: &mut Tracer) { ... }
fn is_type_tracked() -> bool
    where
        Self: Sized
, { ... }
fn as_any(&self) -> Option<&dyn Any> { ... } }

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

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.

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.

fn as_any(&self) -> Option<&dyn Any>

Provide downcast support.

Types that want downcast support should implement this method like: fn as_any(&self) -> Option<&dyn std::any::Any> { Some(self) }

Loading content...

Implementations on Foreign Types

impl Trace for bool[src]

impl Trace for char[src]

impl Trace for f32[src]

impl Trace for f64[src]

impl Trace for i16[src]

impl Trace for i32[src]

impl Trace for i64[src]

impl Trace for i8[src]

impl Trace for isize[src]

impl Trace for u16[src]

impl Trace for u32[src]

impl Trace for u64[src]

impl Trace for u8[src]

impl Trace for usize[src]

impl Trace for ()[src]

impl Trace for String[src]

impl Trace for &'static str[src]

impl<A: Trace, B: Trace> Trace for (A, B)[src]

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

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

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

impl<T: Trace> Trace for Box<T>[src]

impl Trace for Box<dyn Trace>[src]

impl<T: Copy + Trace> Trace for Cell<T>[src]

impl<T: Trace> Trace for RefCell<T>[src]

impl<K: Trace, V: Trace> Trace for BTreeMap<K, V>[src]

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

impl<T: Trace> Trace for LinkedList<T>[src]

impl<T: Trace> Trace for VecDeque<T>[src]

impl<T: Trace> Trace for Vec<T>[src]

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

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

impl<A: 'static, X: 'static> Trace for fn(_: A) -> X[src]

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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[src]

impl Trace for CString[src]

impl Trace for NulError[src]

impl Trace for OsString[src]

impl Trace for AddrParseError[src]

impl Trace for Ipv4Addr[src]

impl Trace for Ipv6Addr[src]

impl Trace for SocketAddrV4[src]

impl Trace for SocketAddrV6[src]

impl Trace for TcpListener[src]

impl Trace for TcpStream[src]

impl Trace for UdpSocket[src]

impl<T: Trace> Trace for Option<T>[src]

impl Trace for PathBuf[src]

impl Trace for Child[src]

impl Trace for ChildStderr[src]

impl Trace for ChildStdin[src]

impl Trace for ChildStdout[src]

impl Trace for Command[src]

impl Trace for ExitStatus[src]

impl Trace for Output[src]

impl Trace for Stdio[src]

impl<T: 'static> Trace for Rc<T>[src]

impl<T: 'static> Trace for Weak<T>[src]

impl<T: Trace, U: Trace> Trace for Result<T, U>[src]

impl<T: 'static> Trace for Arc<T>[src]

impl<T: 'static> Trace for Mutex<T>[src]

impl<T: 'static> Trace for RwLock<T>[src]

impl<T: 'static> Trace for JoinHandle<T>[src]

impl<T: 'static> Trace for LocalKey<T>[src]

impl Trace for Thread[src]

Loading content...

Implementors

impl Trace for Cc<dyn Trace>[src]

impl<T: Trace> Trace for Cc<T>[src]

Loading content...