From c33fa7498a66c45ce2a708a514df1a05ad1ef7c9 Mon Sep 17 00:00:00 2001 From: Christopher Dumoulin Date: Mon, 1 Feb 2021 14:46:24 +0000 Subject: Close file descriptor on drop in TimerFd --- src/sys/timerfd.rs | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/sys/timerfd.rs b/src/sys/timerfd.rs index 3086309e..4a247194 100644 --- a/src/sys/timerfd.rs +++ b/src/sys/timerfd.rs @@ -37,7 +37,7 @@ use std::os::unix::io::{AsRawFd, FromRawFd, RawFd}; /// A timerfd instance. This is also a file descriptor, you can feed it to /// other interfaces consuming file descriptors, epoll for example. -#[derive(Debug, Clone, Copy)] +#[derive(Debug)] pub struct TimerFd { fd: RawFd, } @@ -166,7 +166,7 @@ pub enum Expiration { impl TimerFd { /// Creates a new timer based on the clock defined by `clockid`. The /// underlying fd can be assigned specific flags with `flags` (CLOEXEC, - /// NONBLOCK). + /// NONBLOCK). The underlying fd will be closed on drop. pub fn new(clockid: ClockId, flags: TimerFlags) -> Result { Errno::result(unsafe { libc::timerfd_create(clockid as i32, flags.bits()) }) .map(|fd| Self { fd }) @@ -270,3 +270,16 @@ impl TimerFd { Ok(()) } } + +impl Drop for TimerFd { + fn drop(&mut self) { + if !std::thread::panicking() { + let result = Errno::result(unsafe { + libc::close(self.fd) + }); + if let Err(Error::Sys(Errno::EBADF)) = result { + panic!("close of TimerFd encountered EBADF"); + } + } + } +} -- cgit v1.2.3