use crate::active_messaging::{AmHandleInner, LamellarAny, MultiAmHandleInner, RemotePtr};
use crate::darc::Darc;
use crate::lamellar_task_group::{TaskGroupAmHandleInner, TaskGroupMultiAmHandleInner};
use futures_util::Future;
use std::sync::Arc;
use std::task::Waker;
#[derive(Debug)]
pub(crate) enum InternalResult {
Local(LamellarAny), NewRemote(Vec<u8>, Vec<RemotePtr>), Unit,
}
pub(crate) trait LamellarRequest: Future {
fn launch(&mut self);
fn blocking_wait(self) -> Self::Output;
fn ready_or_set_waker(&mut self, waker: &Waker) -> bool;
fn val(&self) -> Self::Output;
}
pub(crate) trait LamellarRequestAddResult: Sync + Send {
fn user_held(&self) -> bool;
fn add_result(&self, pe: usize, sub_id: usize, data: InternalResult);
fn update_counters(&self, sub_id: usize);
}
pub(crate) enum LamellarRequestResult {
Am(Arc<AmHandleInner>),
MultiAm(Arc<MultiAmHandleInner>),
TgAm(Arc<TaskGroupAmHandleInner>),
TgMultiAm(Arc<TaskGroupMultiAmHandleInner>),
}
impl std::fmt::Debug for LamellarRequestResult {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
Self::Am(_) => write!(f, "Am"),
Self::MultiAm(_) => write!(f, "MultiAm"),
Self::TgAm(_) => write!(f, "TgAm"),
Self::TgMultiAm(_) => write!(f, "TgMultiAm"),
}
}
}
#[lamellar_prof::prof]
impl LamellarRequestResult {
pub(crate) fn add_result_inner<T: LamellarRequestAddResult>(
req: &Arc<T>,
pe: usize,
sub_id: usize,
data: InternalResult,
) -> bool {
let mut added = false;
if req.user_held() {
req.add_result(pe as usize, sub_id, data);
added = true;
} else {
if let InternalResult::NewRemote(_, darcs) = data {
for darc in darcs {
match darc {
RemotePtr::NetworkDarc(darc) => {
let _temp: Darc<()> = darc.into();
}
RemotePtr::NetMemRegionHandle(_mr) => {
}
}
}
}
}
req.update_counters(sub_id);
added
}
pub(crate) fn add_result(&self, pe: usize, sub_id: usize, data: InternalResult) -> bool {
match self {
Self::Am(req) => Self::add_result_inner(req, pe, sub_id, data),
Self::MultiAm(req) => Self::add_result_inner(req, pe, sub_id, data),
Self::TgAm(req) => Self::add_result_inner(req, pe, sub_id, data),
Self::TgMultiAm(req) => Self::add_result_inner(req, pe, sub_id, data),
}
}
}