File tree Expand file tree Collapse file tree 4 files changed +27
-0
lines changed Expand file tree Collapse file tree 4 files changed +27
-0
lines changed Original file line number Diff line number Diff line change @@ -299,6 +299,17 @@ WASM_API_EXTERN own wasmtime_error_t* wasmtime_wat2wasm(
299
299
own wasm_byte_vec_t * ret
300
300
);
301
301
302
+ /**
303
+ * \brief Perform garbage collection within the given store.
304
+ *
305
+ * Garbage collects `externref`s that are used within this store. Any
306
+ * `externref`s that are discovered to be unreachable by other code or objects
307
+ * will have their finalizers run.
308
+ *
309
+ * The `store` argument must not be NULL.
310
+ */
311
+ WASM_API_EXTERN void wasmtime_store_gc (wasm_store_t * store );
312
+
302
313
/**
303
314
* \typedef wasmtime_linker_t
304
315
* \brief Convenience alias for #wasmtime_linker_t
Original file line number Diff line number Diff line change @@ -17,6 +17,11 @@ pub extern "C" fn wasm_store_new(engine: &wasm_engine_t) -> Box<wasm_store_t> {
17
17
} )
18
18
}
19
19
20
+ #[ no_mangle]
21
+ pub extern "C" fn wasmtime_store_gc ( store : & wasm_store_t ) {
22
+ store. store . gc ( ) ;
23
+ }
24
+
20
25
#[ repr( C ) ]
21
26
pub struct wasmtime_interrupt_handle_t {
22
27
handle : InterruptHandle ,
Original file line number Diff line number Diff line change @@ -82,6 +82,9 @@ int main() {
82
82
printf ("Creating new `externref`...\n" );
83
83
84
84
// Create a new `externref` value.
85
+ //
86
+ // Note that if you need clean up for after the externref is reclaimed, you
87
+ // can use `wasmtime_externref_new_with_finalizer`.
85
88
wasm_val_t externref ;
86
89
wasmtime_externref_new ("Hello, World!" , & externref );
87
90
assert (externref .kind == WASM_ANYREF );
@@ -148,6 +151,11 @@ int main() {
148
151
assert (results [0 ].kind == WASM_ANYREF );
149
152
assert (wasm_ref_same (results [0 ].of .ref , externref .of .ref ));
150
153
154
+ // We can GC any now-unused references to our externref that the store is
155
+ // holding.
156
+ printf ("GCing within the store...\n" );
157
+ wasmtime_store_gc (store );
158
+
151
159
// Clean up after ourselves at this point
152
160
printf ("All finished!\n" );
153
161
ret = 0 ;
Original file line number Diff line number Diff line change @@ -46,6 +46,9 @@ fn main() -> Result<()> {
46
46
assert ! ( ret. is_some( ) ) ;
47
47
assert ! ( ret. unwrap( ) . ptr_eq( & externref) ) ;
48
48
49
+ println ! ( "GCing within the store..." ) ;
50
+ store. gc ( ) ;
51
+
49
52
println ! ( "Done." ) ;
50
53
Ok ( ( ) )
51
54
}
You can’t perform that action at this time.
0 commit comments