pub enum IdentityKind {
DmaBuf,
Shm,
IoSurface,
AHardwareBufferId,
AHardwareBufferPtr,
HostPtr,
Pbo,
}Expand description
What kind of system key an identity was derived from. Participates in the id so that, say, inode 7 and IOSurfaceID 7 cannot collide.
Invariant every variant must uphold: the key passed to
BufferIdentity::derived is unique among live buffers of that kind
that own an allocation. There is no “no identity” case — where no
system-wide key exists a process-local one does (a pointer, a GL name),
and a process-local key is exactly as sound as a system-wide one:
pointer/name reuse after free is the same ABA hazard as inode reuse, and
is mitigated the same way, by the retaining cache (see the design spec’s
Task 6).
The allocation qualifier is load-bearing, not a hedge. A zero-element
tensor ([0, num_protos], the tracker’s “no detections this frame”
sentinel — see [crate::mem]) owns no allocation, so its Vec yields the
dangling well-aligned pointer align_of::<T>(). Every zero-element
Tensor<f32> in a process therefore shares one identity, and can even
collide across kinds with a small integer key from another variant.
That is safe rather than tolerated: an identity exists to answer “are
these the same bytes?”, and buffers with no bytes have nothing to alias.
Nor can they reach an import cache — both GPU import paths require a
dma-buf fd or an IOSurface ref and reject anything else, so a HostPtr
identity is never a cache key. Do not “fix” this by minting a distinct id
per empty tensor: that reintroduces a counter, which is the state this
whole design exists to remove.
Variants§
DmaBuf
(st_dev, st_ino) of a dma-buf or memfd. Survives dup, and is the
same value in every process that holds the buffer.
Shm
IoSurface
IOSurfaceGetID.
AHardwareBufferId
AHardwareBuffer_getId, API 31+.
AHardwareBufferPtr
The AHardwareBuffer* pointer, pre-API-31 where no id exists.
Process-local: unique among live buffers here, meaningless elsewhere.
HostPtr
A host mapping address. Process-local.
Pbo
A GL buffer name. Valid only in the context that created it.
Trait Implementations§
Source§impl Clone for IdentityKind
impl Clone for IdentityKind
Source§fn clone(&self) -> IdentityKind
fn clone(&self) -> IdentityKind
1.0.0 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreimpl Copy for IdentityKind
Source§impl Debug for IdentityKind
impl Debug for IdentityKind
impl Eq for IdentityKind
Source§impl PartialEq for IdentityKind
impl PartialEq for IdentityKind
impl StructuralPartialEq for IdentityKind
Auto Trait Implementations§
impl Freeze for IdentityKind
impl RefUnwindSafe for IdentityKind
impl Send for IdentityKind
impl Sync for IdentityKind
impl Unpin for IdentityKind
impl UnsafeUnpin for IdentityKind
impl UnwindSafe for IdentityKind
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
Source§fn in_current_span(self) -> Instrumented<Self> ⓘ
fn in_current_span(self) -> Instrumented<Self> ⓘ
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more