Skip to main content

canic_core/memory/
mod.rs

1//! Module: memory
2//!
3//! Responsibility: adapt Canic stable-memory declarations to `ic-memory` bootstrap.
4//! Also owns physical stable-memory extent observation for runtime metrics.
5//! Does not own: stable data schemas, ops storage APIs, or lifecycle orchestration.
6//! Boundary: lifecycle initializes this before stable structures are accessed.
7
8pub mod admission;
9pub(crate) mod ledger;
10mod policy;
11pub mod registry;
12pub mod runtime;
13
14pub use crate::{ic_memory_key, ic_memory_range, memory_bootstrap_admission};
15pub use policy::CanicMemoryManagerPolicy;
16
17/// Stable allocation-policy authority for Canic core memory declarations.
18pub const CANIC_CORE_MEMORY_AUTHORITY: &str = "canic-core";
19/// Stable allocation-policy authority for Canic control-plane memory declarations.
20pub const CANIC_CONTROL_PLANE_MEMORY_AUTHORITY: &str = "canic-control-plane";
21
22/// Bucket size compiled into this artifact, in 64 KiB Wasm pages.
23///
24/// # Panics
25/// Panics if the build script supplies an invalid value; normal builds validate it first.
26#[must_use]
27pub fn configured_bucket_pages() -> u16 {
28    env!("CANIC_MEMORY_BUCKET_PAGES")
29        .parse()
30        .expect("build-validated memory bucket size")
31}
32
33/// Observe the current physical stable-memory extent without allocating or reading data.
34#[cfg(target_arch = "wasm32")]
35pub(crate) fn stable_extent_bytes() -> u64 {
36    ic_cdk::api::stable_size().saturating_mul(65_536)
37}
38
39pub(crate) fn bootstrap_default_memory_manager()
40-> Result<(), ic_memory::RuntimeBootstrapError<registry::MemoryRegistryError>> {
41    let config = ic_memory::MemoryManagerConfig::new(configured_bucket_pages())
42        .map_err(ic_memory::RuntimeStateError::from)?;
43    let mut policy = policy::CanicMemoryManagerPolicy::new();
44    if let Some(participant) =
45        admission::seal().map_err(ic_memory::RuntimeBootstrapError::AdmissionPolicy)?
46    {
47        policy = policy.with_admission(participant);
48    }
49    ic_memory::bootstrap_default_memory_manager_with_config(config, &policy).map(|_| ())
50}