22
22
23
23
24
24
typedef struct {
25
+ wasm_engine_t * vm_engine ;
25
26
wasmtime_module_t * module ;
26
27
wasmtime_store_t * store ;
27
28
wasmtime_context_t * context ;
@@ -32,7 +33,6 @@ typedef struct {
32
33
33
34
34
35
static ngx_str_t vm_name = ngx_string ("wasmtime" );
35
- static wasm_engine_t * vm_engine ;
36
36
static wasmtime_val_t param_int32 [1 ] = {{ .kind = WASMTIME_I32 }};
37
37
static wasmtime_val_t param_int32_int32 [2 ] = {{ .kind = WASMTIME_I32 }, { .kind = WASMTIME_I32 }};
38
38
static wasmtime_val_t param_int32_int32_int32 [3 ] = {
@@ -96,24 +96,14 @@ ngx_wasm_wasmtime_init(void)
96
96
{
97
97
ngx_log_error (NGX_LOG_NOTICE , ngx_cycle -> log , 0 , "init wasm vm: wasmtime" );
98
98
99
- vm_engine = wasm_engine_new ();
100
- if (vm_engine == NULL ) {
101
- return NGX_DECLINED ;
102
- }
103
-
104
99
return NGX_OK ;
105
100
}
106
101
107
102
108
103
static void
109
104
ngx_wasm_wasmtime_cleanup (void )
110
105
{
111
- if (vm_engine == NULL ) {
112
- return ;
113
- }
114
-
115
106
ngx_log_error (NGX_LOG_NOTICE , ngx_cycle -> log , 0 , "cleanup wasm vm: wasmtime" );
116
- wasm_engine_delete (vm_engine );
117
107
}
118
108
119
109
@@ -122,6 +112,7 @@ ngx_wasm_wasmtime_load(const char *bytecode, size_t size)
122
112
{
123
113
size_t i ;
124
114
bool ok ;
115
+ wasm_engine_t * vm_engine ;
125
116
wasm_trap_t * trap = NULL ;
126
117
wasmtime_module_t * module ;
127
118
wasmtime_store_t * store ;
@@ -132,10 +123,16 @@ ngx_wasm_wasmtime_load(const char *bytecode, size_t size)
132
123
ngx_wasm_wasmtime_plugin_t * plugin ;
133
124
wasmtime_extern_t item ;
134
125
126
+ vm_engine = wasm_engine_new ();
127
+ if (vm_engine == NULL ) {
128
+ ngx_log_error (NGX_LOG_ERR , ngx_cycle -> log , 0 , "failed to new engine" );
129
+ return NULL ;
130
+ }
131
+
135
132
error = wasmtime_module_new (vm_engine , (const uint8_t * ) bytecode , size , & module );
136
133
if (error != NULL ) {
137
134
ngx_wasm_wasmtime_report_error (ngx_cycle -> log , "failed to new module: " , error , NULL );
138
- return NULL ;
135
+ goto free_engine ;
139
136
}
140
137
141
138
store = wasmtime_store_new (vm_engine , NULL , NULL );
@@ -215,6 +212,7 @@ ngx_wasm_wasmtime_load(const char *bytecode, size_t size)
215
212
plugin -> memory = item .of .memory ;
216
213
217
214
215
+ plugin -> vm_engine = vm_engine ;
218
216
plugin -> module = module ;
219
217
plugin -> store = store ;
220
218
plugin -> context = context ;
@@ -236,6 +234,9 @@ ngx_wasm_wasmtime_load(const char *bytecode, size_t size)
236
234
free_module :
237
235
wasmtime_module_delete (module );
238
236
237
+ free_engine :
238
+ wasm_engine_delete (vm_engine );
239
+
239
240
return NULL ;
240
241
}
241
242
@@ -248,6 +249,7 @@ ngx_wasm_wasmtime_unload(void *data)
248
249
wasmtime_module_delete (plugin -> module );
249
250
wasmtime_store_delete (plugin -> store );
250
251
wasmtime_linker_delete (plugin -> linker );
252
+ wasm_engine_delete (plugin -> vm_engine );
251
253
252
254
ngx_free (plugin );
253
255
0 commit comments