(
ctx: &mut VmCtx,
out_ptr: u32,
pollfds: &Vec<libc::pollfd>,
fd_data: &Vec<(u64, SubscriptionFdType)>,
)
| 200 | #[external_calls(from_posix, from_poll_revents, Some)] |
| 201 | #[external_methods(to_event_type)] |
| 202 | pub fn writeback_fds( |
| 203 | ctx: &mut VmCtx, |
| 204 | out_ptr: u32, |
| 205 | pollfds: &Vec<libc::pollfd>, |
| 206 | fd_data: &Vec<(u64, SubscriptionFdType)>, |
| 207 | ) -> RuntimeResult<u32> { |
| 208 | let mut num_events_written = 0; |
| 209 | let mut event_idx = 0; |
| 210 | while event_idx < fd_data.len() { |
| 211 | body_invariant!(ctx_safe(ctx)); |
| 212 | body_invariant!(trace_safe(trace, ctx)); |
| 213 | |
| 214 | let (userdata, sub_type) = fd_data[event_idx]; |
| 215 | // let typ = match sub_type { |
| 216 | // SubscriptionFdType::Read => EventType::FdRead, |
| 217 | // SubscriptionFdType::Write => EventType::FdWrite, |
| 218 | // }; |
| 219 | let typ = sub_type.to_event_type(); |
| 220 | |
| 221 | let pollfd = pollfds[event_idx]; |
| 222 | |
| 223 | // if no event ocurred, continue |
| 224 | if pollfd.revents == 0 { |
| 225 | continue; |
| 226 | } |
| 227 | |
| 228 | let event_offset = (num_events_written * Event::WASI_SIZE) as usize; |
| 229 | if !ctx.fits_in_lin_mem_usize(out_ptr as usize + event_offset, Event::WASI_SIZE as usize) { |
| 230 | return Err(Eoverflow); |
| 231 | } |
| 232 | |
| 233 | // get the number of bytes for reading... |
| 234 | // TODO: If we want, we can remove this, and always return 1 for reads |
| 235 | let nbytes = match typ { |
| 236 | EventType::FdRead => trace_fionread(ctx, HostFd::from_raw(pollfd.fd as usize))? as u64, |
| 237 | // no way to check number of bytes for writing |
| 238 | _ => 0, |
| 239 | }; |
| 240 | |
| 241 | let fd_readwrite = EventFdReadWrite { |
| 242 | nbytes, |
| 243 | flags: EventRwFlags::from_posix(pollfd.revents), |
| 244 | }; |
| 245 | |
| 246 | let error = RuntimeError::from_poll_revents(pollfd.revents); |
| 247 | |
| 248 | let event = Event { |
| 249 | userdata, |
| 250 | error, |
| 251 | typ, |
| 252 | fd_readwrite: Some(fd_readwrite), |
| 253 | }; |
| 254 | event.write(ctx, out_ptr + event_offset as u32); |
| 255 | num_events_written += 1; |
| 256 | |
| 257 | event_idx += 1; |
| 258 | } |
| 259 | return Ok(num_events_written); |
no test coverage detected