use super::{MrAccess, MrToken};
use crate::agent::AgentInner;
use clippy_utilities::OverflowArithmetic;
use std::{io, ops::Range, sync::Arc};
pub trait RemoteMrReadAccess: MrAccess {}
pub trait RemoteMrWriteAccess: MrAccess + RemoteMrReadAccess {}
#[derive(Debug)]
pub struct RemoteMr {
token: MrToken,
agent: Arc<AgentInner>,
}
impl MrAccess for RemoteMr {
#[inline]
fn addr(&self) -> usize {
self.token.addr
}
#[inline]
fn length(&self) -> usize {
self.token.len
}
#[inline]
fn rkey(&self) -> u32 {
self.token.rkey
}
#[inline]
fn token(&self) -> MrToken {
self.token
}
}
impl RemoteMrReadAccess for RemoteMr {}
impl RemoteMrWriteAccess for RemoteMr {}
impl Drop for RemoteMr {
#[inline]
fn drop(&mut self) {
let agent = Arc::<AgentInner>::clone(&self.agent);
let token = self.token;
let _task = tokio::spawn(async move { AgentInner::release_mr(&agent, token).await });
}
}
impl RemoteMr {
#[inline]
pub(crate) fn new_from_token(token: MrToken, agent: Arc<AgentInner>) -> Self {
Self { token, agent }
}
#[inline]
pub fn get(&self, i: Range<usize>) -> io::Result<RemoteMrSlice> {
if i.start >= i.end || i.end > self.length() {
Err(io::Error::new(io::ErrorKind::Other, "wrong range of rmr"))
} else {
let slice_token = MrToken {
addr: self.addr().overflow_add(i.start),
len: i.end.overflow_sub(i.start),
rkey: self.rkey(),
};
Ok(RemoteMrSlice::new_from_token(self, slice_token))
}
}
#[inline]
pub fn get_mut(&mut self, i: Range<usize>) -> io::Result<RemoteMrSliceMut> {
if i.start >= i.end || i.end > self.length() {
Err(io::Error::new(io::ErrorKind::Other, "wrong range of rmr"))
} else {
let slice_token = MrToken {
addr: self.addr().overflow_add(i.start),
len: i.end.overflow_sub(i.start),
rkey: self.rkey(),
};
Ok(RemoteMrSliceMut::new_from_token(self, slice_token))
}
}
}
impl MrAccess for &RemoteMr {
#[inline]
fn addr(&self) -> usize {
self.token.addr
}
#[inline]
fn length(&self) -> usize {
self.token.len
}
#[inline]
fn rkey(&self) -> u32 {
self.token.rkey
}
#[inline]
fn token(&self) -> MrToken {
self.token
}
}
impl RemoteMrReadAccess for &RemoteMr {}
impl MrAccess for &mut RemoteMr {
#[inline]
fn addr(&self) -> usize {
self.token.addr
}
#[inline]
fn length(&self) -> usize {
self.token.len
}
#[inline]
fn rkey(&self) -> u32 {
self.token.rkey
}
#[inline]
fn token(&self) -> MrToken {
self.token
}
}
impl RemoteMrReadAccess for &mut RemoteMr {}
impl RemoteMrWriteAccess for &mut RemoteMr {}
#[derive(Debug)]
pub struct RemoteMrSlice<'a> {
#[allow(dead_code)]
rmr: &'a RemoteMr,
token: MrToken,
}
impl<'a> RemoteMrSlice<'a> {
#[inline]
pub(crate) fn new_from_token(rmr: &'a RemoteMr, token: MrToken) -> Self {
Self { rmr, token }
}
}
impl MrAccess for RemoteMrSlice<'_> {
#[inline]
fn addr(&self) -> usize {
self.token.addr
}
#[inline]
fn length(&self) -> usize {
self.token.len
}
#[inline]
fn rkey(&self) -> u32 {
self.token.rkey
}
#[inline]
fn token(&self) -> MrToken {
self.token
}
}
impl RemoteMrReadAccess for RemoteMrSlice<'_> {}
#[derive(Debug)]
pub struct RemoteMrSliceMut<'a> {
#[allow(dead_code)]
rmr: &'a mut RemoteMr,
token: MrToken,
}
impl MrAccess for RemoteMrSliceMut<'_> {
#[inline]
fn addr(&self) -> usize {
self.token.addr
}
#[inline]
fn length(&self) -> usize {
self.token.len
}
#[inline]
fn rkey(&self) -> u32 {
self.token.rkey
}
#[inline]
fn token(&self) -> MrToken {
self.token
}
}
impl<'a> RemoteMrSliceMut<'a> {
#[inline]
pub(crate) fn new_from_token(rmr: &'a mut RemoteMr, token: MrToken) -> Self {
Self { rmr, token }
}
}
impl RemoteMrReadAccess for RemoteMrSliceMut<'_> {}
impl RemoteMrWriteAccess for RemoteMrSliceMut<'_> {}