mirror of
https://github.com/bytecodealliance/wasm-micro-runtime.git
synced 2025-05-08 20:56:13 +00:00
Use wasm_config_t to pass private configuration to wasm_engine_new (#2837)
Support new a wasm_config_t, set allocation and linux_perf_support options to it, and then pass it to wasm_engine_new_with_config to new an engine with private configuration.
This commit is contained in:
parent
718f0671e7
commit
162a977006
|
@ -292,13 +292,46 @@ WASM_DEFINE_VEC_OWN(valtype, wasm_valtype_delete)
|
||||||
own wasm_config_t *
|
own wasm_config_t *
|
||||||
wasm_config_new(void)
|
wasm_config_new(void)
|
||||||
{
|
{
|
||||||
return NULL;
|
/* since wasm_runtime_malloc is not ready */
|
||||||
|
wasm_config_t *config = os_malloc(sizeof(wasm_config_t));
|
||||||
|
if (!config)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
memset(config, 0, sizeof(wasm_config_t));
|
||||||
|
config->mem_alloc_type = Alloc_With_System_Allocator;
|
||||||
|
return config;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
wasm_config_delete(own wasm_config_t *config)
|
wasm_config_delete(own wasm_config_t *config)
|
||||||
{
|
{
|
||||||
(void)config;
|
if (config)
|
||||||
|
os_free(config);
|
||||||
|
}
|
||||||
|
|
||||||
|
wasm_config_t *
|
||||||
|
wasm_config_set_mem_alloc_opt(wasm_config_t *config,
|
||||||
|
mem_alloc_type_t mem_alloc_type,
|
||||||
|
MemAllocOption *mem_alloc_option)
|
||||||
|
{
|
||||||
|
if (!config)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
config->mem_alloc_type = mem_alloc_type;
|
||||||
|
if (mem_alloc_option)
|
||||||
|
memcpy(&config->mem_alloc_option, mem_alloc_option,
|
||||||
|
sizeof(MemAllocOption));
|
||||||
|
return config;
|
||||||
|
}
|
||||||
|
|
||||||
|
wasm_config_t *
|
||||||
|
wasm_config_set_linux_perf_opt(wasm_config_t *config, bool enable)
|
||||||
|
{
|
||||||
|
if (!config)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
config->linux_perf_support = enable;
|
||||||
|
return config;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -329,12 +362,11 @@ wasm_engine_delete_internal(wasm_engine_t *engine)
|
||||||
}
|
}
|
||||||
|
|
||||||
static wasm_engine_t *
|
static wasm_engine_t *
|
||||||
wasm_engine_new_internal(mem_alloc_type_t type, const MemAllocOption *opts)
|
wasm_engine_new_internal(wasm_config_t *config)
|
||||||
{
|
{
|
||||||
wasm_engine_t *engine = NULL;
|
wasm_engine_t *engine = NULL;
|
||||||
/* init runtime */
|
/* init runtime */
|
||||||
RuntimeInitArgs init_args = { 0 };
|
RuntimeInitArgs init_args = { 0 };
|
||||||
init_args.mem_alloc_type = type;
|
|
||||||
|
|
||||||
#ifndef NDEBUG
|
#ifndef NDEBUG
|
||||||
bh_log_set_verbose_level(BH_LOG_LEVEL_VERBOSE);
|
bh_log_set_verbose_level(BH_LOG_LEVEL_VERBOSE);
|
||||||
|
@ -344,34 +376,11 @@ wasm_engine_new_internal(mem_alloc_type_t type, const MemAllocOption *opts)
|
||||||
|
|
||||||
WASM_C_DUMP_PROC_MEM();
|
WASM_C_DUMP_PROC_MEM();
|
||||||
|
|
||||||
if (type == Alloc_With_Pool) {
|
/* wasm_config_t->MemAllocOption -> RuntimeInitArgs->MemAllocOption */
|
||||||
if (!opts) {
|
init_args.mem_alloc_type = config->mem_alloc_type;
|
||||||
return NULL;
|
memcpy(&init_args.mem_alloc_option, &config->mem_alloc_option,
|
||||||
}
|
sizeof(MemAllocOption));
|
||||||
|
init_args.linux_perf_support = config->linux_perf_support;
|
||||||
init_args.mem_alloc_option.pool.heap_buf = opts->pool.heap_buf;
|
|
||||||
init_args.mem_alloc_option.pool.heap_size = opts->pool.heap_size;
|
|
||||||
}
|
|
||||||
else if (type == Alloc_With_Allocator) {
|
|
||||||
if (!opts) {
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
init_args.mem_alloc_option.allocator.malloc_func =
|
|
||||||
opts->allocator.malloc_func;
|
|
||||||
init_args.mem_alloc_option.allocator.free_func =
|
|
||||||
opts->allocator.free_func;
|
|
||||||
init_args.mem_alloc_option.allocator.realloc_func =
|
|
||||||
opts->allocator.realloc_func;
|
|
||||||
#if WASM_MEM_ALLOC_WITH_USER_DATA != 0
|
|
||||||
init_args.mem_alloc_option.allocator.user_data =
|
|
||||||
opts->allocator.user_data;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
init_args.mem_alloc_option.pool.heap_buf = NULL;
|
|
||||||
init_args.mem_alloc_option.pool.heap_size = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!wasm_runtime_full_init(&init_args)) {
|
if (!wasm_runtime_full_init(&init_args)) {
|
||||||
LOG_DEBUG("wasm_runtime_full_init failed");
|
LOG_DEBUG("wasm_runtime_full_init failed");
|
||||||
|
@ -418,14 +427,23 @@ static korp_mutex engine_lock = OS_THREAD_MUTEX_INITIALIZER;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
own wasm_engine_t *
|
own wasm_engine_t *
|
||||||
wasm_engine_new_with_args(mem_alloc_type_t type, const MemAllocOption *opts)
|
wasm_engine_new()
|
||||||
|
{
|
||||||
|
wasm_config_t config = { 0 };
|
||||||
|
wasm_config_set_mem_alloc_opt(&config, Alloc_With_System_Allocator, NULL);
|
||||||
|
wasm_engine_t *engine = wasm_engine_new_with_config(&config);
|
||||||
|
return engine;
|
||||||
|
}
|
||||||
|
|
||||||
|
own wasm_engine_t *
|
||||||
|
wasm_engine_new_with_config(wasm_config_t *config)
|
||||||
{
|
{
|
||||||
#if defined(OS_THREAD_MUTEX_INITIALIZER)
|
#if defined(OS_THREAD_MUTEX_INITIALIZER)
|
||||||
os_mutex_lock(&engine_lock);
|
os_mutex_lock(&engine_lock);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (!singleton_engine)
|
if (!singleton_engine)
|
||||||
singleton_engine = wasm_engine_new_internal(type, opts);
|
singleton_engine = wasm_engine_new_internal(config);
|
||||||
else
|
else
|
||||||
singleton_engine->ref_count++;
|
singleton_engine->ref_count++;
|
||||||
|
|
||||||
|
@ -437,16 +455,12 @@ wasm_engine_new_with_args(mem_alloc_type_t type, const MemAllocOption *opts)
|
||||||
}
|
}
|
||||||
|
|
||||||
own wasm_engine_t *
|
own wasm_engine_t *
|
||||||
wasm_engine_new()
|
wasm_engine_new_with_args(mem_alloc_type_t type, const MemAllocOption *opts)
|
||||||
{
|
{
|
||||||
return wasm_engine_new_with_args(Alloc_With_System_Allocator, NULL);
|
wasm_config_t config = { 0 };
|
||||||
}
|
config.mem_alloc_type = type;
|
||||||
|
memcpy(&config.mem_alloc_option, opts, sizeof(MemAllocOption));
|
||||||
own wasm_engine_t *
|
return wasm_engine_new_with_config(&config);
|
||||||
wasm_engine_new_with_config(own wasm_config_t *config)
|
|
||||||
{
|
|
||||||
(void)config;
|
|
||||||
return wasm_engine_new_with_args(Alloc_With_System_Allocator, NULL);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|
|
@ -21,6 +21,15 @@
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if defined(__GNUC__) || defined(__clang__)
|
||||||
|
#define DEPRECATED __attribute__((deprecated))
|
||||||
|
#elif defined(_MSC_VER)
|
||||||
|
#define DEPRECATED __declspec(deprecated)
|
||||||
|
#else
|
||||||
|
#pragma message("WARNING: You need to implement DEPRECATED for this compiler")
|
||||||
|
#define DEPRECATED
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
@ -136,31 +145,6 @@ static inline void wasm_name_new_from_string_nt(
|
||||||
|
|
||||||
WASM_DECLARE_OWN(config)
|
WASM_DECLARE_OWN(config)
|
||||||
|
|
||||||
WASM_API_EXTERN own wasm_config_t* wasm_config_new(void);
|
|
||||||
|
|
||||||
// Embedders may provide custom functions for manipulating configs.
|
|
||||||
|
|
||||||
|
|
||||||
// Engine
|
|
||||||
|
|
||||||
WASM_DECLARE_OWN(engine)
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Create a new engine
|
|
||||||
*
|
|
||||||
* Note: for the engine new/delete operations, including this,
|
|
||||||
* wasm_engine_new_with_config, wasm_engine_new_with_args, and
|
|
||||||
* wasm_engine_delete, if the platform has mutex initializer,
|
|
||||||
* then they are thread-safe: we use a global lock to lock the
|
|
||||||
* operations of the engine. Otherwise they are not thread-safe:
|
|
||||||
* when there are engine new/delete operations happening
|
|
||||||
* simultaneously in multiple threads, developer must create
|
|
||||||
* the lock by himself, and add the lock when calling these
|
|
||||||
* functions.
|
|
||||||
*/
|
|
||||||
WASM_API_EXTERN own wasm_engine_t* wasm_engine_new(void);
|
|
||||||
WASM_API_EXTERN own wasm_engine_t* wasm_engine_new_with_config(own wasm_config_t*);
|
|
||||||
|
|
||||||
#ifndef MEM_ALLOC_OPTION_DEFINED
|
#ifndef MEM_ALLOC_OPTION_DEFINED
|
||||||
#define MEM_ALLOC_OPTION_DEFINED
|
#define MEM_ALLOC_OPTION_DEFINED
|
||||||
/* same definition from wasm_export.h */
|
/* same definition from wasm_export.h */
|
||||||
|
@ -191,9 +175,51 @@ typedef union MemAllocOption {
|
||||||
void *user_data;
|
void *user_data;
|
||||||
} allocator;
|
} allocator;
|
||||||
} MemAllocOption;
|
} MemAllocOption;
|
||||||
#endif
|
#endif /* MEM_ALLOC_OPTION_DEFINED */
|
||||||
|
|
||||||
WASM_API_EXTERN own wasm_engine_t *
|
/* Runtime configration */
|
||||||
|
struct wasm_config_t {
|
||||||
|
mem_alloc_type_t mem_alloc_type;
|
||||||
|
MemAllocOption mem_alloc_option;
|
||||||
|
bool linux_perf_support;
|
||||||
|
/*TODO: wasi args*/
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* by default:
|
||||||
|
* - mem_alloc_type is Alloc_With_System_Allocator
|
||||||
|
* - mem_alloc_option is all 0
|
||||||
|
* - linux_perf_support is false
|
||||||
|
*/
|
||||||
|
WASM_API_EXTERN own wasm_config_t* wasm_config_new(void);
|
||||||
|
|
||||||
|
// Embedders may provide custom functions for manipulating configs.
|
||||||
|
WASM_API_EXTERN own wasm_config_t*
|
||||||
|
wasm_config_set_mem_alloc_opt(wasm_config_t *, mem_alloc_type_t, MemAllocOption *);
|
||||||
|
|
||||||
|
WASM_API_EXTERN own wasm_config_t*
|
||||||
|
wasm_config_set_linux_perf_opt(wasm_config_t *, bool);
|
||||||
|
|
||||||
|
// Engine
|
||||||
|
|
||||||
|
WASM_DECLARE_OWN(engine)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a new engine
|
||||||
|
*
|
||||||
|
* Note: for the engine new/delete operations, including this,
|
||||||
|
* wasm_engine_new_with_config, wasm_engine_new_with_args, and
|
||||||
|
* wasm_engine_delete, if the platform has mutex initializer,
|
||||||
|
* then they are thread-safe: we use a global lock to lock the
|
||||||
|
* operations of the engine. Otherwise they are not thread-safe:
|
||||||
|
* when there are engine new/delete operations happening
|
||||||
|
* simultaneously in multiple threads, developer must create
|
||||||
|
* the lock by himself, and add the lock when calling these
|
||||||
|
* functions.
|
||||||
|
*/
|
||||||
|
WASM_API_EXTERN own wasm_engine_t* wasm_engine_new(void);
|
||||||
|
WASM_API_EXTERN own wasm_engine_t* wasm_engine_new_with_config(wasm_config_t*);
|
||||||
|
DEPRECATED WASM_API_EXTERN own wasm_engine_t *
|
||||||
wasm_engine_new_with_args(mem_alloc_type_t type, const MemAllocOption *opts);
|
wasm_engine_new_with_args(mem_alloc_type_t type, const MemAllocOption *opts);
|
||||||
|
|
||||||
// Store
|
// Store
|
||||||
|
|
Loading…
Reference in New Issue
Block a user