MCPcopy Create free account
hub / github.com/PLSysSec/wave / parse_subscriptions

Function parse_subscriptions

src/poll.rs:101–152  ·  view source on GitHub ↗

#[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>,

Source from the content-addressed store, hash-verified

99#[ensures(trace_safe(trace, ctx))]
100// #[external_calls(poll_handle_fds, poll_handle_clock)]
101pub 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))]

Callers 1

wasi_poll_oneoffFunction · 0.85

Calls 3

poll_parse_clockFunction · 0.85
poll_parse_fdsFunction · 0.85
fits_in_lin_mem_usizeMethod · 0.80

Tested by

no test coverage detected