@@ -52,7 +52,7 @@ use crate::component::{Component, ComponentInstanceId, HasData, HasSelf, Instanc
5252use crate :: fiber:: { self , StoreFiber , StoreFiberYield } ;
5353use crate :: store:: { StoreInner , StoreOpaque , StoreToken } ;
5454use crate :: vm:: component:: {
55- CallContext , ComponentInstance , HandleKind , InstanceFlags , ResourceTables , TransmitLocalState ,
55+ CallContext , ComponentInstance , InstanceFlags , ResourceTables , TransmitLocalState ,
5656} ;
5757use crate :: vm:: { SendSyncPtr , VMFuncRef , VMMemoryDefinition , VMStore } ;
5858use 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