Trait zerogc::GcDirectBarrier [−][src]
pub unsafe trait GcDirectBarrier<'gc, OwningRef>: Trace { 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
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
Implementations on Foreign Types
impl<'gc, OwningRef> GcDirectBarrier<'gc, OwningRef> for i8
[src]
impl<'gc, OwningRef> GcDirectBarrier<'gc, OwningRef> for i8
[src]unsafe fn write_barrier(&self, _owner: &OwningRef, _field_offset: usize)
[src]
impl<'gc, OwningRef> GcDirectBarrier<'gc, OwningRef> for i16
[src]
impl<'gc, OwningRef> GcDirectBarrier<'gc, OwningRef> for i16
[src]unsafe fn write_barrier(&self, _owner: &OwningRef, _field_offset: usize)
[src]
impl<'gc, OwningRef> GcDirectBarrier<'gc, OwningRef> for i32
[src]
impl<'gc, OwningRef> GcDirectBarrier<'gc, OwningRef> for i32
[src]unsafe fn write_barrier(&self, _owner: &OwningRef, _field_offset: usize)
[src]
impl<'gc, OwningRef> GcDirectBarrier<'gc, OwningRef> for i64
[src]
impl<'gc, OwningRef> GcDirectBarrier<'gc, OwningRef> for i64
[src]unsafe fn write_barrier(&self, _owner: &OwningRef, _field_offset: usize)
[src]
impl<'gc, OwningRef> GcDirectBarrier<'gc, OwningRef> for isize
[src]
impl<'gc, OwningRef> GcDirectBarrier<'gc, OwningRef> for isize
[src]unsafe fn write_barrier(&self, _owner: &OwningRef, _field_offset: usize)
[src]
impl<'gc, OwningRef> GcDirectBarrier<'gc, OwningRef> for u8
[src]
impl<'gc, OwningRef> GcDirectBarrier<'gc, OwningRef> for u8
[src]unsafe fn write_barrier(&self, _owner: &OwningRef, _field_offset: usize)
[src]
impl<'gc, OwningRef> GcDirectBarrier<'gc, OwningRef> for u16
[src]
impl<'gc, OwningRef> GcDirectBarrier<'gc, OwningRef> for u16
[src]unsafe fn write_barrier(&self, _owner: &OwningRef, _field_offset: usize)
[src]
impl<'gc, OwningRef> GcDirectBarrier<'gc, OwningRef> for u32
[src]
impl<'gc, OwningRef> GcDirectBarrier<'gc, OwningRef> for u32
[src]unsafe fn write_barrier(&self, _owner: &OwningRef, _field_offset: usize)
[src]
impl<'gc, OwningRef> GcDirectBarrier<'gc, OwningRef> for u64
[src]
impl<'gc, OwningRef> GcDirectBarrier<'gc, OwningRef> for u64
[src]unsafe fn write_barrier(&self, _owner: &OwningRef, _field_offset: usize)
[src]
impl<'gc, OwningRef> GcDirectBarrier<'gc, OwningRef> for usize
[src]
impl<'gc, OwningRef> GcDirectBarrier<'gc, OwningRef> for usize
[src]unsafe fn write_barrier(&self, _owner: &OwningRef, _field_offset: usize)
[src]
impl<'gc, OwningRef> GcDirectBarrier<'gc, OwningRef> for f32
[src]
impl<'gc, OwningRef> GcDirectBarrier<'gc, OwningRef> for f32
[src]unsafe fn write_barrier(&self, _owner: &OwningRef, _field_offset: usize)
[src]
impl<'gc, OwningRef> GcDirectBarrier<'gc, OwningRef> for f64
[src]
impl<'gc, OwningRef> GcDirectBarrier<'gc, OwningRef> for f64
[src]unsafe fn write_barrier(&self, _owner: &OwningRef, _field_offset: usize)
[src]
impl<'gc, OwningRef> GcDirectBarrier<'gc, OwningRef> for bool
[src]
impl<'gc, OwningRef> GcDirectBarrier<'gc, OwningRef> for bool
[src]unsafe fn write_barrier(&self, _owner: &OwningRef, _field_offset: usize)
[src]
impl<'gc, OwningRef> GcDirectBarrier<'gc, OwningRef> for char
[src]
impl<'gc, OwningRef> GcDirectBarrier<'gc, OwningRef> for char
[src]unsafe fn write_barrier(&self, _owner: &OwningRef, _field_offset: usize)
[src]
impl<'gc, OwningRef> GcDirectBarrier<'gc, OwningRef> for &'static str
[src]
impl<'gc, OwningRef> GcDirectBarrier<'gc, OwningRef> for &'static str
[src]unsafe fn write_barrier(&self, _owner: &OwningRef, _field_offset: usize)
[src]
impl<'gc, OwningRef> GcDirectBarrier<'gc, OwningRef> for ()
[src]
impl<'gc, OwningRef> GcDirectBarrier<'gc, OwningRef> for ()
[src]unsafe fn write_barrier(&self, owner: &OwningRef, start_offset: usize)
[src]
impl<'gc, OwningRef, I> GcDirectBarrier<'gc, OwningRef> for (I,) where
I: GcDirectBarrier<'gc, OwningRef>,
[src]
impl<'gc, OwningRef, I> GcDirectBarrier<'gc, OwningRef> for (I,) where
I: GcDirectBarrier<'gc, OwningRef>,
[src]unsafe fn write_barrier(&self, owner: &OwningRef, start_offset: usize)
[src]
impl<'gc, OwningRef, H, I> GcDirectBarrier<'gc, OwningRef> for (H, I) where
H: GcDirectBarrier<'gc, OwningRef>,
I: GcDirectBarrier<'gc, OwningRef>,
[src]
impl<'gc, OwningRef, H, I> GcDirectBarrier<'gc, OwningRef> for (H, I) where
H: GcDirectBarrier<'gc, OwningRef>,
I: GcDirectBarrier<'gc, OwningRef>,
[src]unsafe fn write_barrier(&self, owner: &OwningRef, start_offset: usize)
[src]
impl<'gc, OwningRef, G, H, I> GcDirectBarrier<'gc, OwningRef> for (G, H, I) where
G: GcDirectBarrier<'gc, OwningRef>,
H: GcDirectBarrier<'gc, OwningRef>,
I: GcDirectBarrier<'gc, OwningRef>,
[src]
impl<'gc, OwningRef, G, H, I> GcDirectBarrier<'gc, OwningRef> for (G, H, I) where
G: GcDirectBarrier<'gc, OwningRef>,
H: GcDirectBarrier<'gc, OwningRef>,
I: GcDirectBarrier<'gc, OwningRef>,
[src]unsafe fn write_barrier(&self, owner: &OwningRef, start_offset: usize)
[src]
impl<'gc, OwningRef, F, G, H, I> GcDirectBarrier<'gc, OwningRef> for (F, G, H, I) where
F: GcDirectBarrier<'gc, OwningRef>,
G: GcDirectBarrier<'gc, OwningRef>,
H: GcDirectBarrier<'gc, OwningRef>,
I: GcDirectBarrier<'gc, OwningRef>,
[src]
impl<'gc, OwningRef, F, G, H, I> GcDirectBarrier<'gc, OwningRef> for (F, G, H, I) where
F: GcDirectBarrier<'gc, OwningRef>,
G: GcDirectBarrier<'gc, OwningRef>,
H: GcDirectBarrier<'gc, OwningRef>,
I: GcDirectBarrier<'gc, OwningRef>,
[src]unsafe fn write_barrier(&self, owner: &OwningRef, start_offset: usize)
[src]
impl<'gc, OwningRef, E, F, G, H, I> GcDirectBarrier<'gc, OwningRef> for (E, F, G, H, I) where
E: GcDirectBarrier<'gc, OwningRef>,
F: GcDirectBarrier<'gc, OwningRef>,
G: GcDirectBarrier<'gc, OwningRef>,
H: GcDirectBarrier<'gc, OwningRef>,
I: GcDirectBarrier<'gc, OwningRef>,
[src]
impl<'gc, OwningRef, E, F, G, H, I> GcDirectBarrier<'gc, OwningRef> for (E, F, G, H, I) where
E: GcDirectBarrier<'gc, OwningRef>,
F: GcDirectBarrier<'gc, OwningRef>,
G: GcDirectBarrier<'gc, OwningRef>,
H: GcDirectBarrier<'gc, OwningRef>,
I: GcDirectBarrier<'gc, OwningRef>,
[src]unsafe fn write_barrier(&self, owner: &OwningRef, start_offset: usize)
[src]
impl<'gc, OwningRef, D, E, F, G, H, I> GcDirectBarrier<'gc, OwningRef> for (D, E, F, G, H, I) where
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, D, E, F, G, H, I> GcDirectBarrier<'gc, OwningRef> for (D, E, F, G, H, I) where
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]unsafe fn write_barrier(&self, owner: &OwningRef, start_offset: usize)
[src]
impl<'gc, OwningRef, C, D, E, F, G, H, I> GcDirectBarrier<'gc, OwningRef> for (C, D, E, F, G, H, I) where
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, C, D, E, F, G, H, I> GcDirectBarrier<'gc, OwningRef> for (C, D, E, F, G, H, I) where
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]unsafe fn write_barrier(&self, owner: &OwningRef, start_offset: usize)
[src]
impl<'gc, OwningRef, B, C, D, E, F, G, H, I> GcDirectBarrier<'gc, OwningRef> for (B, C, D, E, F, G, H, I) where
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, B, C, D, E, F, G, H, I> GcDirectBarrier<'gc, OwningRef> for (B, C, D, E, F, G, H, I) where
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]unsafe fn write_barrier(&self, owner: &OwningRef, start_offset: usize)
[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, 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]unsafe fn write_barrier(&self, owner: &OwningRef, start_offset: usize)
[src]
impl<'gc, OwningRef, V> GcDirectBarrier<'gc, OwningRef> for Option<V> where
V: GcDirectBarrier<'gc, OwningRef>,
[src]
impl<'gc, OwningRef, V> GcDirectBarrier<'gc, OwningRef> for Option<V> where
V: GcDirectBarrier<'gc, OwningRef>,
[src]unsafe fn write_barrier(&self, owner: &OwningRef, start_offset: usize)
[src]
impl<'gc, OwningRef> GcDirectBarrier<'gc, OwningRef> for String
[src]
impl<'gc, OwningRef> GcDirectBarrier<'gc, OwningRef> for String
[src]unsafe fn write_barrier(&self, _owner: &OwningRef, _field_offset: usize)
[src]
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, O, V, Id> GcDirectBarrier<'gc, Gc<'gc, O, Id>> for Gc<'gc, V, Id> where
O: GcSafe + 'gc,
V: GcSafe + 'gc,
Id: CollectorId,
[src]unsafe fn write_barrier(&self, owner: &Gc<'gc, O, Id>, field_offset: usize)
[src]
impl<'gc, OwningRef, Value> GcDirectBarrier<'gc, OwningRef> for GcCell<Value> where
Value: GcDirectBarrier<'gc, OwningRef> + Copy,
[src]
impl<'gc, OwningRef, Value> GcDirectBarrier<'gc, OwningRef> for GcCell<Value> where
Value: GcDirectBarrier<'gc, OwningRef> + Copy,
[src]