xref: /wasmtime-44.0.1/crates/c-api/src/config.rs (revision 0dc25e6d)
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 
5 use crate::{handle_result, wasm_memorytype_t, wasmtime_error_t};
6 use std::os::raw::c_char;
7 use std::ptr;
8 use std::{ffi::CStr, sync::Arc};
9 use wasmtime::{
10     Config, InstanceAllocationStrategy, LinearMemory, MemoryCreator, OptLevel, ProfilingStrategy,
11     Result, Strategy,
12 };
13 
14 #[cfg(feature = "pooling-allocator")]
15 use wasmtime::PoolingAllocationConfig;
16 
17 #[repr(C)]
18 #[derive(Clone)]
19 pub struct wasm_config_t {
20     pub(crate) config: Config,
21 }
22 
23 wasmtime_c_api_macros::declare_own!(wasm_config_t);
24 
25 #[repr(u8)]
26 #[derive(Clone)]
27 pub enum wasmtime_strategy_t {
28     WASMTIME_STRATEGY_AUTO,
29     WASMTIME_STRATEGY_CRANELIFT,
30 }
31 
32 #[repr(u8)]
33 #[derive(Clone)]
34 pub 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)]
42 pub 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)]
wasm_config_new() -> Box<wasm_config_t>50 pub 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)]
wasmtime_config_debug_info_set(c: &mut wasm_config_t, enable: bool)57 pub 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)]
wasmtime_config_consume_fuel_set(c: &mut wasm_config_t, enable: bool)62 pub 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)]
wasmtime_config_epoch_interruption_set(c: &mut wasm_config_t, enable: bool)67 pub 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)]
wasmtime_config_max_wasm_stack_set(c: &mut wasm_config_t, size: usize)72 pub 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")]
wasmtime_config_wasm_threads_set(c: &mut wasm_config_t, enable: bool)78 pub 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)]
wasmtime_config_shared_memory_set(c: &mut wasm_config_t, enable: bool)83 pub 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)]
wasmtime_config_wasm_tail_call_set(c: &mut wasm_config_t, enable: bool)88 pub 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)]
wasmtime_config_wasm_reference_types_set(c: &mut wasm_config_t, enable: bool)93 pub 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)]
wasmtime_config_wasm_function_references_set( c: &mut wasm_config_t, enable: bool, )98 pub 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)]
wasmtime_config_wasm_gc_set(c: &mut wasm_config_t, enable: bool)106 pub 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)]
wasmtime_config_gc_support_set(c: &mut wasm_config_t, enable: bool)111 pub 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)]
wasmtime_config_wasm_simd_set(c: &mut wasm_config_t, enable: bool)116 pub 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)]
wasmtime_config_wasm_relaxed_simd_set(c: &mut wasm_config_t, enable: bool)121 pub 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)]
wasmtime_config_wasm_relaxed_simd_deterministic_set( c: &mut wasm_config_t, enable: bool, )126 pub 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)]
wasmtime_config_wasm_bulk_memory_set(c: &mut wasm_config_t, enable: bool)134 pub 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)]
wasmtime_config_wasm_multi_value_set(c: &mut wasm_config_t, enable: bool)139 pub 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)]
wasmtime_config_wasm_multi_memory_set(c: &mut wasm_config_t, enable: bool)144 pub 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)]
wasmtime_config_wasm_memory64_set(c: &mut wasm_config_t, enable: bool)149 pub 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)]
wasmtime_config_wasm_stack_switching_set(c: &mut wasm_config_t, enable: bool)154 pub 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"))]
wasmtime_config_strategy_set( c: &mut wasm_config_t, strategy: wasmtime_strategy_t, )160 pub 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")]
wasmtime_config_parallel_compilation_set(c: &mut wasm_config_t, enable: bool)173 pub 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"))]
wasmtime_config_cranelift_debug_verifier_set( c: &mut wasm_config_t, enable: bool, )179 pub 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"))]
wasmtime_config_cranelift_nan_canonicalization_set( c: &mut wasm_config_t, enable: bool, )188 pub 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"))]
wasmtime_config_cranelift_opt_level_set( c: &mut wasm_config_t, opt_level: wasmtime_opt_level_t, )197 pub 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)]
wasmtime_config_profiler_set( c: &mut wasm_config_t, strategy: wasmtime_profiling_strategy_t, )210 pub 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")]
wasmtime_config_cache_config_load( c: &mut wasm_config_t, filename: *const c_char, ) -> Option<Box<wasmtime_error_t>>225 pub 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)]
wasmtime_config_memory_may_move_set(c: &mut wasm_config_t, enable: bool)249 pub 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)]
wasmtime_config_memory_reservation_set(c: &mut wasm_config_t, size: u64)254 pub 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)]
wasmtime_config_memory_guard_size_set(c: &mut wasm_config_t, size: u64)259 pub 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)]
wasmtime_config_memory_reservation_for_growth_set( c: &mut wasm_config_t, size: u64, )264 pub 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)]
wasmtime_config_native_unwind_info_set(c: &mut wasm_config_t, enabled: bool)272 pub 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)]
wasmtime_config_target_set( c: &mut wasm_config_t, target: *const c_char, ) -> Option<Box<wasmtime_error_t>>277 pub 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)]
wasmtime_config_macos_use_mach_ports_set(c: &mut wasm_config_t, enabled: bool)286 pub 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)]
wasmtime_config_signals_based_traps_set(c: &mut wasm_config_t, enable: bool)291 pub 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"))]
wasmtime_config_cranelift_flag_enable( c: &mut wasm_config_t, flag: *const c_char, )297 pub 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"))]
wasmtime_config_cranelift_flag_set( c: &mut wasm_config_t, flag: *const c_char, value: *const c_char, )307 pub 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 
317 pub 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 
323 pub 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)]
327 pub 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 
334 pub 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 
344 struct CHostLinearMemory {
345     foreign: crate::ForeignData,
346     get_memory: wasmtime_memory_get_callback_t,
347     grow_memory: wasmtime_memory_grow_callback_t,
348 }
349 
350 unsafe impl LinearMemory for CHostLinearMemory {
byte_size(&self) -> usize351     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     }
byte_capacity(&self) -> usize358     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     }
as_ptr(&self) -> *mut u8365     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     }
grow_to(&mut self, new_size: usize) -> Result<()>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)]
383 pub 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 
389 struct CHostMemoryCreator {
390     foreign: crate::ForeignData,
391     new_memory: wasmtime_new_memory_callback_t,
392 }
393 unsafe impl Send for CHostMemoryCreator {}
394 unsafe impl Sync for CHostMemoryCreator {}
395 
396 unsafe impl MemoryCreator for CHostMemoryCreator {
new_memory( &self, ty: wasmtime::MemoryType, minimum: usize, maximum: Option<usize>, reserved_size_in_bytes: Option<usize>, guard_size_in_bytes: usize, ) -> Result<Box<dyn wasmtime::LinearMemory>, String>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)]
wasmtime_config_host_memory_creator_set( c: &mut wasm_config_t, creator: &wasmtime_memory_creator_t, )455 pub 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)]
wasmtime_config_memory_init_cow_set(c: &mut wasm_config_t, enable: bool)469 pub 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)]
wasmtime_config_wasm_wide_arithmetic_set(c: &mut wasm_config_t, enable: bool)474 pub 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)]
wasmtime_config_wasm_exceptions_set(c: &mut wasm_config_t, enable: bool)479 pub 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)]
wasmtime_config_wasm_custom_page_sizes_set(c: &mut wasm_config_t, enable: bool)484 pub 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")]
491 pub struct wasmtime_pooling_allocation_config_t {
492     pub(crate) config: PoolingAllocationConfig,
493 }
494 
495 #[unsafe(no_mangle)]
496 #[cfg(feature = "pooling-allocator")]
wasmtime_pooling_allocation_config_new() -> Box<wasmtime_pooling_allocation_config_t>497 pub 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")]
wasmtime_pooling_allocation_config_delete( _: Box<wasmtime_pooling_allocation_config_t>, )506 pub 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")]
wasmtime_pooling_allocation_config_max_unused_warm_slots_set( c: &mut wasmtime_pooling_allocation_config_t, max: u32, )513 pub 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")]
wasmtime_pooling_allocation_config_decommit_batch_size_set( c: &mut wasmtime_pooling_allocation_config_t, batch_size: usize, )522 pub 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"))]
wasmtime_pooling_allocation_config_async_stack_keep_resident_set( c: &mut wasmtime_pooling_allocation_config_t, size: usize, )531 pub 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")]
wasmtime_pooling_allocation_config_linear_memory_keep_resident_set( c: &mut wasmtime_pooling_allocation_config_t, size: usize, )540 pub 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")]
wasmtime_pooling_allocation_config_table_keep_resident_set( c: &mut wasmtime_pooling_allocation_config_t, size: usize, )549 pub 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")]
wasmtime_pooling_allocation_config_total_component_instances_set( c: &mut wasmtime_pooling_allocation_config_t, count: u32, )558 pub 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")]
wasmtime_pooling_allocation_config_max_component_instance_size_set( c: &mut wasmtime_pooling_allocation_config_t, size: usize, )567 pub 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")]
wasmtime_pooling_allocation_config_max_core_instances_per_component_set( c: &mut wasmtime_pooling_allocation_config_t, count: u32, )576 pub 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")]
wasmtime_pooling_allocation_config_max_memories_per_component_set( c: &mut wasmtime_pooling_allocation_config_t, count: u32, )585 pub 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")]
wasmtime_pooling_allocation_config_max_tables_per_component_set( c: &mut wasmtime_pooling_allocation_config_t, count: u32, )594 pub 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")]
wasmtime_pooling_allocation_config_total_memories_set( c: &mut wasmtime_pooling_allocation_config_t, count: u32, )603 pub 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")]
wasmtime_pooling_allocation_config_total_tables_set( c: &mut wasmtime_pooling_allocation_config_t, count: u32, )612 pub 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"))]
wasmtime_pooling_allocation_config_total_stacks_set( c: &mut wasmtime_pooling_allocation_config_t, count: u32, )621 pub 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")]
wasmtime_pooling_allocation_config_total_core_instances_set( c: &mut wasmtime_pooling_allocation_config_t, count: u32, )630 pub 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")]
wasmtime_pooling_allocation_config_max_core_instance_size_set( c: &mut wasmtime_pooling_allocation_config_t, size: usize, )639 pub 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")]
wasmtime_pooling_allocation_config_max_tables_per_module_set( c: &mut wasmtime_pooling_allocation_config_t, tables: u32, )648 pub 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")]
wasmtime_pooling_allocation_config_table_elements_set( c: &mut wasmtime_pooling_allocation_config_t, elements: usize, )657 pub 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")]
wasmtime_pooling_allocation_config_max_memories_per_module_set( c: &mut wasmtime_pooling_allocation_config_t, memories: u32, )666 pub 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")]
wasmtime_pooling_allocation_config_max_memory_size_set( c: &mut wasmtime_pooling_allocation_config_t, bytes: usize, )675 pub 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"))]
wasmtime_pooling_allocation_config_total_gc_heaps_set( c: &mut wasmtime_pooling_allocation_config_t, count: u32, )684 pub 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")]
wasmtime_pooling_allocation_strategy_set( c: &mut wasm_config_t, pc: &wasmtime_pooling_allocation_config_t, )693 pub 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)]
wasmtime_config_concurrency_support_set(c: &mut wasm_config_t, enable: bool)702 pub extern "C" fn wasmtime_config_concurrency_support_set(c: &mut wasm_config_t, enable: bool) {
703     c.config.concurrency_support(enable);
704 }
705