Allow not copying the wasm binary in wasm-c-api and not referring to the binary in wasm/aot loader (#3389)
Add flag `LoadArgs.clone_wasm_binary` to control whether to clone the wasm/aot binary in wasm-c-api module. If false, API `wasm_module_new_ex` won't clone the binary, which may reduce the footprint. Add flag `LoadArgs.wasm_binary_freeable` to control whether the wasm/aot binary may be freed after instantiation for wamr API `wasm_runtime_load_ex`, if yes, then for some running modes, the wasm/aot module doesn't refer to the input binary again so developer can free it after instantiation to reduce the footprint. And add API `wasm_module_is_underlying_binary_freeable` and `wasm_runtime_is_underlying_binary_freeable` to check whether the input binary can be freed after instantiation for wasm-c-api and wamr api. And add sample to illustrate it.
This commit is contained in:
@ -528,6 +528,12 @@ typedef struct WASMModuleCommon *wasm_module_t;
|
||||
#define LOAD_ARGS_OPTION_DEFINED
|
||||
typedef struct LoadArgs {
|
||||
char *name;
|
||||
/* True by default, used by wasm-c-api only.
|
||||
If false, the wasm input buffer (wasm_byte_vec_t) is referenced by the
|
||||
module instead of being cloned. Hence, it can be freed after module loading. */
|
||||
bool clone_wasm_binary;
|
||||
/* This option is only used by the AOT/wasm loader (see wasm_export.h) */
|
||||
bool wasm_binary_freeable;
|
||||
/* TODO: more fields? */
|
||||
} LoadArgs;
|
||||
#endif /* LOAD_ARGS_OPTION_DEFINED */
|
||||
@ -537,7 +543,7 @@ WASM_API_EXTERN own wasm_module_t* wasm_module_new(
|
||||
|
||||
// please refer to wasm_runtime_load_ex(...) in core/iwasm/include/wasm_export.h
|
||||
WASM_API_EXTERN own wasm_module_t* wasm_module_new_ex(
|
||||
wasm_store_t*, const wasm_byte_vec_t* binary, const LoadArgs *args);
|
||||
wasm_store_t*, wasm_byte_vec_t* binary, LoadArgs *args);
|
||||
|
||||
WASM_API_EXTERN void wasm_module_delete(own wasm_module_t*);
|
||||
|
||||
@ -557,6 +563,8 @@ WASM_API_EXTERN void wasm_shared_module_delete(own wasm_shared_module_t*);
|
||||
WASM_API_EXTERN bool wasm_module_set_name(wasm_module_t*, const char* name);
|
||||
WASM_API_EXTERN const char *wasm_module_get_name(wasm_module_t*);
|
||||
|
||||
WASM_API_EXTERN bool wasm_module_is_underlying_binary_freeable(const wasm_module_t *module, const struct wasm_instance_t* instance);
|
||||
|
||||
|
||||
// Function Instances
|
||||
|
||||
|
||||
@ -227,6 +227,13 @@ typedef struct RuntimeInitArgs {
|
||||
#define LOAD_ARGS_OPTION_DEFINED
|
||||
typedef struct LoadArgs {
|
||||
char *name;
|
||||
/* This option is only used by the Wasm C API (see wasm_c_api.h) */
|
||||
bool clone_wasm_binary;
|
||||
/* False by default, used by AOT/wasm loader only.
|
||||
If true, the AOT/wasm loader creates a copy of some module fields (e.g.
|
||||
const strings), making it possible to free the wasm binary buffer after
|
||||
loading. */
|
||||
bool wasm_binary_freeable;
|
||||
/* TODO: more fields? */
|
||||
} LoadArgs;
|
||||
#endif /* LOAD_ARGS_OPTION_DEFINED */
|
||||
@ -1886,6 +1893,16 @@ WASM_RUNTIME_API_EXTERN bool
|
||||
wasm_runtime_detect_native_stack_overflow_size(wasm_exec_env_t exec_env,
|
||||
uint32_t required_size);
|
||||
|
||||
/**
|
||||
* Query whether the wasm binary buffer used to create the module can be freed
|
||||
*
|
||||
* @param module_inst the target module instance
|
||||
* @return true if the wasm binary buffer can be freed
|
||||
*/
|
||||
WASM_RUNTIME_API_EXTERN bool
|
||||
wasm_runtime_is_underlying_binary_freeable(
|
||||
const wasm_module_inst_t module_inst);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
Reference in New Issue
Block a user