use crate::error::{Error, Result};
use crate::ffi;
mod blocking;
mod mgmt;
mod nonblocking;
mod p2p;
mod persistent;
mod v_collective;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[repr(i32)]
pub enum SplitType {
Shared = 0,
}
pub struct Communicator {
pub(crate) handle: i32,
pub(crate) rank: i32,
pub(crate) size: i32,
}
unsafe impl Send for Communicator {}
unsafe impl Sync for Communicator {}
impl Communicator {
pub const UNDEFINED: i32 = -1;
pub(crate) fn world() -> Self {
let handle = unsafe { ffi::ferrompi_comm_world() };
Self::from_handle(handle).expect("COMM_WORLD must be valid post-init")
}
pub(crate) fn from_handle(handle: i32) -> Result<Self> {
let mut rank: i32 = 0;
let ret = unsafe { ffi::ferrompi_comm_rank(handle, &mut rank) };
Error::check_with_op(ret, "comm_rank")?;
let mut size: i32 = 0;
let ret = unsafe { ffi::ferrompi_comm_size(handle, &mut size) };
Error::check_with_op(ret, "comm_size")?;
Ok(Communicator { handle, rank, size })
}
pub fn raw_handle(&self) -> i32 {
self.handle
}
#[inline]
pub fn rank(&self) -> i32 {
self.rank
}
#[inline]
pub fn size(&self) -> i32 {
self.size
}
}
impl Drop for Communicator {
fn drop(&mut self) {
if self.handle != 0 {
unsafe { ffi::ferrompi_comm_free(self.handle) };
}
}
}
const _: () = {
#[allow(dead_code)]
fn assert_send_sync<T: Send + Sync>() {}
#[allow(dead_code)]
fn check() {
assert_send_sync::<Communicator>();
}
};
#[cfg(test)]
mod tests {
use crate::comm::{Communicator, SplitType};
fn dummy_comm() -> Communicator {
Communicator {
handle: 0,
rank: 0,
size: 1,
}
}
#[test]
fn cached_rank_size_returns_field_values() {
let comm = Communicator {
handle: 0,
rank: 7,
size: 42,
};
assert_eq!(comm.rank(), 7);
assert_eq!(comm.size(), 42);
}
#[test]
fn split_type_shared_repr_value_and_traits() {
assert_eq!(SplitType::Shared as i32, 0);
let st = SplitType::Shared;
let cloned = st;
assert_eq!(cloned, SplitType::Shared);
assert_eq!(format!("{:?}", st), "Shared");
}
#[test]
fn communicator_undefined_is_negative_one() {
assert_eq!(Communicator::UNDEFINED, -1);
}
#[test]
fn communicator_raw_handle_returns_correct_value() {
let comm = dummy_comm();
assert_eq!(comm.raw_handle(), 0);
}
}