Skip to main content

KeepaliveLocalMemory

Struct KeepaliveLocalMemory 

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

Local memory handle that keeps its backing allocation alive via an Arc<dyn Keepalive>.

Detects at construction time whether the address is a CUDA device pointer and dispatches read_at/write_at accordingly.

All three access methods are unsafe: the Keepalive only guarantees the allocation stays mapped, not that this handle has unique ownership. The internal [AccessLock] coordinates concurrent callers that share the same clone of this handle (readers run in parallel, exclusive writers run alone, disjoint writers run in parallel with one another but exclude readers and exclusive writers), but callers must additionally rule out concurrent access through other views of the same allocation.

The direct_access_host_bandwidth and direct_access_device_bandwidth fields indicate the speed of reading the memory via pointer dereference on a host or device thread, respectively. A value of None means the memory is not directly accessible from that context.

Implementations§

Source§

impl KeepaliveLocalMemory

Source

pub fn new(addr: usize, size: usize, keepalive: Arc<dyn Keepalive>) -> Self

Create a new handle. Probes the CUDA driver to determine whether addr is a device pointer and sets the bandwidth fields accordingly.

Source

pub fn addr(&self) -> usize

Starting virtual address of the memory region.

Source

pub fn size(&self) -> usize

Size of the memory region in bytes.

Source

pub unsafe fn read_at(&self, offset: usize, dst: &mut [u8]) -> Result<(), Error>

Copy dst.len() bytes from this memory region starting at offset into dst.

Mutually exclusive with both write_at and write_at_disjoint across clones of this handle: the [AccessLock] guarantees a reader and any writer (exclusive or disjoint) that share the same lock never observe each other’s partial state. Multiple concurrent read_at calls on shared clones are permitted and run in parallel.

§Safety

The Keepalive guarantees the allocation stays mapped, but it does not imply unique ownership: another component may hold its own view of the same allocation and read or write it concurrently outside this handle’s [AccessLock]. The caller must ensure that no such external access produces a torn read of offset..offset + dst.len() for the duration of this call.

Source

pub unsafe fn write_at(&self, offset: usize, src: &[u8]) -> Result<(), Error>

Copy src.len() bytes from src into this memory region starting at offset.

Mutually exclusive with every other read and write against this region across clones of this handle: the [AccessLock] blocks concurrent readers and writers that share the same lock. Use KeepaliveLocalMemory::write_at_disjoint when multiple writers can be proven to target disjoint byte ranges.

§Safety

See KeepaliveLocalMemory::read_at. The Keepalive guarantee covers liveness only; the caller must ensure no concurrent external reader or writer observes an overlapping byte range.

Source

pub unsafe fn write_at_disjoint( &self, offset: usize, src: &[u8], ) -> Result<(), Error>

Like KeepaliveLocalMemory::write_at, but allows other concurrent write_at_disjoint calls (across clones of this handle) to proceed in parallel. Still mutually exclusive with read_at and write_at through the [AccessLock].

§Safety

In addition to the obligations of KeepaliveLocalMemory::write_at (no external concurrent reader or writer of the same byte range), the caller must ensure that no other concurrent call to this method targets a byte range that overlaps offset..offset + src.len(). Disjoint byte ranges across concurrent disjoint callers are sound.

Trait Implementations§

Source§

impl Clone for KeepaliveLocalMemory

Source§

fn clone(&self) -> KeepaliveLocalMemory

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for KeepaliveLocalMemory

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more

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
§

impl<'a, T, E> AsTaggedExplicit<'a, E> for T
where T: 'a,

§

fn explicit(self, class: Class, tag: u32) -> TaggedParser<'a, Explicit, Self, E>

§

impl<'a, T, E> AsTaggedImplicit<'a, E> for T
where T: 'a,

§

fn implicit( self, class: Class, constructed: bool, tag: u32, ) -> TaggedParser<'a, Implicit, Self, E>

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<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> DynClone for T
where T: Clone,

Source§

fn __clone_box(&self, _: Private) -> *mut ()

Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

§

impl<T> FromRef<T> for T
where T: Clone,

§

fn from_ref(input: &T) -> T

Converts to this type from a reference to the input type.
§

impl<T> FutureExt for T

§

fn with_context(self, otel_cx: Context) -> WithContext<Self>

Attaches the provided Context to this type, returning a WithContext wrapper. Read more
§

fn with_current_context(self) -> WithContext<Self>

Attaches the current Context to this type, returning a WithContext wrapper. Read more
Source§

impl<A, M> Handler<IndexedErasedUnbound<M>> for A
where A: Handler<M>, M: Castable,

Source§

fn handle<'life0, 'life1, 'async_trait>( &'life0 mut self, cx: &'life1 Context<'_, A>, msg: IndexedErasedUnbound<M>, ) -> Pin<Box<dyn Future<Output = Result<(), Error>> + Send + 'async_trait>>
where 'life0: 'async_trait, 'life1: 'async_trait, A: 'async_trait,

Handle the next M-typed message.
§

impl<T> Instrument for T

§

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

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

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
§

impl<T> IntoRequest<T> for T

§

fn into_request(self) -> Request<T>

Wrap the input message T in a tonic::Request
§

impl<L> LayerExt<L> for L

§

fn named_layer<S>(&self, service: S) -> Layered<<L as Layer<S>>::Service, S>
where L: Layer<S>,

Applies the layer to a service and wraps it in [Layered].
§

impl<T> Pointable for T

§

const ALIGN: usize

The alignment of pointer.
§

type Init = T

The type for initializers.
§

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

Initializes a with the given initializer. Read more
§

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

Dereferences the given pointer. Read more
§

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

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

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

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

§

fn and<P, B, E>(self, other: P) -> And<T, P>
where T: Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] only if self and other return Action::Follow. Read more
§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where T: Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] if either self or other returns Action::Follow. Read more
§

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

§

fn push_quoted<'q, Q, S>(&mut self, _q: Q, s: S)
where Q: QuoteInto<T>, S: Into<Quotable<'q>>,

Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

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

Source§

type Error = Infallible

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.
§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

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
§

fn with_current_subscriber(self) -> WithDispatch<Self>

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

impl<M> Message for M
where M: Send + Sync + 'static,