Sfoglia il codice sorgente

Fixes for epoll on Redox

Jeremy Soller 6 anni fa
parent
commit
8efa7a3ed8
1 ha cambiato i file con 33 aggiunte e 22 eliminazioni
  1. 33 22
      src/platform/redox/epoll.rs

+ 33 - 22
src/platform/redox/epoll.rs

@@ -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(
-            epfd,
-            &Event {
-                id: fd as usize,
-                flags: unsafe { (*event).events as usize },
+        match op {
+            EPOLL_CTL_ADD => {
+                println!("Add {}, {}, {}", fd, unsafe { (*event).events }, unsafe { (*event).data.u64 });
+                Sys::write(
+                    epfd,
+                    &Event {
+                        id: fd as usize,
+                        flags: unsafe { (*event).events as usize },
 
 
-                // NOTE: Danger when using non 64-bit systems. If this is
-                // needed, use a box or something
-                data: unsafe { mem::transmute((*event).data) },
+                        // NOTE: Danger when using non 64-bit systems. If this is
+                        // needed, use a box or something
+                        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;
-        if timeout != -1 {
-            _timer = File::open(CStr::from_bytes_with_nul(b"time:\0").unwrap(), O_RDWR);
-            match _timer {
+        let timer_opt = if timeout != -1 {
+            match File::open(CStr::from_bytes_with_nul(b"time:\0").unwrap(), O_RDWR) {
                 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 {
                     {
                     {
                         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 {
         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);
-                if event.data == 0 {
-                    return EINTR;
+                let event_ptr = events.add(i);
+                let event = *(event_ptr as *mut Event);
+                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>());
             }
             }
         }
         }