wasmer_wasix/syscalls/journal/
maybe_snapshot_once.rs1use super::*;
2
3#[allow(clippy::extra_unused_type_parameters)]
4#[cfg(not(feature = "journal"))]
5pub fn maybe_snapshot_once<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_once<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().pop_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}