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