1
1
use { Errno , Result } ;
2
- use libc:: c_int;
2
+ use libc:: { self , c_int} ;
3
3
use std:: os:: unix:: io:: RawFd ;
4
4
5
- mod ffi {
6
- use libc:: { c_int} ;
7
- use super :: EpollEvent ;
8
-
9
- extern {
10
- pub fn epoll_create ( size : c_int ) -> c_int ;
11
- pub fn epoll_ctl ( epfd : c_int , op : c_int , fd : c_int , event : * const EpollEvent ) -> c_int ;
12
- pub fn epoll_wait ( epfd : c_int , events : * mut EpollEvent , max_events : c_int , timeout : c_int ) -> c_int ;
13
- }
14
- }
15
-
16
5
bitflags ! (
17
6
#[ repr( C ) ]
18
- flags EpollEventKind : u32 {
7
+ flags EpollFlags : u32 {
19
8
const EPOLLIN = 0x001 ,
20
9
const EPOLLPRI = 0x002 ,
21
10
const EPOLLOUT = 0x004 ,
@@ -42,54 +31,57 @@ pub enum EpollOp {
42
31
EpollCtlMod = 3
43
32
}
44
33
45
- #[ cfg( not( target_arch = "x86_64" ) ) ]
46
- #[ derive( Clone , Copy ) ]
47
- #[ repr( C ) ]
48
- pub struct EpollEvent {
49
- pub events : EpollEventKind ,
50
- pub data : u64
34
+ libc_bitflags ! {
35
+ flags EpollCreateFlags : c_int {
36
+ EPOLL_CLOEXEC ,
37
+ }
51
38
}
52
39
53
- #[ cfg( target_arch = "x86_64" ) ]
54
40
#[ derive( Clone , Copy ) ]
55
- #[ repr( C , packed ) ]
41
+ #[ repr( C ) ]
56
42
pub struct EpollEvent {
57
- pub events : EpollEventKind ,
58
- pub data : u64
43
+ event : libc:: epoll_event ,
59
44
}
60
45
61
- #[ cfg( any( target_arch = "x86" , target_arch = "x86_64" ) ) ]
62
- #[ test]
63
- fn test_epoll_event_size ( ) {
64
- use std:: mem:: size_of;
65
- assert_eq ! ( size_of:: <EpollEvent >( ) , 12 ) ;
66
- }
46
+ impl EpollEvent {
47
+ pub fn new ( events : EpollFlags , data : u64 ) -> EpollEvent {
48
+ EpollEvent { event : libc:: epoll_event { events : events. bits ( ) , u64 : data } }
49
+ }
50
+
51
+ pub fn events ( & self ) -> EpollFlags {
52
+ EpollFlags :: from_bits ( self . event . events ) . unwrap ( )
53
+ }
67
54
68
- #[ cfg( target_arch = "arm" ) ]
69
- #[ test]
70
- fn test_epoll_event_size ( ) {
71
- use std:: mem:: size_of;
72
- assert_eq ! ( size_of:: <EpollEvent >( ) , 16 ) ;
55
+ pub fn data ( & self ) -> u64 {
56
+ self . event . u64
57
+ }
73
58
}
74
59
75
60
#[ inline]
76
61
pub fn epoll_create ( ) -> Result < RawFd > {
77
- let res = unsafe { ffi:: epoll_create ( 1024 ) } ;
62
+ let res = unsafe { libc:: epoll_create ( 1024 ) } ;
63
+
64
+ Errno :: result ( res)
65
+ }
66
+
67
+ #[ inline]
68
+ pub fn epoll_create1 ( flags : EpollCreateFlags ) -> Result < RawFd > {
69
+ let res = unsafe { libc:: epoll_create1 ( flags. bits ( ) ) } ;
78
70
79
71
Errno :: result ( res)
80
72
}
81
73
82
74
#[ inline]
83
- pub fn epoll_ctl ( epfd : RawFd , op : EpollOp , fd : RawFd , event : & EpollEvent ) -> Result < ( ) > {
84
- let res = unsafe { ffi :: epoll_ctl ( epfd, op as c_int , fd, event as * const EpollEvent ) } ;
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 ) } ;
85
77
86
78
Errno :: result ( res) . map ( drop)
87
79
}
88
80
89
81
#[ inline]
90
82
pub fn epoll_wait ( epfd : RawFd , events : & mut [ EpollEvent ] , timeout_ms : isize ) -> Result < usize > {
91
83
let res = unsafe {
92
- ffi :: epoll_wait ( epfd, events. as_mut_ptr ( ) , events. len ( ) as c_int , timeout_ms as c_int )
84
+ libc :: epoll_wait ( epfd, events. as_mut_ptr ( ) as * mut libc :: epoll_event , events. len ( ) as c_int , timeout_ms as c_int )
93
85
} ;
94
86
95
87
Errno :: result ( res) . map ( |r| r as usize )
0 commit comments