Skip to content

Commit d0b8a06

Browse files
committed
Add uninitialized epoll event APIs
Signed-off-by: Alex Saveau <[email protected]>
1 parent 3cb8f68 commit d0b8a06

File tree

3 files changed

+68
-14
lines changed

3 files changed

+68
-14
lines changed

src/backend/libc/event/syscalls.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -243,7 +243,6 @@ pub(crate) fn epoll_del(epoll: BorrowedFd<'_>, source: BorrowedFd) -> io::Result
243243
}
244244
}
245245

246-
#[cfg(feature = "alloc")]
247246
#[inline]
248247
#[cfg(any(linux_kernel, target_os = "redox"))]
249248
pub(crate) fn epoll_wait(

src/backend/linux_raw/event/syscalls.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,6 @@ pub(crate) fn epoll_del(epfd: BorrowedFd<'_>, fd: BorrowedFd) -> io::Result<()>
101101
}
102102
}
103103

104-
#[cfg(feature = "alloc")]
105104
#[inline]
106105
pub(crate) fn epoll_wait(
107106
epfd: BorrowedFd<'_>,

src/event/epoll.rs

Lines changed: 68 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@
7070
//! ```
7171
7272
#![allow(unsafe_code)]
73+
#![allow(deprecated)]
7374

7475
use crate::backend::c;
7576
pub use crate::backend::event::epoll::*;
@@ -190,21 +191,16 @@ pub fn delete(epoll: impl AsFd, source: impl AsFd) -> io::Result<()> {
190191
/// - [Linux]
191192
///
192193
/// [Linux]: https://man7.org/linux/man-pages/man2/epoll_wait.2.html
193-
#[cfg(feature = "alloc")]
194-
#[cfg_attr(doc_cfg, doc(cfg(feature = "alloc")))]
195194
#[inline]
196-
pub fn wait(epoll: impl AsFd, event_list: &mut EventVec, timeout: c::c_int) -> io::Result<()> {
195+
pub fn wait<B: buf::EventBuffer>(
196+
epoll: impl AsFd,
197+
mut events: B,
198+
timeout: c::c_int,
199+
) -> io::Result<B::Out> {
197200
unsafe {
198-
event_list.events.set_len(0);
199-
let nfds = syscalls::epoll_wait(
200-
epoll.as_fd(),
201-
event_list.events.spare_capacity_mut(),
202-
timeout,
203-
)?;
204-
event_list.events.set_len(nfds);
201+
let nfds = syscalls::epoll_wait(epoll.as_fd(), events.convert(), timeout)?;
202+
Ok(events.filled(nfds))
205203
}
206-
207-
Ok(())
208204
}
209205

210206
/// An iterator over the `Event`s in an `EventVec`.
@@ -337,6 +333,7 @@ struct SixtyFourBitPointer {
337333

338334
/// A vector of `Event`s, plus context for interpreting them.
339335
#[cfg(feature = "alloc")]
336+
#[deprecated(note = "Use an array or vec directly instead.")]
340337
pub struct EventVec {
341338
events: Vec<Event>,
342339
}
@@ -437,3 +434,62 @@ fn test_epoll_layouts() {
437434
#[cfg(not(libc))]
438435
check_renamed_struct_renamed_field!(Event, epoll_event, data, data);
439436
}
437+
438+
mod buf {
439+
use super::Event;
440+
#[cfg(feature = "alloc")]
441+
use alloc::vec::Vec;
442+
use core::mem::MaybeUninit;
443+
444+
pub trait EventBuffer {
445+
type Out;
446+
447+
fn convert(&mut self) -> &mut [MaybeUninit<Event>];
448+
449+
unsafe fn filled(self, count: usize) -> Self::Out;
450+
}
451+
452+
#[cfg(feature = "alloc")]
453+
impl EventBuffer for &mut super::EventVec {
454+
type Out = ();
455+
456+
fn convert(&mut self) -> &mut [MaybeUninit<Event>] {
457+
self.events.clear();
458+
self.events.spare_capacity_mut()
459+
}
460+
461+
unsafe fn filled(self, count: usize) -> Self::Out {
462+
unsafe {
463+
self.events.set_len(count);
464+
}
465+
}
466+
}
467+
468+
#[cfg(feature = "alloc")]
469+
impl EventBuffer for &mut Vec<Event> {
470+
type Out = ();
471+
472+
fn convert(&mut self) -> &mut [MaybeUninit<Event>] {
473+
self.spare_capacity_mut()
474+
}
475+
476+
unsafe fn filled(self, count: usize) -> Self::Out {
477+
unsafe {
478+
self.set_len(count);
479+
}
480+
}
481+
}
482+
483+
impl<'a> EventBuffer for &'a mut [MaybeUninit<Event>] {
484+
type Out = &'a mut [Event];
485+
486+
fn convert(&mut self) -> &mut [MaybeUninit<Event>] {
487+
self
488+
}
489+
490+
unsafe fn filled(self, count: usize) -> Self::Out {
491+
let filled = &mut self[..count];
492+
unsafe { core::mem::transmute::<&mut [MaybeUninit<Event>], &mut [Event]>(filled) }
493+
}
494+
}
495+
}

0 commit comments

Comments
 (0)