epoll.rs 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. use super::super::types::*;
  2. use super::super::{Pal, PalEpoll};
  3. use super::Sys;
  4. use c_str::CStr;
  5. use core::{mem, slice};
  6. use fs::File;
  7. use io::prelude::*;
  8. use header::errno::*;
  9. use header::fcntl::*;
  10. use header::signal::sigset_t;
  11. use header::sys_epoll::*;
  12. use syscall::data::{Event, TimeSpec};
  13. use syscall::flag::EVENT_READ;
  14. impl PalEpoll for Sys {
  15. fn epoll_create1(flags: c_int) -> c_int {
  16. Sys::open(
  17. CStr::from_bytes_with_nul(b"event:\0").unwrap(),
  18. O_RDWR | flags,
  19. 0
  20. )
  21. }
  22. fn epoll_ctl(epfd: c_int, op: c_int, fd: c_int, event: *mut epoll_event) -> c_int {
  23. let flags = unsafe { (*event).events };
  24. Sys::write(epfd, &Event {
  25. id: fd as usize,
  26. flags: flags as usize,
  27. data: event as usize
  28. }) as c_int
  29. }
  30. fn epoll_pwait(epfd: c_int, mut events: *mut epoll_event, maxevents: c_int, timeout: c_int, _sigset: *const sigset_t) -> c_int {
  31. // TODO: sigset
  32. let mut redox_events = vec![Event::default(); maxevents as usize];
  33. let _timer;
  34. if timeout != -1 {
  35. _timer = File::open(CStr::from_bytes_with_nul(b"time:\0").unwrap(), O_RDWR);
  36. match _timer {
  37. Err(_) => return -1,
  38. Ok(mut timer) => {
  39. let mut time = TimeSpec::default();
  40. if let Err(err) = timer.read(&mut time) {
  41. return -1;
  42. }
  43. time.tv_nsec += timeout;
  44. if let Err(err) = timer.write(&time) {
  45. return -1;
  46. }
  47. if Sys::write(epfd, &Event {
  48. id: timer.fd as usize,
  49. flags: EVENT_READ,
  50. data: 0
  51. }) == -1 {
  52. return -1;
  53. }
  54. }
  55. }
  56. }
  57. let bytes_read = Sys::read(epfd, unsafe { slice::from_raw_parts_mut(
  58. redox_events.as_mut_ptr() as *mut u8,
  59. redox_events.len() * mem::size_of::<Event>()
  60. ) });
  61. if bytes_read == -1 {
  62. return -1;
  63. }
  64. let read = bytes_read as usize / mem::size_of::<Event>();
  65. for event in &redox_events {
  66. if event.data == 0 {
  67. return EINTR;
  68. }
  69. unsafe {
  70. *events = *(event.data as *mut epoll_event);
  71. events = events.add(mem::size_of::<epoll_event>());
  72. }
  73. }
  74. read as c_int
  75. }
  76. }