@@ -32,7 +32,7 @@ use log::Level;
32
32
use micro_rpc:: StatusCode ;
33
33
use oak_functions_abi:: { Request , Response } ;
34
34
use spinning_top:: Spinlock ;
35
- use wasmi:: { MemoryType , Store } ;
35
+ use wasmi:: Store ;
36
36
37
37
use crate :: {
38
38
logger:: { OakLogger , StandaloneLogger } ,
@@ -119,20 +119,9 @@ impl<L> OakLinker<L>
119
119
where
120
120
L : OakLogger ,
121
121
{
122
- fn new ( engine : & wasmi:: Engine , store : & mut Store < UserState < L > > ) -> Self {
122
+ fn new ( engine : & wasmi:: Engine ) -> Self {
123
123
let mut linker: wasmi:: Linker < UserState < L > > = wasmi:: Linker :: new ( engine) ;
124
124
125
- // Add memory to linker.
126
- // TODO(#3783): Find a sensible value for initial pages.
127
- let initial_pages = 100 ;
128
- let memory_type =
129
- MemoryType :: new ( initial_pages, None ) . expect ( "failed to define Wasm memory type" ) ;
130
- let memory =
131
- wasmi:: Memory :: new ( store, memory_type) . expect ( "failed to initialize Wasm memory" ) ;
132
- linker
133
- . define ( OAK_FUNCTIONS , MEMORY_NAME , wasmi:: Extern :: Memory ( memory) )
134
- . expect ( "failed to define Wasm memory in linker" ) ;
135
-
136
125
linker
137
126
. func_wrap (
138
127
OAK_FUNCTIONS ,
@@ -218,13 +207,11 @@ where
218
207
219
208
/// Instantiates the Oak Linker and checks whether the instance exports `main`, `alloc` and a
220
209
/// memory is attached.
221
- ///
222
- /// Use the same store used when creating the linker.
223
210
fn instantiate (
224
- self ,
225
- mut store : Store < UserState < L > > ,
211
+ & self ,
212
+ mut store : & mut Store < UserState < L > > ,
226
213
module : Arc < wasmi:: Module > ,
227
- ) -> Result < ( wasmi:: Instance , Store < UserState < L > > ) , micro_rpc:: Status > {
214
+ ) -> Result < wasmi:: Instance , micro_rpc:: Status > {
228
215
let instance = self
229
216
. linker
230
217
. instantiate ( & mut store, & module)
@@ -245,7 +232,7 @@ where
245
232
246
233
// Check that the instance exports "main".
247
234
let _ = & instance
248
- . get_typed_func :: < ( ) , ( ) > ( & store, MAIN_FUNCTION_NAME )
235
+ . get_typed_func :: < ( ) , ( ) > ( & mut store, MAIN_FUNCTION_NAME )
249
236
. map_err ( |err| {
250
237
micro_rpc:: Status :: new_with_message (
251
238
micro_rpc:: StatusCode :: Internal ,
@@ -255,7 +242,7 @@ where
255
242
256
243
// Check that the instance exports "alloc".
257
244
let _ = & instance
258
- . get_typed_func :: < i32 , AbiPointer > ( & store, ALLOC_FUNCTION_NAME )
245
+ . get_typed_func :: < i32 , AbiPointer > ( & mut store, ALLOC_FUNCTION_NAME )
259
246
. map_err ( |err| {
260
247
micro_rpc:: Status :: new_with_message (
261
248
micro_rpc:: StatusCode :: Internal ,
@@ -272,7 +259,7 @@ where
272
259
)
273
260
} ) ?;
274
261
275
- Ok ( ( instance, store ) )
262
+ Ok ( instance)
276
263
}
277
264
}
278
265
@@ -423,9 +410,9 @@ where
423
410
}
424
411
425
412
// A request handler with a Wasm module for handling multiple requests.
426
- #[ derive( Clone ) ]
427
413
pub struct WasmHandler < L : OakLogger > {
428
414
wasm_module : Arc < wasmi:: Module > ,
415
+ linker : OakLinker < L > ,
429
416
wasm_api_factory : Arc < dyn WasmApiFactory < L > + Send + Sync > ,
430
417
logger : L ,
431
418
#[ cfg_attr( not( feature = "std" ) , allow( dead_code) ) ]
@@ -466,8 +453,11 @@ where
466
453
let module = wasmi:: Module :: new ( & engine, wasm_module_bytes)
467
454
. map_err ( |err| anyhow:: anyhow!( "couldn't load module from buffer: {:?}" , err) ) ?;
468
455
456
+ let linker = OakLinker :: new ( module. engine ( ) ) ;
457
+
469
458
Ok ( WasmHandler {
470
459
wasm_module : Arc :: new ( module) ,
460
+ linker,
471
461
wasm_api_factory,
472
462
logger,
473
463
observer,
@@ -489,8 +479,7 @@ where
489
479
let user_state = UserState :: new ( wasm_api. transport ( ) , self . logger . clone ( ) ) ;
490
480
// For isolated requests we need to create a new store for every request.
491
481
let mut store = wasmi:: Store :: new ( module. engine ( ) , user_state) ;
492
- let linker = OakLinker :: new ( module. engine ( ) , & mut store) ;
493
- let ( instance, mut store) = linker. instantiate ( store, module) ?;
482
+ let instance = self . linker . instantiate ( & mut store, module) ?;
494
483
495
484
instance. exports ( & store) . for_each ( |export| {
496
485
store
0 commit comments