@@ -6,8 +6,9 @@ use anyhow::anyhow;
6
6
use cid:: Cid ;
7
7
8
8
use fvm2:: machine:: MultiEngine as MultiEngine2 ;
9
+ use fvm3:: engine:: MultiEngine as MultiEngine3 ;
9
10
use fvm3:: executor:: { ApplyKind , ApplyRet } ;
10
- use fvm3:: machine:: { MachineContext , MultiEngine as MultiEngine3 , NetworkConfig } ;
11
+ use fvm3:: machine:: { MachineContext , NetworkConfig } ;
11
12
use fvm3_shared:: { message:: Message , version:: NetworkVersion } ;
12
13
13
14
use super :: blockstore:: { CgoBlockstore , OverlayBlockstore } ;
@@ -39,13 +40,17 @@ pub trait AbstractMultiEngine: Send + Sync {
39
40
40
41
// The generic engine container
41
42
pub struct MultiEngineContainer {
43
+ concurrency : u32 ,
42
44
engines : Mutex < HashMap < u32 , Arc < dyn AbstractMultiEngine + ' static > > > ,
43
45
}
44
46
45
47
impl MultiEngineContainer {
46
48
pub fn new ( ) -> MultiEngineContainer {
47
49
MultiEngineContainer {
48
50
engines : Mutex :: new ( HashMap :: new ( ) ) ,
51
+ // The number of messages that can be executed simultaniously on any given engine (i.e.,
52
+ // on any given network version/config).
53
+ concurrency : 1 ,
49
54
}
50
55
}
51
56
@@ -61,9 +66,8 @@ impl MultiEngineContainer {
61
66
NetworkVersion :: V16 | NetworkVersion :: V17 => {
62
67
Arc :: new ( MultiEngine2 :: new ( ) ) as Arc < dyn AbstractMultiEngine + ' static >
63
68
}
64
- NetworkVersion :: V18 => {
65
- Arc :: new ( MultiEngine3 :: new ( ) ) as Arc < dyn AbstractMultiEngine + ' static >
66
- }
69
+ NetworkVersion :: V18 => Arc :: new ( MultiEngine3 :: new ( self . concurrency ) )
70
+ as Arc < dyn AbstractMultiEngine + ' static > ,
67
71
_ => return Err ( anyhow ! ( "network version not supported" ) ) ,
68
72
} )
69
73
. clone ( ) ,
@@ -83,14 +87,12 @@ mod v3 {
83
87
use std:: sync:: Mutex ;
84
88
85
89
use fvm3:: call_manager:: DefaultCallManager as DefaultCallManager3 ;
90
+ use fvm3:: engine:: { EnginePool as EnginePool3 , MultiEngine as MultiEngine3 } ;
86
91
use fvm3:: executor:: {
87
92
ApplyKind , ApplyRet , DefaultExecutor as DefaultExecutor3 ,
88
93
ThreadedExecutor as ThreadedExecutor3 ,
89
94
} ;
90
- use fvm3:: machine:: {
91
- DefaultMachine as DefaultMachine3 , MachineContext , MultiEngine as MultiEngine3 ,
92
- NetworkConfig ,
93
- } ;
95
+ use fvm3:: machine:: { DefaultMachine as DefaultMachine3 , MachineContext , NetworkConfig } ;
94
96
use fvm3:: DefaultKernel as DefaultKernel3 ;
95
97
use fvm3_shared:: message:: Message ;
96
98
@@ -103,8 +105,11 @@ mod v3 {
103
105
type BaseExecutor3 = DefaultExecutor3 < DefaultKernel3 < DefaultCallManager3 < CgoMachine3 > > > ;
104
106
type CgoExecutor3 = ThreadedExecutor3 < BaseExecutor3 > ;
105
107
106
- fn new_executor ( machine : CgoMachine3 ) -> CgoExecutor3 {
107
- ThreadedExecutor3 ( BaseExecutor3 :: new ( machine) )
108
+ fn new_executor (
109
+ engine_pool : EnginePool3 ,
110
+ machine : CgoMachine3 ,
111
+ ) -> anyhow:: Result < CgoExecutor3 > {
112
+ Ok ( ThreadedExecutor3 ( BaseExecutor3 :: new ( engine_pool, machine) ?) )
108
113
}
109
114
110
115
impl CgoExecutor for CgoExecutor3 {
@@ -131,9 +136,9 @@ mod v3 {
131
136
externs : CgoExterns ,
132
137
) -> anyhow:: Result < InnerFvmMachine > {
133
138
let engine = self . get ( & cfg) ?;
134
- let machine = CgoMachine3 :: new ( & engine , & ctx, blockstore, externs) ?;
139
+ let machine = CgoMachine3 :: new ( & ctx, blockstore, externs) ?;
135
140
Ok ( InnerFvmMachine {
136
- machine : Some ( Mutex :: new ( Box :: new ( new_executor ( machine) ) ) ) ,
141
+ machine : Some ( Mutex :: new ( Box :: new ( new_executor ( engine , machine) ? ) ) ) ,
137
142
} )
138
143
}
139
144
}
@@ -284,6 +289,7 @@ mod v2 {
284
289
storage_gas : Gas :: from_milligas (
285
290
charge. storage_gas . as_milligas ( ) ,
286
291
) ,
292
+ elapsed : Default :: default ( ) , // no timing information for v2.
287
293
} ) )
288
294
}
289
295
ExecutionEvent2 :: Call {
0 commit comments