Skip to main content

xen/foreignmemory/
handle.rs

1use xen_sys::{
2    xenforeignmemory_close, xenforeignmemory_handle, xenforeignmemory_open, xentoollog_logger,
3};
4
5use crate::XenError;
6
7#[derive(Debug, Clone)]
8pub struct XenForeignMemoryHandle(pub(crate) *mut xenforeignmemory_handle);
9
10impl XenForeignMemoryHandle {
11    pub fn new() -> Result<Self, XenError> {
12        Self::new_with_options(None, 0)
13    }
14
15    pub fn new_with_options(
16        logger: Option<&mut xentoollog_logger>,
17        flags: u32,
18    ) -> Result<Self, XenError> {
19        let handle = unsafe {
20            xenforeignmemory_open(
21                logger.map_or_else(std::ptr::null_mut, |p| p as *mut _),
22                flags,
23            )
24        };
25
26        if handle.is_null() {
27            return Err(XenError::Other("Failed to open Xen event channel"));
28        }
29
30        Ok(Self(handle))
31    }
32}
33
34impl Drop for XenForeignMemoryHandle {
35    fn drop(&mut self) {
36        tracing::trace!("closing Xen foreign memory handle");
37        unsafe {
38            xenforeignmemory_close(self.0);
39        }
40    }
41}