Add wasm_module_obtain() to clone wasm_module_t (#1660)

Also add support for wasm_shared_module_t, and add lock for
wasm_module_t related operations.

And add wasm-c-api sample threads, update sample clone.
This commit is contained in:
liang.he
2022-11-09 12:50:58 +08:00
committed by GitHub
parent f59ffa0d63
commit 30ee992762
7 changed files with 425 additions and 97 deletions

View File

@ -20,6 +20,7 @@ typedef struct _vm {
wasm_engine_t *engine;
wasm_store_t *store;
wasm_module_t *module;
wasm_shared_module_t *shared_module;
wasm_instance_t *instance;
wasm_func_t **function_list;
wasm_memory_t *memory;
@ -72,10 +73,49 @@ fail:
return NULL;
}
wasm_vm_t *
vm_release(wasm_vm_t *vm)
{
if (!vm)
return NULL;
if (vm->function_list) {
free(vm->function_list);
vm->function_list = NULL;
}
vm->memory = NULL;
if (vm->exports) {
wasm_extern_vec_delete(vm->exports);
free(vm->exports);
vm->exports = NULL;
}
wasm_instance_delete(vm->instance);
vm->instance = NULL;
wasm_shared_module_delete(vm->shared_module);
vm->shared_module = NULL;
wasm_module_delete(vm->module);
vm->module = NULL;
wasm_store_delete(vm->store);
vm->store = NULL;
wasm_engine_delete(vm->engine);
vm->engine = NULL;
free(vm);
return NULL;
}
bool
vm_load(wasm_vm_t *vm, const wasm_byte_vec_t *binary)
{
vm->module = wasm_module_new(vm->store, binary);
vm->shared_module = wasm_module_share(vm->module);
return vm->module != NULL;
}
@ -127,7 +167,10 @@ vm_clone_from_module(const wasm_vm_t *base)
secondary = vm_new();
if (secondary) {
printf("Reuse module and bypass vm_load()...");
secondary->module = base->module;
secondary->module =
wasm_module_obtain(base->store, base->shared_module);
if (!secondary->module)
secondary = vm_release(secondary);
}
return secondary;
@ -163,39 +206,6 @@ vm_clone(const wasm_vm_t *base, clone_level level)
return vm_clone_from_instance(base);
}
wasm_vm_t *
vm_release(wasm_vm_t *vm)
{
if (!vm)
return NULL;
if (vm->function_list) {
free(vm->function_list);
vm->function_list = NULL;
}
if (vm->exports) {
wasm_extern_vec_delete(vm->exports);
free(vm->exports);
vm->exports = NULL;
}
wasm_instance_delete(vm->instance);
vm->instance = NULL;
wasm_module_delete(vm->module);
vm->module = NULL;
wasm_store_delete(vm->store);
vm->store = NULL;
wasm_engine_delete(vm->engine);
vm->engine = NULL;
free(vm);
return NULL;
}
bool
vm_memory_set_byte(const wasm_vm_t *vm, uint32_t offset, uint8_t byte)
{
@ -444,6 +454,8 @@ static void *
thrd_func(void *arg)
{
thread_arg_t *thrd_arg = (thread_arg_t *)arg;
sleep(rand() % 5);
printf("Running warm start at %s...\n", thrd_arg->name);
pthread_setspecific(name_key, thrd_arg->name);
@ -483,7 +495,6 @@ main()
run_test(base_vm);
printf("Running warm start at other threads...\n");
pthread_mutex_trylock(&ready_go_lock);
pthread_t tids[WORKER_NUMBER] = { 0 };
thread_arg_t thrd_args[WORKER_NUMBER] = { 0 };
@ -501,8 +512,8 @@ main()
break;
}
sleep(5);
sleep(1);
pthread_mutex_trylock(&ready_go_lock);
ready_go_flag = true;
pthread_mutex_unlock(&ready_go_lock);
pthread_cond_broadcast(&ready_go_cond);
@ -511,6 +522,7 @@ main()
if (tids[i] != 0)
pthread_join(tids[i], NULL);
}
vm_release(base_vm);
ret = EXIT_SUCCESS;
quit: