1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
use crate::protection_domain::ProtectionDomain;
use rdma_sys::{ibv_alloc_mw, ibv_mw, ibv_mw_type};
use std::{io, sync::Arc};

// TODO: MW implementation is not complete
/// Memory window wrapper
#[allow(dead_code)]
struct MemoryWindow {
    /// The inner memory window pointer
    inner_mw: *mut ibv_mw,
}

#[allow(dead_code)]
impl MemoryWindow {
    /// Create a new memory windows
    fn create(pd: &Arc<ProtectionDomain>) -> io::Result<Self> {
        let inner_mw = unsafe { ibv_alloc_mw(pd.as_ptr(), ibv_mw_type::IBV_MW_TYPE_1) }
            .ok_or_else(io::Error::last_os_error)?;
        if inner_mw.is_null() {
            dbg!(io::Error::last_os_error());
        }
        Ok(Self { inner_mw })
    }
}

#[cfg(test)]
mod tests {
    use super::MemoryWindow;
    use crate::{io, Arc, Context};

    #[test]
    fn test_create() -> io::Result<()> {
        let ctx = Arc::new(Context::open(None, 1, 0)?);
        let pd = Arc::new(ctx.create_protection_domain()?);
        let _mw = MemoryWindow::create(&pd)?;
        dbg!(io::Error::last_os_error());
        Ok(())
    }
}