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