Use HostFd to manage the lifetime of host OS resources
This commit is contained in:
parent
83ce318f6c
commit
34288a5e37
@ -49,13 +49,6 @@ extern "C" {
|
|||||||
fn occlum_ocall_eventfd(ret: *mut i32, init_val: u32, flags: i32) -> sgx_status_t;
|
fn occlum_ocall_eventfd(ret: *mut i32, init_val: u32, flags: i32) -> sgx_status_t;
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Drop for EventFile {
|
|
||||||
fn drop(&mut self) {
|
|
||||||
let ret = unsafe { libc::ocall::close(self.host_fd.to_raw() as i32) };
|
|
||||||
assert!(ret == 0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl File for EventFile {
|
impl File for EventFile {
|
||||||
fn read(&self, buf: &mut [u8]) -> Result<usize> {
|
fn read(&self, buf: &mut [u8]) -> Result<usize> {
|
||||||
let (buf_ptr, buf_len) = buf.as_mut().as_mut_ptr_and_len();
|
let (buf_ptr, buf_len) = buf.as_mut().as_mut_ptr_and_len();
|
||||||
|
@ -5,7 +5,16 @@ use super::*;
|
|||||||
|
|
||||||
/// A unique fd from the host OS.
|
/// A unique fd from the host OS.
|
||||||
///
|
///
|
||||||
/// The uniqueness property is important both
|
/// There are two benefits of using `HostFd` instead of `FileDesc`.
|
||||||
|
///
|
||||||
|
/// 1. Uniqueness. Each instance of `HostFd` is guaranteed to have a different
|
||||||
|
/// value. The uniqueness property makes it possible to use `HostFd` as keys of
|
||||||
|
/// a hash table.
|
||||||
|
///
|
||||||
|
/// 2. Resource Acquisition Is Initialization (RAII). The acquisition and release
|
||||||
|
/// of the host resource represented by a host fd is bound to the lifetime
|
||||||
|
/// of the corresponding instance of `HostFd`. This makes resource management
|
||||||
|
/// simpler and more robust.
|
||||||
#[derive(Debug, PartialEq, Eq, Hash)]
|
#[derive(Debug, PartialEq, Eq, Hash)]
|
||||||
pub struct HostFd(FileDesc);
|
pub struct HostFd(FileDesc);
|
||||||
|
|
||||||
@ -22,11 +31,12 @@ impl HostFd {
|
|||||||
|
|
||||||
impl Drop for HostFd {
|
impl Drop for HostFd {
|
||||||
fn drop(&mut self) {
|
fn drop(&mut self) {
|
||||||
HOST_FD_REGISTRY
|
let raw_fd = self.to_raw();
|
||||||
.lock()
|
HOST_FD_REGISTRY.lock().unwrap().unregister(raw_fd).unwrap();
|
||||||
.unwrap()
|
// Note that close MUST be done after unregistering
|
||||||
.unregister(self.to_raw())
|
unsafe {
|
||||||
.unwrap();
|
libc::ocall::close(raw_fd as i32);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -180,11 +180,3 @@ impl HostFileEpoller {
|
|||||||
&self.host_epoll_fd
|
&self.host_epoll_fd
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Drop for HostFileEpoller {
|
|
||||||
fn drop(&mut self) {
|
|
||||||
unsafe {
|
|
||||||
libc::ocall::close(self.host_epoll_fd.to_raw() as i32);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
@ -134,13 +134,6 @@ impl HostSocket {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Drop for HostSocket {
|
|
||||||
fn drop(&mut self) {
|
|
||||||
let ret = unsafe { libc::ocall::close(self.host_fd.to_raw() as i32) };
|
|
||||||
assert!(ret == 0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pub trait HostSocketType {
|
pub trait HostSocketType {
|
||||||
fn as_host_socket(&self) -> Result<&HostSocket>;
|
fn as_host_socket(&self) -> Result<&HostSocket>;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user