xen/foreignmemory/
handle.rs1use 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}