Skip to content

Commit 60eacee

Browse files
committed
Internalize more details of HandleTable
Don't expose `HandleKind` and of per-function methods for operating on the various kinds of handles that reside in the table.
1 parent be35a1e commit 60eacee

5 files changed

Lines changed: 289 additions & 236 deletions

File tree

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

Lines changed: 25 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ use crate::component::{Component, ComponentInstanceId, HasData, HasSelf, Instanc
5252
use crate::fiber::{self, StoreFiber, StoreFiberYield};
5353
use crate::store::{StoreInner, StoreOpaque, StoreToken};
5454
use crate::vm::component::{
55-
CallContext, ComponentInstance, HandleKind, InstanceFlags, ResourceTables, TransmitLocalState,
55+
CallContext, ComponentInstance, InstanceFlags, ResourceTables, TransmitLocalState,
5656
};
5757
use crate::vm::{SendSyncPtr, VMFuncRef, VMMemoryDefinition, VMStore};
5858
use crate::{AsContext, AsContextMut, StoreContext, StoreContextMut, ValRaw};
@@ -869,18 +869,8 @@ impl ComponentInstance {
869869
"deliver event {event:?} to {guest_task:?} for {waitable:?}; set {set:?}"
870870
);
871871

872-
let entry =
873-
self.as_mut().guest_tables().0[instance].get_mut_handle_by_rep(waitable.rep());
874-
let Some((
875-
handle,
876-
HandleKind::HostTask
877-
| HandleKind::GuestTask
878-
| HandleKind::Stream(..)
879-
| HandleKind::Future(..),
880-
)) = entry
881-
else {
882-
bail!("handle not found for waitable rep {waitable:?} instance {instance:?}");
883-
};
872+
let handle =
873+
self.as_mut().guest_tables().0[instance].waitable_by_rep(waitable.rep())?;
884874

885875
waitable.on_delivery(self, event);
886876

@@ -900,8 +890,7 @@ impl ComponentInstance {
900890
.as_mut()
901891
.concurrent_state_mut()
902892
.push(WaitableSet::default())?;
903-
let handle =
904-
self.guest_tables().0[caller_instance].insert_handle(set.rep(), HandleKind::Set)?;
893+
let handle = self.guest_tables().0[caller_instance].waitable_set_insert(set.rep())?;
905894
log::trace!("new waitable set {set:?} (handle {handle})");
906895
Ok(handle)
907896
}
@@ -912,11 +901,7 @@ impl ComponentInstance {
912901
caller_instance: RuntimeComponentInstanceIndex,
913902
set: u32,
914903
) -> Result<()> {
915-
let (rep, HandleKind::Set) =
916-
self.as_mut().guest_tables().0[caller_instance].remove_handle_by_index(set)?
917-
else {
918-
bail!("invalid waitable-set handle");
919-
};
904+
let rep = self.as_mut().guest_tables().0[caller_instance].waitable_set_remove(set)?;
920905

921906
log::trace!("drop waitable set {rep} (handle {set})");
922907

@@ -964,33 +949,29 @@ impl ComponentInstance {
964949
) -> Result<()> {
965950
self.as_mut().waitable_join(caller_instance, task_id, 0)?;
966951

967-
let (rep, state) =
968-
self.as_mut().guest_tables().0[caller_instance].remove_handle_by_index(task_id)?;
952+
let (rep, is_host) =
953+
self.as_mut().guest_tables().0[caller_instance].subtask_remove(task_id)?;
969954

970955
let concurrent_state = self.concurrent_state_mut();
971956

972-
let (waitable, expected_caller_instance, delete) = match state {
973-
HandleKind::HostTask => {
974-
let id = TableId::<HostTask>::new(rep);
975-
let task = concurrent_state.get(id)?;
976-
if task.abort_handle.is_some() {
977-
bail!("cannot drop a subtask which has not yet resolved");
978-
}
979-
(Waitable::Host(id), task.caller_instance, true)
957+
let (waitable, expected_caller_instance, delete) = if is_host {
958+
let id = TableId::<HostTask>::new(rep);
959+
let task = concurrent_state.get(id)?;
960+
if task.abort_handle.is_some() {
961+
bail!("cannot drop a subtask which has not yet resolved");
980962
}
981-
HandleKind::GuestTask => {
982-
let id = TableId::<GuestTask>::new(rep);
983-
let task = concurrent_state.get(id)?;
984-
if task.lift_result.is_some() {
985-
bail!("cannot drop a subtask which has not yet resolved");
986-
}
987-
if let Caller::Guest { instance, .. } = &task.caller {
988-
(Waitable::Guest(id), *instance, task.exited)
989-
} else {
990-
unreachable!()
991-
}
963+
(Waitable::Host(id), task.caller_instance, true)
964+
} else {
965+
let id = TableId::<GuestTask>::new(rep);
966+
let task = concurrent_state.get(id)?;
967+
if task.lift_result.is_some() {
968+
bail!("cannot drop a subtask which has not yet resolved");
969+
}
970+
if let Caller::Guest { instance, .. } = &task.caller {
971+
(Waitable::Guest(id), *instance, task.exited)
972+
} else {
973+
unreachable!()
992974
}
993-
_ => bail!("invalid task handle: {task_id}"),
994975
};
995976

996977
if waitable.take_event(concurrent_state)?.is_some() {
@@ -2295,7 +2276,7 @@ impl Instance {
22952276
status,
22962277
Some(
22972278
self.id().get_mut(store.0).guest_tables().0[caller_instance]
2298-
.insert_handle(guest_task.rep(), HandleKind::GuestTask)?,
2279+
.subtask_insert_guest(guest_task.rep())?,
22992280
),
23002281
);
23012282
} else {
@@ -2478,7 +2459,7 @@ impl Instance {
24782459
// loop and allocate a waitable handle to return to the guest.
24792460
self.concurrent_state_mut(store.0).push_future(future);
24802461
let handle = self.id().get_mut(store.0).guest_tables().0[caller_instance]
2481-
.insert_handle(task.rep(), HandleKind::HostTask)?;
2462+
.subtask_insert_host(task.rep())?;
24822463
log::trace!(
24832464
"assign {task:?} handle {handle} for {caller:?} instance {caller_instance:?}"
24842465
);

0 commit comments

Comments
 (0)