Skip to content

Commit c420f65

Browse files
authored
Merge pull request #2052 from fitzgen/gc-function-in-c-api
Add a GC function to the C API
2 parents 96ef2f1 + 17b99cc commit c420f65

File tree

4 files changed

+27
-0
lines changed

4 files changed

+27
-0
lines changed

crates/c-api/include/wasmtime.h

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -299,6 +299,17 @@ WASM_API_EXTERN own wasmtime_error_t* wasmtime_wat2wasm(
299299
own wasm_byte_vec_t *ret
300300
);
301301

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+
302313
/**
303314
* \typedef wasmtime_linker_t
304315
* \brief Convenience alias for #wasmtime_linker_t

crates/c-api/src/store.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,11 @@ pub extern "C" fn wasm_store_new(engine: &wasm_engine_t) -> Box<wasm_store_t> {
1717
})
1818
}
1919

20+
#[no_mangle]
21+
pub extern "C" fn wasmtime_store_gc(store: &wasm_store_t) {
22+
store.store.gc();
23+
}
24+
2025
#[repr(C)]
2126
pub struct wasmtime_interrupt_handle_t {
2227
handle: InterruptHandle,

examples/externref.c

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,9 @@ int main() {
8282
printf("Creating new `externref`...\n");
8383

8484
// 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`.
8588
wasm_val_t externref;
8689
wasmtime_externref_new("Hello, World!", &externref);
8790
assert(externref.kind == WASM_ANYREF);
@@ -148,6 +151,11 @@ int main() {
148151
assert(results[0].kind == WASM_ANYREF);
149152
assert(wasm_ref_same(results[0].of.ref, externref.of.ref));
150153

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+
151159
// Clean up after ourselves at this point
152160
printf("All finished!\n");
153161
ret = 0;

examples/externref.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,9 @@ fn main() -> Result<()> {
4646
assert!(ret.is_some());
4747
assert!(ret.unwrap().ptr_eq(&externref));
4848

49+
println!("GCing within the store...");
50+
store.gc();
51+
4952
println!("Done.");
5053
Ok(())
5154
}

0 commit comments

Comments
 (0)