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