#[external_calls(poll_handle_fds, poll_handle_clock)]
(
ctx: &VmCtx,
in_ptr: u32,
nsubscriptions: u32,
precision: u64,
min_timeout: &mut Option<Timestamp>,
timeouts: &mut Vec<(u64, Timestamp)>,
pollfds: &mut Vec<libc::pollfd>,
| 99 | #[ensures(trace_safe(trace, ctx))] |
| 100 | // #[external_calls(poll_handle_fds, poll_handle_clock)] |
| 101 | pub fn parse_subscriptions( |
| 102 | ctx: &VmCtx, |
| 103 | in_ptr: u32, |
| 104 | nsubscriptions: u32, |
| 105 | precision: u64, |
| 106 | min_timeout: &mut Option<Timestamp>, |
| 107 | timeouts: &mut Vec<(u64, Timestamp)>, |
| 108 | pollfds: &mut Vec<libc::pollfd>, |
| 109 | fd_data: &mut Vec<(u64, SubscriptionFdType)>, |
| 110 | ) -> RuntimeResult<()> { |
| 111 | let mut i = 0; |
| 112 | while i < nsubscriptions { |
| 113 | body_invariant!(ctx_safe(ctx)); |
| 114 | body_invariant!(trace_safe(trace, ctx)); |
| 115 | |
| 116 | let sub_offset = i * Subscription::WASI_SIZE; |
| 117 | |
| 118 | if !ctx.fits_in_lin_mem_usize( |
| 119 | (in_ptr + sub_offset) as usize, |
| 120 | Subscription::WASI_SIZE as usize, |
| 121 | ) { |
| 122 | return Err(Eoverflow); |
| 123 | } |
| 124 | |
| 125 | let subscription = Subscription::read(ctx, in_ptr + sub_offset)?; |
| 126 | |
| 127 | match subscription.subscription_u { |
| 128 | SubscriptionInner::Clock(subscription_clock) => { |
| 129 | poll_parse_clock( |
| 130 | ctx, |
| 131 | subscription_clock, |
| 132 | precision, |
| 133 | min_timeout, |
| 134 | timeouts, |
| 135 | subscription.userdata, |
| 136 | )?; |
| 137 | } |
| 138 | SubscriptionInner::Fd(subscription_readwrite) => { |
| 139 | poll_parse_fds( |
| 140 | ctx, |
| 141 | pollfds, |
| 142 | fd_data, |
| 143 | subscription.userdata, |
| 144 | subscription_readwrite, |
| 145 | )?; |
| 146 | } |
| 147 | } |
| 148 | |
| 149 | i += 1; |
| 150 | } |
| 151 | Ok(()) |
| 152 | } |
| 153 | |
| 154 | #[with_ghost_var(trace: &mut Trace)] |
| 155 | #[requires(ctx_safe(ctx))] |
no test coverage detected