From ae38c0f6d70029fe036ca196e9ee40c23f2b308c Mon Sep 17 00:00:00 2001 From: Caio Ramos Casimiro Date: Wed, 15 Jan 2025 14:10:37 +0000 Subject: [PATCH] Add support for foreign function callbacks. (#290) Signed-off-by: Caio Ramos Casimiro --- src/dispatcher.rs | 26 ++++++++++++++++++++++++++ src/traits.rs | 2 ++ src/types.rs | 1 + 3 files changed, 29 insertions(+) diff --git a/src/dispatcher.rs b/src/dispatcher.rs index 671ef0f3..19742565 100644 --- a/src/dispatcher.rs +++ b/src/dispatcher.rs @@ -554,6 +554,22 @@ impl Dispatcher { } } } + + fn on_foreign_function(&self, context_id: u32, function_id: u32, arugments_size: usize) { + if let Some(http_stream) = self.http_streams.borrow_mut().get_mut(&context_id) { + self.active_id.set(context_id); + hostcalls::set_effective_context(context_id).unwrap(); + http_stream.on_foreign_function(function_id, arugments_size) + } else if let Some(stream) = self.streams.borrow_mut().get_mut(&context_id) { + self.active_id.set(context_id); + hostcalls::set_effective_context(context_id).unwrap(); + stream.on_foreign_function(function_id, arugments_size) + } else if let Some(root) = self.roots.borrow_mut().get_mut(&context_id) { + self.active_id.set(context_id); + hostcalls::set_effective_context(context_id).unwrap(); + root.on_foreign_function(function_id, arugments_size) + } + } } #[no_mangle] @@ -722,3 +738,13 @@ pub extern "C" fn proxy_on_grpc_receive_trailing_metadata( pub extern "C" fn proxy_on_grpc_close(_context_id: u32, token_id: u32, status_code: u32) { DISPATCHER.with(|dispatcher| dispatcher.on_grpc_close(token_id, status_code)) } + +#[no_mangle] +pub extern "C" fn proxy_on_foreign_function( + context_id: u32, + function_id: u32, + arguments_size: usize, +) { + DISPATCHER + .with(|dispatcher| dispatcher.on_foreign_function(context_id, function_id, arguments_size)) +} diff --git a/src/traits.rs b/src/traits.rs index e0ae9477..065e8367 100644 --- a/src/traits.rs +++ b/src/traits.rs @@ -197,6 +197,8 @@ pub trait Context { hostcalls::get_grpc_status().unwrap() } + fn on_foreign_function(&mut self, _function_id: u32, _arguments_size: usize) {} + fn call_foreign_function( &self, function_name: &str, diff --git a/src/types.rs b/src/types.rs index 7407d3ca..4272ba90 100644 --- a/src/types.rs +++ b/src/types.rs @@ -81,6 +81,7 @@ pub enum BufferType { GrpcReceiveBuffer = 5, VmConfiguration = 6, PluginConfiguration = 7, + CallData = 8, } #[repr(u32)]