Skip to content

Commit be35a1e

Browse files
committed
Internalize get_mut_handle_by_index
Internalize implementation details such as the representation of slots to and make methods a bit more targeted in their functionality.
1 parent 2fc49e1 commit be35a1e

4 files changed

Lines changed: 252 additions & 198 deletions

File tree

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

Lines changed: 37 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -749,11 +749,7 @@ impl ComponentInstance {
749749
bail!("invalid waitable-set handle");
750750
}
751751

752-
let (set, HandleKind::Set) =
753-
instance.guest_tables().0[runtime_instance].get_mut_handle_by_index(handle)?
754-
else {
755-
bail!("invalid waitable-set handle");
756-
};
752+
let set = instance.guest_tables().0[runtime_instance].waitable_set_rep(handle)?;
757753

758754
Ok(TableId::<WaitableSet>::new(set))
759755
};
@@ -947,11 +943,8 @@ impl ComponentInstance {
947943
let set = if set_handle == 0 {
948944
None
949945
} else {
950-
let (set, HandleKind::Set) = self.as_mut().guest_tables().0[caller_instance]
951-
.get_mut_handle_by_index(set_handle)?
952-
else {
953-
bail!("invalid waitable-set handle");
954-
};
946+
let set =
947+
self.as_mut().guest_tables().0[caller_instance].waitable_set_rep(set_handle)?;
955948

956949
Some(TableId::<WaitableSet>::new(set))
957950
};
@@ -2750,11 +2743,8 @@ impl Instance {
27502743
let opts = self.concurrent_state_mut(store).options(options);
27512744
let async_ = opts.async_;
27522745
let caller_instance = opts.instance;
2753-
let (rep, HandleKind::Set) = self.id().get_mut(store).guest_tables().0[caller_instance]
2754-
.get_mut_handle_by_index(set)?
2755-
else {
2756-
bail!("invalid waitable-set handle");
2757-
};
2746+
let rep =
2747+
self.id().get_mut(store).guest_tables().0[caller_instance].waitable_set_rep(set)?;
27582748

27592749
self.waitable_check(
27602750
store,
@@ -2779,11 +2769,8 @@ impl Instance {
27792769
let opts = self.concurrent_state_mut(store).options(options);
27802770
let async_ = opts.async_;
27812771
let caller_instance = opts.instance;
2782-
let (rep, HandleKind::Set) = self.id().get_mut(store).guest_tables().0[caller_instance]
2783-
.get_mut_handle_by_index(set)?
2784-
else {
2785-
bail!("invalid waitable-set handle");
2786-
};
2772+
let rep =
2773+
self.id().get_mut(store).guest_tables().0[caller_instance].waitable_set_rep(set)?;
27872774

27882775
self.waitable_check(
27892776
store,
@@ -2918,27 +2905,23 @@ impl Instance {
29182905
async_: bool,
29192906
task_id: u32,
29202907
) -> Result<u32> {
2921-
let (rep, state) = self.id().get_mut(store).guest_tables().0[caller_instance]
2922-
.get_mut_handle_by_index(task_id)?;
2923-
let (waitable, expected_caller_instance) = match state {
2924-
HandleKind::HostTask => {
2925-
let id = TableId::<HostTask>::new(rep);
2926-
(
2927-
Waitable::Host(id),
2928-
self.concurrent_state_mut(store).get(id)?.caller_instance,
2929-
)
2930-
}
2931-
HandleKind::GuestTask => {
2932-
let id = TableId::<GuestTask>::new(rep);
2933-
if let Caller::Guest { instance, .. } =
2934-
&self.concurrent_state_mut(store).get(id)?.caller
2935-
{
2936-
(Waitable::Guest(id), *instance)
2937-
} else {
2938-
unreachable!()
2939-
}
2908+
let (rep, is_host) =
2909+
self.id().get_mut(store).guest_tables().0[caller_instance].subtask_rep(task_id)?;
2910+
let (waitable, expected_caller_instance) = if is_host {
2911+
let id = TableId::<HostTask>::new(rep);
2912+
(
2913+
Waitable::Host(id),
2914+
self.concurrent_state_mut(store).get(id)?.caller_instance,
2915+
)
2916+
} else {
2917+
let id = TableId::<GuestTask>::new(rep);
2918+
if let Caller::Guest { instance, .. } =
2919+
&self.concurrent_state_mut(store).get(id)?.caller
2920+
{
2921+
(Waitable::Guest(id), *instance)
2922+
} else {
2923+
unreachable!()
29402924
}
2941-
_ => bail!("invalid task handle: {task_id}"),
29422925
};
29432926
// Since waitables can neither be passed between instances nor forged,
29442927
// this should never fail unless there's a bug in Wasmtime, but we check
@@ -3768,16 +3751,14 @@ impl Waitable {
37683751
caller_instance: RuntimeComponentInstanceIndex,
37693752
waitable: u32,
37703753
) -> Result<Self> {
3771-
let (waitable, state) =
3772-
state.guest_tables().0[caller_instance].get_mut_handle_by_index(waitable)?;
3773-
3774-
Ok(match state {
3775-
HandleKind::HostTask => Waitable::Host(TableId::new(waitable)),
3776-
HandleKind::GuestTask => Waitable::Guest(TableId::new(waitable)),
3777-
HandleKind::Stream(..) | HandleKind::Future(..) => {
3778-
Waitable::Transmit(TableId::new(waitable))
3779-
}
3780-
_ => bail!("invalid waitable handle"),
3754+
use crate::runtime::vm::component::Waitable;
3755+
3756+
let (waitable, kind) = state.guest_tables().0[caller_instance].waitable_rep(waitable)?;
3757+
3758+
Ok(match kind {
3759+
Waitable::Subtask { is_host: true } => Self::Host(TableId::new(waitable)),
3760+
Waitable::Subtask { is_host: false } => Self::Guest(TableId::new(waitable)),
3761+
Waitable::Stream | Waitable::Future => Self::Transmit(TableId::new(waitable)),
37813762
})
37823763
}
37833764

@@ -3890,14 +3871,9 @@ impl Waitable {
38903871
..
38913872
} => {
38923873
let runtime_instance = instance.component().types()[ty].instance;
3893-
let (rep, HandleKind::Future(actual_ty, state)) = instance.guest_tables().0
3894-
[runtime_instance]
3895-
.get_mut_handle_by_index(handle)
3896-
.unwrap()
3897-
else {
3898-
unreachable!()
3899-
};
3900-
assert_eq!(*actual_ty, ty);
3874+
let (rep, state) = instance.guest_tables().0[runtime_instance]
3875+
.future_rep(ty, handle)
3876+
.unwrap();
39013877
assert_eq!(rep, self.rep());
39023878
assert_eq!(*state, TransmitLocalState::Busy);
39033879
*state = match event {
@@ -3915,14 +3891,9 @@ impl Waitable {
39153891
code,
39163892
} => {
39173893
let runtime_instance = instance.component().types()[ty].instance;
3918-
let (rep, HandleKind::Stream(actual_ty, state)) = instance.guest_tables().0
3919-
[runtime_instance]
3920-
.get_mut_handle_by_index(handle)
3921-
.unwrap()
3922-
else {
3923-
unreachable!()
3924-
};
3925-
assert_eq!(*actual_ty, ty);
3894+
let (rep, state) = instance.guest_tables().0[runtime_instance]
3895+
.stream_rep(ty, handle)
3896+
.unwrap();
39263897
assert_eq!(rep, self.rep());
39273898
assert_eq!(*state, TransmitLocalState::Busy);
39283899
let done = matches!(code, ReturnCode::Dropped(_));

0 commit comments

Comments
 (0)