wasmer_wasix/syscalls/wasix/
callback_signal.rs

1use super::*;
2use crate::syscalls::*;
3
4/// ### `callback_signal()`
5/// Sets the callback to invoke signals
6///
7/// ### Parameters
8///
9/// * `name` - Name of the function that will be invoked
10#[instrument(level = "trace", skip_all, fields(name = field::Empty, funct_is_some = field::Empty), ret)]
11pub fn callback_signal<M: MemorySize>(
12    mut ctx: FunctionEnvMut<'_, WasiEnv>,
13    name: WasmPtr<u8, M>,
14    name_len: M::Offset,
15) -> Result<(), WasiError> {
16    let env = ctx.data();
17    let memory = unsafe { env.memory_view(&ctx) };
18    let name = match name.read_utf8_string(&memory, name_len) {
19        Ok(a) => a,
20        Err(err) => {
21            warn!(
22                "failed to access memory that holds the name of the signal callback: {}",
23                err
24            );
25            return Ok(());
26        }
27    };
28    Span::current().record("name", name.as_str());
29
30    let funct = env
31        .inner()
32        .main_module_instance_handles()
33        .instance
34        .exports
35        .get_typed_function(&ctx, &name)
36        .ok();
37    Span::current().record("funct_is_some", funct.is_some());
38
39    {
40        let mut env_inner = ctx.data_mut().inner_mut();
41        let inner = env_inner.main_module_instance_handles_mut();
42        inner.signal = funct;
43        inner.signal_set = true;
44    }
45
46    WasiEnv::do_pending_operations(&mut ctx)?;
47
48    Ok(())
49}