11use { Errno , Result } ;
22use libc:: { self , c_int} ;
33use std:: os:: unix:: io:: RawFd ;
4+ use std:: ptr;
5+ use std:: mem;
6+ use :: Error ;
47
58bitflags ! (
69 #[ repr( C ) ]
@@ -23,7 +26,7 @@ bitflags!(
2326 }
2427) ;
2528
26- #[ derive( Clone , Copy ) ]
29+ #[ derive( Clone , Copy , Eq , PartialEq ) ]
2730#[ repr( C ) ]
2831pub enum EpollOp {
2932 EpollCtlAdd = 1 ,
@@ -44,10 +47,14 @@ pub struct EpollEvent {
4447}
4548
4649impl EpollEvent {
47- pub fn new ( events : EpollFlags , data : u64 ) -> EpollEvent {
50+ pub fn new ( events : EpollFlags , data : u64 ) -> Self {
4851 EpollEvent { event : libc:: epoll_event { events : events. bits ( ) , u64 : data } }
4952 }
5053
54+ pub fn empty ( ) -> Self {
55+ unsafe { mem:: zeroed :: < EpollEvent > ( ) }
56+ }
57+
5158 pub fn events ( & self ) -> EpollFlags {
5259 EpollFlags :: from_bits ( self . event . events ) . unwrap ( )
5360 }
@@ -57,6 +64,16 @@ impl EpollEvent {
5764 }
5865}
5966
67+ impl < ' a > Into < & ' a mut EpollEvent > for Option < & ' a mut EpollEvent > {
68+ #[ inline]
69+ fn into ( self ) -> & ' a mut EpollEvent {
70+ match self {
71+ Some ( epoll_event) => epoll_event,
72+ None => unsafe { & mut * ptr:: null_mut :: < EpollEvent > ( ) }
73+ }
74+ }
75+ }
76+
6077#[ inline]
6178pub fn epoll_create ( ) -> Result < RawFd > {
6279 let res = unsafe { libc:: epoll_create ( 1024 ) } ;
@@ -72,10 +89,16 @@ pub fn epoll_create1(flags: EpollCreateFlags) -> Result<RawFd> {
7289}
7390
7491#[ inline]
75- pub fn epoll_ctl ( epfd : RawFd , op : EpollOp , fd : RawFd , event : & mut EpollEvent ) -> Result < ( ) > {
76- let res = unsafe { libc:: epoll_ctl ( epfd, op as c_int , fd, & mut event. event ) } ;
77-
78- Errno :: result ( res) . map ( drop)
92+ pub fn epoll_ctl < ' a , T > ( epfd : RawFd , op : EpollOp , fd : RawFd , event : T ) -> Result < ( ) >
93+ where T : Into < & ' a mut EpollEvent >
94+ {
95+ let event: & mut EpollEvent = event. into ( ) ;
96+ if event as * const EpollEvent == ptr:: null ( ) && op != EpollOp :: EpollCtlDel {
97+ Err ( Error :: Sys ( Errno :: EINVAL ) )
98+ } else {
99+ let res = unsafe { libc:: epoll_ctl ( epfd, op as c_int , fd, & mut event. event ) } ;
100+ Errno :: result ( res) . map ( drop)
101+ }
79102}
80103
81104#[ inline]
0 commit comments