mirror of
https://github.com/GraphiteEditor/Graphite.git
synced 2026-09-27 06:58:11 +08:00
Bound attribute value types Send and Sync
This commit is contained in:
@@ -28,7 +28,11 @@ pub trait Attribute: 'static {
|
|||||||
/// is the evaluation the value flows in; non-reference values ignore it.
|
/// is the evaluation the value flows in; non-reference values ignore it.
|
||||||
/// The value outlives that evaluation, so its `'static` instantiation is
|
/// The value outlives that evaluation, so its `'static` instantiation is
|
||||||
/// the one the census registers and layouts stamp their type id from.
|
/// the one the census registers and layouts stamp their type id from.
|
||||||
type Value<'e>: Copy + Default + std::fmt::Debug + 'e;
|
///
|
||||||
|
/// `Send + Sync` because a record's bytes are these values: `RecordValue`
|
||||||
|
/// is `Send + Sync` over whatever the field writes put there, and the write
|
||||||
|
/// path never consults the census, so the bound has to sit here.
|
||||||
|
type Value<'e>: Copy + Default + std::fmt::Debug + Send + Sync + 'e;
|
||||||
/// The name-specific default, filled where an item lacks the attribute.
|
/// The name-specific default, filled where an item lacks the attribute.
|
||||||
/// Producing a value for any `'e` from no inputs, reference defaults can
|
/// Producing a value for any `'e` from no inputs, reference defaults can
|
||||||
/// only point at `'static` data, which is what lets the census fill them
|
/// only point at `'static` data, which is what lets the census fill them
|
||||||
|
|||||||
@@ -50,9 +50,10 @@ impl std::fmt::Debug for RecordValue<'_> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// SAFETY: `element_write` requires the element `Send + Sync` and attribute payloads
|
// SAFETY: `element_write` requires the element `Send + Sync` and every field holds an
|
||||||
// are `Copy` or arena-backed, so the record bytes behind the pointer are thread-safe;
|
// `Attribute::Value`, which the trait bounds `Send + Sync`, so the record bytes behind
|
||||||
// `'e` ties the pointer's validity to the shared arena and record-stack discipline.
|
// the pointer are thread-safe; `'e` ties the pointer's validity to the shared arena and
|
||||||
|
// record-stack discipline.
|
||||||
unsafe impl Send for RecordValue<'_> {}
|
unsafe impl Send for RecordValue<'_> {}
|
||||||
// SAFETY: as `Send`.
|
// SAFETY: as `Send`.
|
||||||
unsafe impl Sync for RecordValue<'_> {}
|
unsafe impl Sync for RecordValue<'_> {}
|
||||||
|
|||||||
Reference in New Issue
Block a user