[][src]Trait zerogc::GcDirectBarrier

pub unsafe trait GcDirectBarrier<'gc, OwningRef>: Trace {
    pub unsafe fn write_barrier(&self, owner: &OwningRef, field_offset: usize);
}

Safely trigger a write barrier before writing to a garbage collected value.

The value must be in managed memory, a direct part of a garbage collected object. Write barriers (and writes) must include a reference to its owning object.

Safety

It is undefined behavior to forget to trigger a write barrier.

Field offsets are unchecked. They must refer to the correct offset (in bytes).

Indirection

This trait only support "direct" writes, where the destination field is inline with the source object.

For example it's correct to implement GcDirectWrite<Value=A> for (A, B), since since A is inline with the owning tuple.

It is incorrect to implement GcDirectWrite<Value=T> for Vec<T>, since it T is indirectly referred to by the vector. There's no "field offset" we can use to get from *mut Vec -> *mut T.

The only exception to this rule is Gc itself. GcRef can freely implement [GcDirectWrite] for any (and all values), even though it's just a pointer. It's the final destination of all write barriers and is expected to internally handle the indirection.

Required methods

pub unsafe fn write_barrier(&self, owner: &OwningRef, field_offset: usize)[src]

Trigger a write barrier, before writing to one of the owning object's managed fields

It is undefined behavior to mutate a garbage collected field without inserting a write barrier before it.

Generational, concurrent and incremental GCs need this to maintain the tricolor invariant.

Safety

The specified field offset must point to a valid field in the source object.

The type of this value must match the appropriate field

Loading content...

Implementations on Foreign Types

impl<'gc, OwningRef> GcDirectBarrier<'gc, OwningRef> for i8[src]

impl<'gc, OwningRef> GcDirectBarrier<'gc, OwningRef> for i16[src]

impl<'gc, OwningRef> GcDirectBarrier<'gc, OwningRef> for i32[src]

impl<'gc, OwningRef> GcDirectBarrier<'gc, OwningRef> for i64[src]

impl<'gc, OwningRef> GcDirectBarrier<'gc, OwningRef> for isize[src]

impl<'gc, OwningRef> GcDirectBarrier<'gc, OwningRef> for u8[src]

impl<'gc, OwningRef> GcDirectBarrier<'gc, OwningRef> for u16[src]

impl<'gc, OwningRef> GcDirectBarrier<'gc, OwningRef> for u32[src]

impl<'gc, OwningRef> GcDirectBarrier<'gc, OwningRef> for u64[src]

impl<'gc, OwningRef> GcDirectBarrier<'gc, OwningRef> for usize[src]

impl<'gc, OwningRef> GcDirectBarrier<'gc, OwningRef> for f32[src]

impl<'gc, OwningRef> GcDirectBarrier<'gc, OwningRef> for f64[src]

impl<'gc, OwningRef> GcDirectBarrier<'gc, OwningRef> for ()[src]

impl<'gc, OwningRef, A> GcDirectBarrier<'gc, OwningRef> for (A,) where
    A: GcDirectBarrier<'gc, OwningRef>, 
[src]

impl<'gc, OwningRef, A, B> GcDirectBarrier<'gc, OwningRef> for (A, B) where
    A: GcDirectBarrier<'gc, OwningRef>,
    B: GcDirectBarrier<'gc, OwningRef>, 
[src]

impl<'gc, OwningRef, A, B, C> GcDirectBarrier<'gc, OwningRef> for (A, B, C) where
    A: GcDirectBarrier<'gc, OwningRef>,
    B: GcDirectBarrier<'gc, OwningRef>,
    C: GcDirectBarrier<'gc, OwningRef>, 
[src]

impl<'gc, OwningRef, A, B, C, D> GcDirectBarrier<'gc, OwningRef> for (A, B, C, D) where
    A: GcDirectBarrier<'gc, OwningRef>,
    B: GcDirectBarrier<'gc, OwningRef>,
    C: GcDirectBarrier<'gc, OwningRef>,
    D: GcDirectBarrier<'gc, OwningRef>, 
[src]

impl<'gc, OwningRef, A, B, C, D, E> GcDirectBarrier<'gc, OwningRef> for (A, B, C, D, E) where
    A: GcDirectBarrier<'gc, OwningRef>,
    B: GcDirectBarrier<'gc, OwningRef>,
    C: GcDirectBarrier<'gc, OwningRef>,
    D: GcDirectBarrier<'gc, OwningRef>,
    E: GcDirectBarrier<'gc, OwningRef>, 
[src]

impl<'gc, OwningRef, A, B, C, D, E, F> GcDirectBarrier<'gc, OwningRef> for (A, B, C, D, E, F) where
    A: GcDirectBarrier<'gc, OwningRef>,
    B: GcDirectBarrier<'gc, OwningRef>,
    C: GcDirectBarrier<'gc, OwningRef>,
    D: GcDirectBarrier<'gc, OwningRef>,
    E: GcDirectBarrier<'gc, OwningRef>,
    F: GcDirectBarrier<'gc, OwningRef>, 
[src]

impl<'gc, OwningRef, A, B, C, D, E, F, G> GcDirectBarrier<'gc, OwningRef> for (A, B, C, D, E, F, G) where
    A: GcDirectBarrier<'gc, OwningRef>,
    B: GcDirectBarrier<'gc, OwningRef>,
    C: GcDirectBarrier<'gc, OwningRef>,
    D: GcDirectBarrier<'gc, OwningRef>,
    E: GcDirectBarrier<'gc, OwningRef>,
    F: GcDirectBarrier<'gc, OwningRef>,
    G: GcDirectBarrier<'gc, OwningRef>, 
[src]

impl<'gc, OwningRef, A, B, C, D, E, F, G, H> GcDirectBarrier<'gc, OwningRef> for (A, B, C, D, E, F, G, H) where
    A: GcDirectBarrier<'gc, OwningRef>,
    B: GcDirectBarrier<'gc, OwningRef>,
    C: GcDirectBarrier<'gc, OwningRef>,
    D: GcDirectBarrier<'gc, OwningRef>,
    E: GcDirectBarrier<'gc, OwningRef>,
    F: GcDirectBarrier<'gc, OwningRef>,
    G: GcDirectBarrier<'gc, OwningRef>,
    H: GcDirectBarrier<'gc, OwningRef>, 
[src]

impl<'gc, OwningRef, A, B, C, D, E, F, G, H, I> GcDirectBarrier<'gc, OwningRef> for (A, B, C, D, E, F, G, H, I) where
    A: GcDirectBarrier<'gc, OwningRef>,
    B: GcDirectBarrier<'gc, OwningRef>,
    C: GcDirectBarrier<'gc, OwningRef>,
    D: GcDirectBarrier<'gc, OwningRef>,
    E: GcDirectBarrier<'gc, OwningRef>,
    F: GcDirectBarrier<'gc, OwningRef>,
    G: GcDirectBarrier<'gc, OwningRef>,
    H: GcDirectBarrier<'gc, OwningRef>,
    I: GcDirectBarrier<'gc, OwningRef>, 
[src]

impl<'gc, OwningRef, V> GcDirectBarrier<'gc, OwningRef> for Option<V> where
    V: GcDirectBarrier<'gc, OwningRef>, 
[src]

Loading content...

Implementors

impl<'gc, O, V, Id> GcDirectBarrier<'gc, Gc<'gc, O, Id>> for Gc<'gc, V, Id> where
    O: GcSafe + 'gc,
    V: GcSafe + 'gc,
    Id: CollectorId
[src]

impl<'gc, OwningRef, Value> GcDirectBarrier<'gc, OwningRef> for GcCell<Value> where
    Value: GcDirectBarrier<'gc, OwningRef> + Copy
[src]

Loading content...