@@ -40,15 +40,10 @@ public sealed class ChakraCoreJsEngine : JsEngineBase
40
40
/// <summary>
41
41
/// Instance of JS context
42
42
/// </summary>
43
- private readonly JsContext _jsContext ;
43
+ private JsContext _jsContext ;
44
44
45
45
/// <summary>
46
- /// Synchronizer of code execution
47
- /// </summary>
48
- private readonly object _executionSynchronizer = new object ( ) ;
49
-
50
- /// <summary>
51
- /// List of external objects
46
+ /// Set of external objects
52
47
/// </summary>
53
48
private readonly HashSet < object > _externalObjects = new HashSet < object > ( ) ;
54
49
@@ -62,6 +57,11 @@ public sealed class ChakraCoreJsEngine : JsEngineBase
62
57
/// </summary>
63
58
private readonly HashSet < JsNativeFunction > _nativeFunctions = new HashSet < JsNativeFunction > ( ) ;
64
59
60
+ /// <summary>
61
+ /// Script dispatcher
62
+ /// </summary>
63
+ private readonly ScriptDispatcher _dispatcher = new ScriptDispatcher ( ) ;
64
+
65
65
/// <summary>
66
66
/// Gets a name of JS engine
67
67
/// </summary>
@@ -108,7 +108,7 @@ public ChakraCoreJsEngine()
108
108
{ }
109
109
110
110
/// <summary>
111
- /// Constructs a instance of adapter for the ChakraCore JS engine
111
+ /// Constructs an instance of adapter for the ChakraCore JS engine
112
112
/// </summary>
113
113
/// <param name="settings">Settings of the ChakraCore JS engine</param>
114
114
public ChakraCoreJsEngine ( ChakraCoreSettings settings )
@@ -135,21 +135,24 @@ public ChakraCoreJsEngine(ChakraCoreSettings settings)
135
135
136
136
_externalObjectFinalizeCallback = ExternalObjectFinalizeCallback ;
137
137
138
- try
139
- {
140
- _jsRuntime = JsRuntime . Create ( attributes , null ) ;
141
- _jsContext = _jsRuntime . CreateContext ( ) ;
142
- }
143
- catch ( Exception e )
138
+ _dispatcher . Invoke ( ( ) =>
144
139
{
145
- throw new JsEngineLoadException (
146
- string . Format ( CoreStrings . Runtime_JsEngineNotLoaded ,
147
- EngineName , e . Message ) , EngineName , EngineVersion , e ) ;
148
- }
140
+ try
141
+ {
142
+ _jsRuntime = JsRuntime . Create ( attributes , null ) ;
143
+ _jsContext = _jsRuntime . CreateContext ( ) ;
144
+ }
145
+ catch ( Exception e )
146
+ {
147
+ throw new JsEngineLoadException (
148
+ string . Format ( CoreStrings . Runtime_JsEngineNotLoaded ,
149
+ EngineName , e . Message ) , EngineName , EngineVersion , e ) ;
150
+ }
151
+ } ) ;
149
152
}
150
153
151
154
/// <summary>
152
- /// Destructs instance of adapter for the ChakraCore JS engine
155
+ /// Destructs an instance of adapter for the ChakraCore JS engine
153
156
/// </summary>
154
157
~ ChakraCoreJsEngine ( )
155
158
{
@@ -159,62 +162,38 @@ public ChakraCoreJsEngine(ChakraCoreSettings settings)
159
162
160
163
private void InvokeScript ( Action action )
161
164
{
162
- lock ( _executionSynchronizer )
163
- using ( new JsScope ( _jsContext ) )
165
+ _dispatcher . Invoke ( ( ) =>
164
166
{
165
- try
166
- {
167
- action ( ) ;
168
- }
169
- catch ( OriginalJsException e )
167
+ using ( new JsScope ( _jsContext ) )
170
168
{
171
- throw ConvertJsExceptionToJsRuntimeException ( e ) ;
169
+ try
170
+ {
171
+ action ( ) ;
172
+ }
173
+ catch ( OriginalJsException e )
174
+ {
175
+ throw ConvertJsExceptionToJsRuntimeException ( e ) ;
176
+ }
172
177
}
173
- }
178
+ } ) ;
174
179
}
175
180
176
181
private T InvokeScript < T > ( Func < T > func )
177
182
{
178
- lock ( _executionSynchronizer )
179
- using ( new JsScope ( _jsContext ) )
180
- {
181
- try
182
- {
183
- return func ( ) ;
184
- }
185
- catch ( OriginalJsException e )
186
- {
187
- throw ConvertJsExceptionToJsRuntimeException ( e ) ;
188
- }
189
- }
190
- }
191
-
192
- /// <summary>
193
- /// Destroys object
194
- /// </summary>
195
- /// <param name="disposing">Flag, allowing destruction of
196
- /// managed objects contained in fields of class</param>
197
- private void Dispose ( bool disposing )
198
- {
199
- if ( _disposedFlag . Set ( ) )
183
+ return _dispatcher . Invoke ( ( ) =>
200
184
{
201
- lock ( _executionSynchronizer )
185
+ using ( new JsScope ( _jsContext ) )
202
186
{
203
- _jsRuntime . Dispose ( ) ;
204
-
205
- if ( _externalObjects != null )
187
+ try
206
188
{
207
- _externalObjects . Clear ( ) ;
189
+ return func ( ) ;
208
190
}
209
-
210
- if ( _nativeFunctions != null )
191
+ catch ( OriginalJsException e )
211
192
{
212
- _nativeFunctions . Clear ( ) ;
193
+ throw ConvertJsExceptionToJsRuntimeException ( e ) ;
213
194
}
214
-
215
- _externalObjectFinalizeCallback = null ;
216
195
}
217
- }
196
+ } ) ;
218
197
}
219
198
220
199
#region Mapping
@@ -427,12 +406,9 @@ private void ExternalObjectFinalizeCallback(IntPtr data)
427
406
return ;
428
407
}
429
408
430
- lock ( _executionSynchronizer )
409
+ if ( _externalObjects != null )
431
410
{
432
- if ( _externalObjects != null )
433
- {
434
- _externalObjects . Remove ( obj ) ;
435
- }
411
+ _externalObjects . Remove ( obj ) ;
436
412
}
437
413
}
438
414
@@ -1115,10 +1091,7 @@ protected override void InnerEmbedHostType(string itemName, Type type)
1115
1091
1116
1092
protected override void InnerCollectGarbage ( )
1117
1093
{
1118
- lock ( _executionSynchronizer )
1119
- {
1120
- _jsRuntime . CollectGarbage ( ) ;
1121
- }
1094
+ _dispatcher . Invoke ( ( ) => _jsRuntime . CollectGarbage ( ) ) ;
1122
1095
}
1123
1096
1124
1097
#endregion
@@ -1134,6 +1107,39 @@ public override void Dispose()
1134
1107
GC . SuppressFinalize ( this ) ;
1135
1108
}
1136
1109
1110
+
1111
+ /// <summary>
1112
+ /// Destroys object
1113
+ /// </summary>
1114
+ /// <param name="disposing">Flag, allowing destruction of
1115
+ /// managed objects contained in fields of class</param>
1116
+ private void Dispose ( bool disposing )
1117
+ {
1118
+ if ( _disposedFlag . Set ( ) )
1119
+ {
1120
+ if ( _dispatcher != null )
1121
+ {
1122
+ _dispatcher . Invoke ( ( ) => _jsRuntime . Dispose ( ) ) ;
1123
+ _dispatcher . Dispose ( ) ;
1124
+ }
1125
+
1126
+ if ( disposing )
1127
+ {
1128
+ if ( _externalObjects != null )
1129
+ {
1130
+ _externalObjects . Clear ( ) ;
1131
+ }
1132
+
1133
+ if ( _nativeFunctions != null )
1134
+ {
1135
+ _nativeFunctions . Clear ( ) ;
1136
+ }
1137
+
1138
+ _externalObjectFinalizeCallback = null ;
1139
+ }
1140
+ }
1141
+ }
1142
+
1137
1143
#endregion
1138
1144
}
1139
1145
}
0 commit comments