GcDirectBarrier

Trait GcDirectBarrier 

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

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§

Source

unsafe fn write_barrier(&self, owner: &OwningRef, field_offset: usize)

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

Dyn Compatibility§

This trait is not dyn compatible.

In older versions of Rust, dyn compatibility was called "object safety", so this trait is not object safe.

Implementations on Foreign Types§

Source§

impl<'gc, OwningRef> GcDirectBarrier<'gc, OwningRef> for f32

Source§

unsafe fn write_barrier(&self, _owner: &OwningRef, _field_offset: usize)

Source§

impl<'gc, OwningRef> GcDirectBarrier<'gc, OwningRef> for f64

Source§

unsafe fn write_barrier(&self, _owner: &OwningRef, _field_offset: usize)

Source§

impl<'gc, OwningRef> GcDirectBarrier<'gc, OwningRef> for i8

Source§

unsafe fn write_barrier(&self, _owner: &OwningRef, _field_offset: usize)

Source§

impl<'gc, OwningRef> GcDirectBarrier<'gc, OwningRef> for i16

Source§

unsafe fn write_barrier(&self, _owner: &OwningRef, _field_offset: usize)

Source§

impl<'gc, OwningRef> GcDirectBarrier<'gc, OwningRef> for i32

Source§

unsafe fn write_barrier(&self, _owner: &OwningRef, _field_offset: usize)

Source§

impl<'gc, OwningRef> GcDirectBarrier<'gc, OwningRef> for i64

Source§

unsafe fn write_barrier(&self, _owner: &OwningRef, _field_offset: usize)

Source§

impl<'gc, OwningRef> GcDirectBarrier<'gc, OwningRef> for isize

Source§

unsafe fn write_barrier(&self, _owner: &OwningRef, _field_offset: usize)

Source§

impl<'gc, OwningRef> GcDirectBarrier<'gc, OwningRef> for u8

Source§

unsafe fn write_barrier(&self, _owner: &OwningRef, _field_offset: usize)

Source§

impl<'gc, OwningRef> GcDirectBarrier<'gc, OwningRef> for u16

Source§

unsafe fn write_barrier(&self, _owner: &OwningRef, _field_offset: usize)

Source§

impl<'gc, OwningRef> GcDirectBarrier<'gc, OwningRef> for u32

Source§

unsafe fn write_barrier(&self, _owner: &OwningRef, _field_offset: usize)

Source§

impl<'gc, OwningRef> GcDirectBarrier<'gc, OwningRef> for u64

Source§

unsafe fn write_barrier(&self, _owner: &OwningRef, _field_offset: usize)

Source§

impl<'gc, OwningRef> GcDirectBarrier<'gc, OwningRef> for ()

Source§

unsafe fn write_barrier(&self, owner: &OwningRef, start_offset: usize)

Source§

impl<'gc, OwningRef> GcDirectBarrier<'gc, OwningRef> for usize

Source§

unsafe fn write_barrier(&self, _owner: &OwningRef, _field_offset: usize)

Source§

impl<'gc, OwningRef> GcDirectBarrier<'gc, OwningRef> for String

Source§

unsafe fn write_barrier(&self, _owner: &OwningRef, _field_offset: usize)

Source§

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

Source§

unsafe fn write_barrier(&self, owner: &OwningRef, start_offset: usize)

Source§

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

Source§

unsafe fn write_barrier(&self, owner: &OwningRef, start_offset: usize)

Source§

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>,

Source§

unsafe fn write_barrier(&self, owner: &OwningRef, start_offset: usize)

Source§

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>,

Source§

unsafe fn write_barrier(&self, owner: &OwningRef, start_offset: usize)

Source§

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>,

Source§

unsafe fn write_barrier(&self, owner: &OwningRef, start_offset: usize)

Source§

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>,

Source§

unsafe fn write_barrier(&self, owner: &OwningRef, start_offset: usize)

Source§

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>,

Source§

unsafe fn write_barrier(&self, owner: &OwningRef, start_offset: usize)

Source§

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>,

Source§

unsafe fn write_barrier(&self, owner: &OwningRef, start_offset: usize)

Source§

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>,

Source§

unsafe fn write_barrier(&self, owner: &OwningRef, start_offset: usize)

Source§

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

Source§

unsafe fn write_barrier(&self, owner: &OwningRef, start_offset: usize)

Implementors§

Source§

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,

Source§

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