Skip to main content

BlobData

Struct BlobData 

Source
pub struct BlobData { /* private fields */ }
Expand description

Holds the raw payload sections of each blob file.

Indexed by PayloadLocator::blob_index. Blob 0’s payload section is loaded eagerly by load_raw() – it carries the defs and the primary payloads and is needed immediately. Overflow blobs (1, 2, …) start Unloaded and are read from disk on demand the first time a locator references them, so a large world does not pay the RAM (or I/O) cost of every overflow blob at startup.

Systems call release(blob_index) after consuming a blob’s payloads (e.g. after uploading SPIR-V to the GPU) so the memory is freed promptly.

Implementations§

Source§

impl BlobData

Source

pub fn new(payload_sections: Vec<Option<Vec<u8>>>) -> BlobData

Build an in-memory store where every section is already resident. Used by the cn debug path, which compiles payloads in memory with no blob files, so there is nothing to lazily load. A None section is treated as already released.

Source

pub fn empty() -> BlobData

empty store for worlds with no compiled payloads (tests, runtime-only worlds)

Source

pub fn disk_backed(&self) -> bool

true when the payloads were loaded from blob files on disk, so a streamed payload can be re-read from disk rather than kept in RAM

Source

pub fn read(&mut self, locator: &PayloadLocator) -> Result<&[u8], CnResult>

read the bytes for a given locator

An Unloaded overflow blob is read from its file on first access and becomes Loaded. Errors if the locator is out of range, the blob was released, or the on-demand load fails.

Source

pub fn release(&mut self, blob_index: u32)

release a blob’s in-memory payload once all systems that need it have finished consuming it (e.g. after GPU upload)

subsequent read() calls for locators in this blob return an error rather than reloading – the data is known to no longer be needed – so only call this once you are sure no other system needs it

Source

pub fn release_all_resident(&mut self) -> usize

Release every payload section still resident, called once every system has finished init. Systems read compiled payloads only during init and cache what they keep (GPU uploads, decoded audio clips, streaming sources that own their extracted bytes or re-read from disk), so nothing consults BlobData again at runtime – the resident sections are dead weight past World::start. Never-loaded overflow slots are left as they are: they hold only a file path and were needed by no system. Returns the number of bytes freed.

Trait Implementations§

Source§

impl PayloadStore for BlobData

Source§

fn read(&mut self, locator: &PayloadLocator) -> Result<&[u8], CnResult>

Read the bytes a locator points at. &mut self because a disk-backed store may load an overflow section lazily on first access. Errors when the payload was released, the locator is out of range, or a lazy load fails.
Source§

fn release(&mut self, blob_index: u32)

Release an entire blob’s in-memory payload once every system that needs it has finished (e.g. after GPU upload). A store with nothing resident for blob_index treats this as a no-op.
Source§

fn disk_backed(&self) -> bool

Whether the payloads are backed by files still on disk, so a released payload can be re-read on demand rather than kept RAM-resident.
Source§

fn release_all_resident(&mut self) -> usize

Release every resident section at once, returning the bytes freed. World::start calls this after init: systems read compiled payloads only while initing and cache what they keep, so nothing consults the store again. A store with nothing resident frees nothing.

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<S, T> Duplex<S> for T
where T: FromSample<S> + ToSample<S>,

Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<S> FromSample<S> for S

Source§

fn from_sample_(s: S) -> S

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts 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 more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts 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
Source§

impl<F, T> IntoSample<T> for F
where T: FromSample<F>,

Source§

fn into_sample(self) -> T

Source§

impl<T> Pointable for T

Source§

const ALIGN: usize

The alignment of pointer.
Source§

type Init = T

The type for initializers.
Source§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
Source§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
Source§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
Source§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
Source§

impl<T> Read<Exclusive, BecauseExclusive> for T
where T: ?Sized,

Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T, U> ToSample<U> for T
where U: FromSample<T>,

Source§

fn to_sample_(self) -> U

Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = !

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more