Skip to content
Snippets Groups Projects
Verified Commit 8efa7a3e authored by Jeremy Soller's avatar Jeremy Soller
Browse files

Fixes for epoll on Redox

parent 3a5a7b33
No related branches found
No related tags found
No related merge requests found
Pipeline #4015 failed
...@@ -23,32 +23,37 @@ impl PalEpoll for Sys { ...@@ -23,32 +23,37 @@ impl PalEpoll for Sys {
} }
fn epoll_ctl(epfd: c_int, op: c_int, fd: c_int, event: *mut epoll_event) -> c_int { fn epoll_ctl(epfd: c_int, op: c_int, fd: c_int, event: *mut epoll_event) -> c_int {
Sys::write( match op {
epfd, EPOLL_CTL_ADD => {
&Event { println!("Add {}, {}, {}", fd, unsafe { (*event).events }, unsafe { (*event).data.u64 });
id: fd as usize, Sys::write(
flags: unsafe { (*event).events as usize }, epfd,
&Event {
id: fd as usize,
flags: unsafe { (*event).events as usize },
// NOTE: Danger when using non 64-bit systems. If this is // NOTE: Danger when using non 64-bit systems. If this is
// needed, use a box or something // needed, use a box or something
data: unsafe { mem::transmute((*event).data) }, data: unsafe { mem::transmute((*event).data) },
},
) as c_int
}, },
) as c_int _ => unimplemented!()
}
} }
fn epoll_pwait( fn epoll_pwait(
epfd: c_int, epfd: c_int,
mut events: *mut epoll_event, events: *mut epoll_event,
maxevents: c_int, maxevents: c_int,
timeout: c_int, timeout: c_int,
_sigset: *const sigset_t, _sigset: *const sigset_t,
) -> c_int { ) -> c_int {
// TODO: sigset // TODO: sigset
assert_eq!(mem::size_of::<epoll_event>(), mem::size_of::<Event>());
let _timer; let timer_opt = if timeout != -1 {
if timeout != -1 { match File::open(CStr::from_bytes_with_nul(b"time:\0").unwrap(), O_RDWR) {
_timer = File::open(CStr::from_bytes_with_nul(b"time:\0").unwrap(), O_RDWR);
match _timer {
Err(_) => return -1, Err(_) => return -1,
Ok(mut timer) => { Ok(mut timer) => {
let mut time = TimeSpec::default(); let mut time = TimeSpec::default();
...@@ -71,9 +76,13 @@ impl PalEpoll for Sys { ...@@ -71,9 +76,13 @@ impl PalEpoll for Sys {
{ {
return -1; return -1;
} }
Some(timer)
} }
} }
} } else {
None
};
let bytes_read = Sys::read(epfd, unsafe { let bytes_read = Sys::read(epfd, unsafe {
slice::from_raw_parts_mut(events as *mut u8, maxevents as usize) slice::from_raw_parts_mut(events as *mut u8, maxevents as usize)
...@@ -81,20 +90,22 @@ impl PalEpoll for Sys { ...@@ -81,20 +90,22 @@ impl PalEpoll for Sys {
if bytes_read == -1 { if bytes_read == -1 {
return -1; return -1;
} }
let read = bytes_read as usize / mem::size_of::<Event>(); let read = bytes_read as usize / mem::size_of::<epoll_event>();
for i in 0..maxevents { for i in 0..read {
unsafe { unsafe {
let event = *(events as *mut Event); let event_ptr = events.add(i);
if event.data == 0 { let event = *(event_ptr as *mut Event);
return EINTR; if let Some(ref timer) = timer_opt {
if event.id as c_int == timer.fd {
return EINTR;
}
} }
*events = epoll_event { *event_ptr = epoll_event {
events: event.flags as _, events: event.flags as _,
data: mem::transmute(event.data), data: mem::transmute(event.data),
..Default::default() ..Default::default()
}; };
events = events.add(mem::size_of::<epoll_event>());
} }
} }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment