1#![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}