wasmtime_c_api/
config.rs

1// Don't worry about unused imports if we're frobbing features, only worry about
2// them with the default set of features enabled.
3#![cfg_attr(not(feature = "cache"), allow(unused_imports))]
4
5use crate::{handle_result, wasm_memorytype_t, wasmtime_error_t};
6use std::os::raw::c_char;
7use std::ptr;
8use std::{ffi::CStr, sync::Arc};
9use wasmtime::{
10    Config, InstanceAllocationStrategy, LinearMemory, MemoryCreator, OptLevel, ProfilingStrategy,
11    Result, Strategy,
12};
13
14#[cfg(feature = "pooling-allocator")]
15use wasmtime::PoolingAllocationConfig;
16
17#[repr(C)]
18#[derive(Clone)]
19pub struct wasm_config_t {
20    pub(crate) config: Config,
21}
22
23wasmtime_c_api_macros::declare_own!(wasm_config_t);
24
25#[repr(u8)]
26#[derive(Clone)]
27pub enum wasmtime_strategy_t {
28    WASMTIME_STRATEGY_AUTO,
29    WASMTIME_STRATEGY_CRANELIFT,
30}
31
32#[repr(u8)]
33#[derive(Clone)]
34pub enum wasmtime_opt_level_t {
35    WASMTIME_OPT_LEVEL_NONE,
36    WASMTIME_OPT_LEVEL_SPEED,
37    WASMTIME_OPT_LEVEL_SPEED_AND_SIZE,
38}
39
40#[repr(u8)]
41#[derive(Clone)]
42pub enum wasmtime_profiling_strategy_t {
43    WASMTIME_PROFILING_STRATEGY_NONE,
44    WASMTIME_PROFILING_STRATEGY_JITDUMP,
45    WASMTIME_PROFILING_STRATEGY_VTUNE,
46    WASMTIME_PROFILING_STRATEGY_PERFMAP,
47}
48
49#[unsafe(no_mangle)]
50pub extern "C" fn wasm_config_new() -> Box<wasm_config_t> {
51    Box::new(wasm_config_t {
52        config: Config::default(),
53    })
54}
55
56#[unsafe(no_mangle)]
57pub extern "C" fn wasmtime_config_debug_info_set(c: &mut wasm_config_t, enable: bool) {
58    c.config.debug_info(enable);
59}
60
61#[unsafe(no_mangle)]
62pub extern "C" fn wasmtime_config_consume_fuel_set(c: &mut wasm_config_t, enable: bool) {
63    c.config.consume_fuel(enable);
64}
65
66#[unsafe(no_mangle)]
67pub extern "C" fn wasmtime_config_epoch_interruption_set(c: &mut wasm_config_t, enable: bool) {
68    c.config.epoch_interruption(enable);
69}
70
71#[unsafe(no_mangle)]
72pub extern "C" fn wasmtime_config_max_wasm_stack_set(c: &mut wasm_config_t, size: usize) {
73    c.config.max_wasm_stack(size);
74}
75
76#[unsafe(no_mangle)]
77#[cfg(feature = "threads")]
78pub extern "C" fn wasmtime_config_wasm_threads_set(c: &mut wasm_config_t, enable: bool) {
79    c.config.wasm_threads(enable);
80}
81
82#[unsafe(no_mangle)]
83pub extern "C" fn wasmtime_config_wasm_tail_call_set(c: &mut wasm_config_t, enable: bool) {
84    c.config.wasm_tail_call(enable);
85}
86
87#[unsafe(no_mangle)]
88pub extern "C" fn wasmtime_config_wasm_reference_types_set(c: &mut wasm_config_t, enable: bool) {
89    c.config.wasm_reference_types(enable);
90}
91
92#[unsafe(no_mangle)]
93pub extern "C" fn wasmtime_config_wasm_function_references_set(
94    c: &mut wasm_config_t,
95    enable: bool,
96) {
97    c.config.wasm_function_references(enable);
98}
99
100#[unsafe(no_mangle)]
101pub extern "C" fn wasmtime_config_wasm_gc_set(c: &mut wasm_config_t, enable: bool) {
102    c.config.wasm_gc(enable);
103}
104
105#[unsafe(no_mangle)]
106pub extern "C" fn wasmtime_config_wasm_simd_set(c: &mut wasm_config_t, enable: bool) {
107    c.config.wasm_simd(enable);
108}
109
110#[unsafe(no_mangle)]
111pub extern "C" fn wasmtime_config_wasm_relaxed_simd_set(c: &mut wasm_config_t, enable: bool) {
112    c.config.wasm_relaxed_simd(enable);
113}
114
115#[unsafe(no_mangle)]
116pub extern "C" fn wasmtime_config_wasm_relaxed_simd_deterministic_set(
117    c: &mut wasm_config_t,
118    enable: bool,
119) {
120    c.config.relaxed_simd_deterministic(enable);
121}
122
123#[unsafe(no_mangle)]
124pub extern "C" fn wasmtime_config_wasm_bulk_memory_set(c: &mut wasm_config_t, enable: bool) {
125    c.config.wasm_bulk_memory(enable);
126}
127
128#[unsafe(no_mangle)]
129pub extern "C" fn wasmtime_config_wasm_multi_value_set(c: &mut wasm_config_t, enable: bool) {
130    c.config.wasm_multi_value(enable);
131}
132
133#[unsafe(no_mangle)]
134pub extern "C" fn wasmtime_config_wasm_multi_memory_set(c: &mut wasm_config_t, enable: bool) {
135    c.config.wasm_multi_memory(enable);
136}
137
138#[unsafe(no_mangle)]
139pub extern "C" fn wasmtime_config_wasm_memory64_set(c: &mut wasm_config_t, enable: bool) {
140    c.config.wasm_memory64(enable);
141}
142
143#[unsafe(no_mangle)]
144pub extern "C" fn wasmtime_config_wasm_stack_switching_set(c: &mut wasm_config_t, enable: bool) {
145    c.config.wasm_stack_switching(enable);
146}
147
148#[unsafe(no_mangle)]
149#[cfg(any(feature = "cranelift", feature = "winch"))]
150pub extern "C" fn wasmtime_config_strategy_set(
151    c: &mut wasm_config_t,
152    strategy: wasmtime_strategy_t,
153) {
154    use wasmtime_strategy_t::*;
155    c.config.strategy(match strategy {
156        WASMTIME_STRATEGY_AUTO => Strategy::Auto,
157        WASMTIME_STRATEGY_CRANELIFT => Strategy::Cranelift,
158    });
159}
160
161#[unsafe(no_mangle)]
162#[cfg(feature = "parallel-compilation")]
163pub extern "C" fn wasmtime_config_parallel_compilation_set(c: &mut wasm_config_t, enable: bool) {
164    c.config.parallel_compilation(enable);
165}
166
167#[unsafe(no_mangle)]
168#[cfg(any(feature = "cranelift", feature = "winch"))]
169pub extern "C" fn wasmtime_config_cranelift_debug_verifier_set(
170    c: &mut wasm_config_t,
171    enable: bool,
172) {
173    c.config.cranelift_debug_verifier(enable);
174}
175
176#[unsafe(no_mangle)]
177#[cfg(any(feature = "cranelift", feature = "winch"))]
178pub extern "C" fn wasmtime_config_cranelift_nan_canonicalization_set(
179    c: &mut wasm_config_t,
180    enable: bool,
181) {
182    c.config.cranelift_nan_canonicalization(enable);
183}
184
185#[unsafe(no_mangle)]
186#[cfg(any(feature = "cranelift", feature = "winch"))]
187pub extern "C" fn wasmtime_config_cranelift_opt_level_set(
188    c: &mut wasm_config_t,
189    opt_level: wasmtime_opt_level_t,
190) {
191    use wasmtime_opt_level_t::*;
192    c.config.cranelift_opt_level(match opt_level {
193        WASMTIME_OPT_LEVEL_NONE => OptLevel::None,
194        WASMTIME_OPT_LEVEL_SPEED => OptLevel::Speed,
195        WASMTIME_OPT_LEVEL_SPEED_AND_SIZE => OptLevel::SpeedAndSize,
196    });
197}
198
199#[unsafe(no_mangle)]
200pub extern "C" fn wasmtime_config_profiler_set(
201    c: &mut wasm_config_t,
202    strategy: wasmtime_profiling_strategy_t,
203) {
204    use wasmtime_profiling_strategy_t::*;
205    c.config.profiler(match strategy {
206        WASMTIME_PROFILING_STRATEGY_NONE => ProfilingStrategy::None,
207        WASMTIME_PROFILING_STRATEGY_JITDUMP => ProfilingStrategy::JitDump,
208        WASMTIME_PROFILING_STRATEGY_VTUNE => ProfilingStrategy::VTune,
209        WASMTIME_PROFILING_STRATEGY_PERFMAP => ProfilingStrategy::PerfMap,
210    });
211}
212
213#[unsafe(no_mangle)]
214#[cfg(feature = "cache")]
215pub unsafe extern "C" fn wasmtime_config_cache_config_load(
216    c: &mut wasm_config_t,
217    filename: *const c_char,
218) -> Option<Box<wasmtime_error_t>> {
219    use std::path::Path;
220
221    use wasmtime::Cache;
222
223    handle_result(
224        if filename.is_null() {
225            Cache::from_file(None).map(|cache| c.config.cache(Some(cache)))
226        } else {
227            match CStr::from_ptr(filename).to_str() {
228                Ok(s) => {
229                    Cache::from_file(Some(&Path::new(s))).map(|cache| c.config.cache(Some(cache)))
230                }
231                Err(e) => Err(e.into()),
232            }
233        },
234        |_cfg| {},
235    )
236}
237
238#[unsafe(no_mangle)]
239pub extern "C" fn wasmtime_config_memory_may_move_set(c: &mut wasm_config_t, enable: bool) {
240    c.config.memory_may_move(enable);
241}
242
243#[unsafe(no_mangle)]
244pub extern "C" fn wasmtime_config_memory_reservation_set(c: &mut wasm_config_t, size: u64) {
245    c.config.memory_reservation(size);
246}
247
248#[unsafe(no_mangle)]
249pub extern "C" fn wasmtime_config_memory_guard_size_set(c: &mut wasm_config_t, size: u64) {
250    c.config.memory_guard_size(size);
251}
252
253#[unsafe(no_mangle)]
254pub extern "C" fn wasmtime_config_memory_reservation_for_growth_set(
255    c: &mut wasm_config_t,
256    size: u64,
257) {
258    c.config.memory_reservation_for_growth(size);
259}
260
261#[unsafe(no_mangle)]
262pub extern "C" fn wasmtime_config_native_unwind_info_set(c: &mut wasm_config_t, enabled: bool) {
263    c.config.native_unwind_info(enabled);
264}
265
266#[unsafe(no_mangle)]
267pub unsafe extern "C" fn wasmtime_config_target_set(
268    c: &mut wasm_config_t,
269    target: *const c_char,
270) -> Option<Box<wasmtime_error_t>> {
271    let target = CStr::from_ptr(target).to_str().expect("not valid utf-8");
272    handle_result(c.config.target(target), |_cfg| {})
273}
274
275#[unsafe(no_mangle)]
276pub extern "C" fn wasmtime_config_macos_use_mach_ports_set(c: &mut wasm_config_t, enabled: bool) {
277    c.config.macos_use_mach_ports(enabled);
278}
279
280#[unsafe(no_mangle)]
281#[cfg(any(feature = "cranelift", feature = "winch"))]
282pub unsafe extern "C" fn wasmtime_config_cranelift_flag_enable(
283    c: &mut wasm_config_t,
284    flag: *const c_char,
285) {
286    let flag = CStr::from_ptr(flag).to_str().expect("not valid utf-8");
287    c.config.cranelift_flag_enable(flag);
288}
289
290#[unsafe(no_mangle)]
291#[cfg(any(feature = "cranelift", feature = "winch"))]
292pub unsafe extern "C" fn wasmtime_config_cranelift_flag_set(
293    c: &mut wasm_config_t,
294    flag: *const c_char,
295    value: *const c_char,
296) {
297    let flag = CStr::from_ptr(flag).to_str().expect("not valid utf-8");
298    let value = CStr::from_ptr(value).to_str().expect("not valid utf-8");
299    c.config.cranelift_flag_set(flag, value);
300}
301
302pub type wasmtime_memory_get_callback_t = extern "C" fn(
303    env: *mut std::ffi::c_void,
304    byte_size: &mut usize,
305    maximum_byte_size: &mut usize,
306) -> *mut u8;
307
308pub type wasmtime_memory_grow_callback_t =
309    extern "C" fn(env: *mut std::ffi::c_void, new_size: usize) -> Option<Box<wasmtime_error_t>>;
310
311#[repr(C)]
312pub struct wasmtime_linear_memory_t {
313    env: *mut std::ffi::c_void,
314    get_memory: wasmtime_memory_get_callback_t,
315    grow_memory: wasmtime_memory_grow_callback_t,
316    finalizer: Option<extern "C" fn(arg1: *mut std::ffi::c_void)>,
317}
318
319pub type wasmtime_new_memory_callback_t = extern "C" fn(
320    env: *mut std::ffi::c_void,
321    ty: &wasm_memorytype_t,
322    minimum: usize,
323    maximum: usize,
324    reserved_size_in_bytes: usize,
325    guard_size_in_bytes: usize,
326    memory_ret: *mut wasmtime_linear_memory_t,
327) -> Option<Box<wasmtime_error_t>>;
328
329struct CHostLinearMemory {
330    foreign: crate::ForeignData,
331    get_memory: wasmtime_memory_get_callback_t,
332    grow_memory: wasmtime_memory_grow_callback_t,
333}
334
335unsafe impl LinearMemory for CHostLinearMemory {
336    fn byte_size(&self) -> usize {
337        let mut byte_size = 0;
338        let mut byte_capacity = 0;
339        let cb = self.get_memory;
340        cb(self.foreign.data, &mut byte_size, &mut byte_capacity);
341        return byte_size;
342    }
343    fn byte_capacity(&self) -> usize {
344        let mut byte_size = 0;
345        let mut byte_capacity = 0;
346        let cb = self.get_memory;
347        cb(self.foreign.data, &mut byte_size, &mut byte_capacity);
348        byte_capacity
349    }
350    fn as_ptr(&self) -> *mut u8 {
351        let mut byte_size = 0;
352        let mut byte_capacity = 0;
353        let cb = self.get_memory;
354        cb(self.foreign.data, &mut byte_size, &mut byte_capacity)
355    }
356    fn grow_to(&mut self, new_size: usize) -> Result<()> {
357        let cb = self.grow_memory;
358        let error = cb(self.foreign.data, new_size);
359        if let Some(err) = error {
360            Err((*err).into())
361        } else {
362            Ok(())
363        }
364    }
365}
366
367#[repr(C)]
368pub struct wasmtime_memory_creator_t {
369    env: *mut std::ffi::c_void,
370    new_memory: wasmtime_new_memory_callback_t,
371    finalizer: Option<extern "C" fn(arg1: *mut std::ffi::c_void)>,
372}
373
374struct CHostMemoryCreator {
375    foreign: crate::ForeignData,
376    new_memory: wasmtime_new_memory_callback_t,
377}
378unsafe impl Send for CHostMemoryCreator {}
379unsafe impl Sync for CHostMemoryCreator {}
380
381unsafe impl MemoryCreator for CHostMemoryCreator {
382    fn new_memory(
383        &self,
384        ty: wasmtime::MemoryType,
385        minimum: usize,
386        maximum: Option<usize>,
387        reserved_size_in_bytes: Option<usize>,
388        guard_size_in_bytes: usize,
389    ) -> Result<Box<dyn wasmtime::LinearMemory>, String> {
390        extern "C" fn panic_get_callback(
391            _env: *mut std::ffi::c_void,
392            _byte_size: &mut usize,
393            _maximum_byte_size: &mut usize,
394        ) -> *mut u8 {
395            panic!("a callback must be set");
396        }
397        extern "C" fn panic_grow_callback(
398            _env: *mut std::ffi::c_void,
399            _size: usize,
400        ) -> Option<Box<wasmtime_error_t>> {
401            panic!("a callback must be set");
402        }
403        let mut memory = wasmtime_linear_memory_t {
404            env: ptr::null_mut(),
405            get_memory: panic_get_callback,
406            grow_memory: panic_grow_callback,
407            finalizer: None,
408        };
409        let cb = self.new_memory;
410        let error = cb(
411            self.foreign.data,
412            &wasm_memorytype_t::new(ty),
413            minimum,
414            maximum.unwrap_or(usize::MAX),
415            reserved_size_in_bytes.unwrap_or(0),
416            guard_size_in_bytes,
417            &mut memory,
418        );
419        match error {
420            None => {
421                let foreign = crate::ForeignData {
422                    data: memory.env,
423                    finalizer: memory.finalizer,
424                };
425                Ok(Box::new(CHostLinearMemory {
426                    foreign,
427                    get_memory: memory.get_memory,
428                    grow_memory: memory.grow_memory,
429                }))
430            }
431            Some(err) => {
432                let err: anyhow::Error = (*err).into();
433                Err(format!("{err}"))
434            }
435        }
436    }
437}
438
439#[unsafe(no_mangle)]
440pub unsafe extern "C" fn wasmtime_config_host_memory_creator_set(
441    c: &mut wasm_config_t,
442    creator: &wasmtime_memory_creator_t,
443) {
444    c.config.with_host_memory(Arc::new(CHostMemoryCreator {
445        foreign: crate::ForeignData {
446            data: creator.env,
447            finalizer: creator.finalizer,
448        },
449        new_memory: creator.new_memory,
450    }));
451}
452
453#[unsafe(no_mangle)]
454pub extern "C" fn wasmtime_config_memory_init_cow_set(c: &mut wasm_config_t, enable: bool) {
455    c.config.memory_init_cow(enable);
456}
457
458#[unsafe(no_mangle)]
459pub extern "C" fn wasmtime_config_wasm_wide_arithmetic_set(c: &mut wasm_config_t, enable: bool) {
460    c.config.wasm_wide_arithmetic(enable);
461}
462
463#[repr(C)]
464#[derive(Clone)]
465#[cfg(feature = "pooling-allocator")]
466pub struct wasmtime_pooling_allocation_config_t {
467    pub(crate) config: PoolingAllocationConfig,
468}
469
470#[unsafe(no_mangle)]
471#[cfg(feature = "pooling-allocator")]
472pub extern "C" fn wasmtime_pooling_allocation_config_new()
473-> Box<wasmtime_pooling_allocation_config_t> {
474    Box::new(wasmtime_pooling_allocation_config_t {
475        config: PoolingAllocationConfig::default(),
476    })
477}
478
479#[unsafe(no_mangle)]
480#[cfg(feature = "pooling-allocator")]
481pub extern "C" fn wasmtime_pooling_allocation_config_delete(
482    _: Box<wasmtime_pooling_allocation_config_t>,
483) {
484}
485
486#[unsafe(no_mangle)]
487#[cfg(feature = "pooling-allocator")]
488pub extern "C" fn wasmtime_pooling_allocation_config_max_unused_warm_slots_set(
489    c: &mut wasmtime_pooling_allocation_config_t,
490    max: u32,
491) {
492    c.config.max_unused_warm_slots(max);
493}
494
495#[unsafe(no_mangle)]
496#[cfg(feature = "pooling-allocator")]
497pub extern "C" fn wasmtime_pooling_allocation_config_decommit_batch_size_set(
498    c: &mut wasmtime_pooling_allocation_config_t,
499    batch_size: usize,
500) {
501    c.config.decommit_batch_size(batch_size);
502}
503
504#[unsafe(no_mangle)]
505#[cfg(all(feature = "pooling-allocator", feature = "async"))]
506pub extern "C" fn wasmtime_pooling_allocation_config_async_stack_keep_resident_set(
507    c: &mut wasmtime_pooling_allocation_config_t,
508    size: usize,
509) {
510    c.config.async_stack_keep_resident(size);
511}
512
513#[unsafe(no_mangle)]
514#[cfg(feature = "pooling-allocator")]
515pub extern "C" fn wasmtime_pooling_allocation_config_linear_memory_keep_resident_set(
516    c: &mut wasmtime_pooling_allocation_config_t,
517    size: usize,
518) {
519    c.config.linear_memory_keep_resident(size);
520}
521
522#[unsafe(no_mangle)]
523#[cfg(feature = "pooling-allocator")]
524pub extern "C" fn wasmtime_pooling_allocation_config_table_keep_resident_set(
525    c: &mut wasmtime_pooling_allocation_config_t,
526    size: usize,
527) {
528    c.config.table_keep_resident(size);
529}
530
531#[unsafe(no_mangle)]
532#[cfg(feature = "pooling-allocator")]
533pub extern "C" fn wasmtime_pooling_allocation_config_total_component_instances_set(
534    c: &mut wasmtime_pooling_allocation_config_t,
535    count: u32,
536) {
537    c.config.total_component_instances(count);
538}
539
540#[unsafe(no_mangle)]
541#[cfg(feature = "pooling-allocator")]
542pub extern "C" fn wasmtime_pooling_allocation_config_max_component_instance_size_set(
543    c: &mut wasmtime_pooling_allocation_config_t,
544    size: usize,
545) {
546    c.config.max_component_instance_size(size);
547}
548
549#[unsafe(no_mangle)]
550#[cfg(feature = "pooling-allocator")]
551pub extern "C" fn wasmtime_pooling_allocation_config_max_core_instances_per_component_set(
552    c: &mut wasmtime_pooling_allocation_config_t,
553    count: u32,
554) {
555    c.config.max_core_instances_per_component(count);
556}
557
558#[unsafe(no_mangle)]
559#[cfg(feature = "pooling-allocator")]
560pub extern "C" fn wasmtime_pooling_allocation_config_max_memories_per_component_set(
561    c: &mut wasmtime_pooling_allocation_config_t,
562    count: u32,
563) {
564    c.config.max_memories_per_component(count);
565}
566
567#[unsafe(no_mangle)]
568#[cfg(feature = "pooling-allocator")]
569pub extern "C" fn wasmtime_pooling_allocation_config_max_tables_per_component_set(
570    c: &mut wasmtime_pooling_allocation_config_t,
571    count: u32,
572) {
573    c.config.max_tables_per_component(count);
574}
575
576#[unsafe(no_mangle)]
577#[cfg(feature = "pooling-allocator")]
578pub extern "C" fn wasmtime_pooling_allocation_config_total_memories_set(
579    c: &mut wasmtime_pooling_allocation_config_t,
580    count: u32,
581) {
582    c.config.total_memories(count);
583}
584
585#[unsafe(no_mangle)]
586#[cfg(feature = "pooling-allocator")]
587pub extern "C" fn wasmtime_pooling_allocation_config_total_tables_set(
588    c: &mut wasmtime_pooling_allocation_config_t,
589    count: u32,
590) {
591    c.config.total_tables(count);
592}
593
594#[unsafe(no_mangle)]
595#[cfg(all(feature = "pooling-allocator", feature = "async"))]
596pub extern "C" fn wasmtime_pooling_allocation_config_total_stacks_set(
597    c: &mut wasmtime_pooling_allocation_config_t,
598    count: u32,
599) {
600    c.config.total_stacks(count);
601}
602
603#[unsafe(no_mangle)]
604#[cfg(feature = "pooling-allocator")]
605pub extern "C" fn wasmtime_pooling_allocation_config_total_core_instances_set(
606    c: &mut wasmtime_pooling_allocation_config_t,
607    count: u32,
608) {
609    c.config.total_core_instances(count);
610}
611
612#[unsafe(no_mangle)]
613#[cfg(feature = "pooling-allocator")]
614pub extern "C" fn wasmtime_pooling_allocation_config_max_core_instance_size_set(
615    c: &mut wasmtime_pooling_allocation_config_t,
616    size: usize,
617) {
618    c.config.max_core_instance_size(size);
619}
620
621#[unsafe(no_mangle)]
622#[cfg(feature = "pooling-allocator")]
623pub extern "C" fn wasmtime_pooling_allocation_config_max_tables_per_module_set(
624    c: &mut wasmtime_pooling_allocation_config_t,
625    tables: u32,
626) {
627    c.config.max_tables_per_module(tables);
628}
629
630#[unsafe(no_mangle)]
631#[cfg(feature = "pooling-allocator")]
632pub extern "C" fn wasmtime_pooling_allocation_config_table_elements_set(
633    c: &mut wasmtime_pooling_allocation_config_t,
634    elements: usize,
635) {
636    c.config.table_elements(elements);
637}
638
639#[unsafe(no_mangle)]
640#[cfg(feature = "pooling-allocator")]
641pub extern "C" fn wasmtime_pooling_allocation_config_max_memories_per_module_set(
642    c: &mut wasmtime_pooling_allocation_config_t,
643    memories: u32,
644) {
645    c.config.max_memories_per_module(memories);
646}
647
648#[unsafe(no_mangle)]
649#[cfg(feature = "pooling-allocator")]
650pub extern "C" fn wasmtime_pooling_allocation_config_max_memory_size_set(
651    c: &mut wasmtime_pooling_allocation_config_t,
652    bytes: usize,
653) {
654    c.config.max_memory_size(bytes);
655}
656
657#[unsafe(no_mangle)]
658#[cfg(all(feature = "pooling-allocator", feature = "gc"))]
659pub extern "C" fn wasmtime_pooling_allocation_config_total_gc_heaps_set(
660    c: &mut wasmtime_pooling_allocation_config_t,
661    count: u32,
662) {
663    c.config.total_gc_heaps(count);
664}
665
666#[unsafe(no_mangle)]
667#[cfg(feature = "pooling-allocator")]
668pub extern "C" fn wasmtime_pooling_allocation_strategy_set(
669    c: &mut wasm_config_t,
670    pc: &wasmtime_pooling_allocation_config_t,
671) {
672    c.config
673        .allocation_strategy(InstanceAllocationStrategy::Pooling(pc.config.clone()));
674}