Skip to content
This repository was archived by the owner on Sep 8, 2025. It is now read-only.

Commit 66bd2cb

Browse files
authored
Merge pull request #141 from alexcrichton/fix-waitable-set-poll
Update ABI of `waitable-set.poll`
2 parents 4e4128c + c5ed311 commit 66bd2cb

3 files changed

Lines changed: 24 additions & 45 deletions

File tree

crates/test-programs/src/async_.rs

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -42,13 +42,10 @@ unsafe extern "C" {
4242
pub fn waitable_set_poll_raw(_: u32, _: *mut u32) -> u32;
4343
}
4444

45-
pub fn waitable_set_poll(set: u32) -> Option<(u32, u32, u32)> {
46-
let mut payload = [0u32; 3];
47-
if unsafe { waitable_set_poll_raw(set, payload.as_mut_ptr()) } != 0 {
48-
Some((payload[0], payload[1], payload[2]))
49-
} else {
50-
None
51-
}
45+
pub fn waitable_set_poll(set: u32) -> (u32, u32, u32) {
46+
let mut payload = [0u32; 2];
47+
let ret0 = unsafe { waitable_set_poll_raw(set, payload.as_mut_ptr()) };
48+
(ret0, payload[0], payload[1])
5249
}
5350

5451
#[cfg(target_arch = "wasm32")]

crates/test-programs/src/bin/async_poll_synchronous.rs

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ use {
1313
bindings::{exports::local::local::run::Guest, local::local::ready},
1414
test_programs::async_::{
1515
subtask_drop, waitable_join, waitable_set_drop, waitable_set_new, waitable_set_poll,
16-
EVENT_SUBTASK, STATUS_RETURNED,
16+
EVENT_NONE, EVENT_SUBTASK, STATUS_RETURNED,
1717
},
1818
};
1919

@@ -43,32 +43,30 @@ impl Guest for Component {
4343

4444
let set = waitable_set_new();
4545

46-
assert!(waitable_set_poll(set).is_none());
46+
assert_eq!(waitable_set_poll(set), (EVENT_NONE, 0, 0));
4747

4848
let result = async_when_ready();
4949
let status = result & 0xf;
5050
let call = result >> 4;
5151
assert!(status != STATUS_RETURNED);
5252
waitable_join(call, set);
5353

54-
assert!(waitable_set_poll(set).is_none());
54+
assert_eq!(waitable_set_poll(set), (EVENT_NONE, 0, 0));
5555

5656
ready::set_ready(true);
5757

58-
let Some((event, task, code)) = waitable_set_poll(set) else {
59-
panic!()
60-
};
58+
let (event, task, code) = waitable_set_poll(set);
6159
assert_eq!(event, EVENT_SUBTASK);
6260
assert_eq!(call, task);
6361
assert_eq!(code, STATUS_RETURNED);
6462

6563
subtask_drop(task);
6664

67-
assert!(waitable_set_poll(set).is_none());
65+
assert_eq!(waitable_set_poll(set), (EVENT_NONE, 0, 0));
6866

6967
assert!(async_when_ready() == STATUS_RETURNED);
7068

71-
assert!(waitable_set_poll(set).is_none());
69+
assert_eq!(waitable_set_poll(set), (EVENT_NONE, 0, 0));
7270

7371
waitable_set_drop(set);
7472
}

crates/wasmtime/src/runtime/component/concurrent.rs

Lines changed: 14 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -2335,50 +2335,34 @@ impl ComponentInstance {
23352335
(store, options)
23362336
};
23372337

2338-
if wait {
2338+
let (ordinal, handle, result) = if wait {
23392339
self.get_mut(params.set)?.waiting.remove(&guest_task);
2340-
23412340
let (event, handle) =
23422341
event_and_handle.ok_or_else(|| anyhow!("no waitables to wait for"))?;
2343-
23442342
let (ordinal, result) = event.parts();
2345-
let (store, options) = store_and_options(self);
2346-
let ptr = func::validate_inbounds::<(u32, u32)>(
2347-
options.memory_mut(store),
2348-
&ValRaw::u32(params.payload),
2349-
)?;
2350-
options.memory_mut(store)[ptr + 0..][..4]
2351-
.copy_from_slice(&handle.to_le_bytes());
2352-
options.memory_mut(store)[ptr + 4..][..4]
2353-
.copy_from_slice(&result.to_le_bytes());
2354-
2355-
Ok(ordinal)
2343+
(ordinal, handle, result)
23562344
} else {
23572345
if let Some((event, handle)) = event_and_handle {
23582346
let (ordinal, result) = event.parts();
2359-
let (store, options) = store_and_options(self);
2360-
let ptr = func::validate_inbounds::<(u32, u32, u32)>(
2361-
options.memory_mut(store),
2362-
&ValRaw::u32(params.payload),
2363-
)?;
2364-
options.memory_mut(store)[ptr + 0..][..4]
2365-
.copy_from_slice(&ordinal.to_le_bytes());
2366-
options.memory_mut(store)[ptr + 4..][..4]
2367-
.copy_from_slice(&handle.to_le_bytes());
2368-
options.memory_mut(store)[ptr + 8..][..4]
2369-
.copy_from_slice(&result.to_le_bytes());
2370-
2371-
Ok(1)
2347+
(ordinal, handle, result)
23722348
} else {
23732349
log::trace!(
23742350
"no events ready to deliver via waitable-set.poll to {}; set {}",
23752351
guest_task.rep(),
23762352
params.set.rep()
23772353
);
2378-
2379-
Ok(0)
2354+
let (ordinal, result) = Event::None.parts();
2355+
(ordinal, 0, result)
23802356
}
2381-
}
2357+
};
2358+
let (store, options) = store_and_options(self);
2359+
let ptr = func::validate_inbounds::<(u32, u32)>(
2360+
options.memory_mut(store),
2361+
&ValRaw::u32(params.payload),
2362+
)?;
2363+
options.memory_mut(store)[ptr + 0..][..4].copy_from_slice(&handle.to_le_bytes());
2364+
options.memory_mut(store)[ptr + 4..][..4].copy_from_slice(&result.to_le_bytes());
2365+
Ok(ordinal)
23822366
}
23832367
WaitableCheck::Yield => Ok(0),
23842368
};

0 commit comments

Comments
 (0)