From a043d9747d68368a423e1ba0d594442db390ddbf Mon Sep 17 00:00:00 2001 From: Michael Mikovsky <77305074+Astatin3@users.noreply.github.com> Date: Sat, 25 Apr 2026 23:45:17 -0600 Subject: [PATCH] Shortcut pending hook activation on first data --- src/protocol/tree/endpoint/hooks.rs | 14 ++++++++++++-- src/protocol/tree/hook.rs | 17 ++++++++++++++--- 2 files changed, 26 insertions(+), 5 deletions(-) diff --git a/src/protocol/tree/endpoint/hooks.rs b/src/protocol/tree/endpoint/hooks.rs index fc57fac..4cc9d22 100644 --- a/src/protocol/tree/endpoint/hooks.rs +++ b/src/protocol/tree/endpoint/hooks.rs @@ -60,8 +60,18 @@ impl ProtocolEndpoint { pending.caller_src_path == header.src_path && pending.procedure_id == message.procedure_id }) { - self.hooks.activate_pending(&host_key); - host_key + let local_ended = self + .hooks + .activate_pending_with_peer_end(&host_key, message.end_hook) + .expect("pending hook was checked above"); + if message.end_hook && local_ended { + self.hooks.remove_active(&host_key); + } + return Ok(EndpointOutcome::Local(LocalEvent::Data { + header, + message, + hook_key: host_key, + })); } else { return Ok(EndpointOutcome::Dropped); }; diff --git a/src/protocol/tree/hook.rs b/src/protocol/tree/hook.rs index d2452d2..af59403 100644 --- a/src/protocol/tree/hook.rs +++ b/src/protocol/tree/hook.rs @@ -98,18 +98,29 @@ impl HookTable { /// Activation intentionally reuses the original hook id and host path, but swaps the /// pending caller attribution into the active peer path used for data routing. pub fn activate_pending(&mut self, key: &HookKey) -> Option<()> { + self.activate_pending_with_peer_end(key, false).map(|_| ()) + } + + /// Promotes a pending hook into the active table and returns whether the local side had + /// already ended before the peer accepted the hook. + pub fn activate_pending_with_peer_end( + &mut self, + key: &HookKey, + peer_ended: bool, + ) -> Option { let pending = self.pending.remove(key)?; + let local_ended = pending.local_ended; self.insert_active( key.clone(), ActiveHook { peer_path: pending.caller_src_path, procedure_id: pending.procedure_id, - local_ended: pending.local_ended, - peer_ended: false, + local_ended, + peer_ended, }, ) .ok()?; - Some(()) + Some(local_ended) } /// Inserts a live hook and its peer-path lookup entry.