wasmer_wasix/syscalls/journal/
maybe_snapshot_many.rs

1use super::*;
2
3#[allow(clippy::extra_unused_type_parameters)]
4#[cfg(not(feature = "journal"))]
5pub fn maybe_snapshot_many<M: MemorySize>(
6    ctx: FunctionEnvMut<'_, WasiEnv>,
7    _trigger: crate::journal::SnapshotTrigger,
8) -> WasiResult<FunctionEnvMut<'_, WasiEnv>> {
9    Ok(Ok(ctx))
10}
11
12#[cfg(feature = "journal")]
13pub fn maybe_snapshot_many<M: MemorySize>(
14    mut ctx: FunctionEnvMut<'_, WasiEnv>,
15    trigger: crate::journal::SnapshotTrigger,
16) -> WasiResult<FunctionEnvMut<'_, WasiEnv>> {
17    use crate::os::task::process::{WasiProcessCheckpoint, WasiProcessInner};
18
19    if unsafe { handle_rewind_ext_with_default::<M, ()>(&mut ctx, HandleRewindType::ResultLess) }
20        .is_some()
21    {
22        return Ok(Ok(ctx));
23    }
24
25    if !ctx.data().enable_journal {
26        return Ok(Ok(ctx));
27    }
28
29    if ctx.data_mut().has_snapshot_trigger(trigger) {
30        let inner = ctx.data().process.inner.clone();
31        let res = wasi_try_ok_ok!(WasiProcessInner::checkpoint::<M>(
32            inner,
33            ctx,
34            WasiProcessCheckpoint::Snapshot { trigger },
35        )?);
36        match res {
37            MaybeCheckpointResult::Unwinding => return Ok(Err(Errno::Success)),
38            MaybeCheckpointResult::NotThisTime(c) => {
39                ctx = c;
40            }
41        }
42    }
43    Ok(Ok(ctx))
44}