44
55#include " engine/engine.h"
66#include < memory>
7- #include < utility>
87#include " bin/dartutils.h"
98#include " include/dart_api.h"
109#include " include/dart_embedder_api.h"
1615namespace dart {
1716namespace engine {
1817
18+ constexpr char kRunPendingImmediateCallback [] = " _runPendingImmediateCallback" ;
19+
1920using platform::MutexLocker;
2021
2122Engine* Engine::instance () {
@@ -195,8 +196,8 @@ Dart_Isolate Engine::StartIsolate(DartEngine_SnapshotData snapshot,
195196 Dart_Handle core_libs_result =
196197 bin::DartUtils::PrepareForScriptLoading (false , false );
197198 if (Dart_IsError (core_libs_result)) {
198- Dart_ShutdownIsolate ();
199199 *error = Utils::StrDup (Dart_GetError (core_libs_result));
200+ Dart_ShutdownIsolate ();
200201 return nullptr ;
201202 }
202203
@@ -210,12 +211,27 @@ Dart_Isolate Engine::StartIsolate(DartEngine_SnapshotData snapshot,
210211 snapshot.kernel_buffer , snapshot.kernel_buffer_size );
211212
212213 if (Dart_IsError (library)) {
213- Dart_ShutdownIsolate ();
214214 *error = Utils::StrDup (Dart_GetError (library));
215+ Dart_ShutdownIsolate ();
215216 return nullptr ;
216217 }
217218 }
218219
220+ Dart_Handle isolate_library = Dart_LookupLibrary (
221+ Dart_NewStringFromCString (bin::DartUtils::kIsolateLibURL ));
222+ if (Dart_IsError (isolate_library)) {
223+ *error = Utils::StrDup (Dart_GetError (isolate_library));
224+ Dart_ShutdownIsolate ();
225+ return nullptr ;
226+ }
227+
228+ std::shared_ptr<Engine::IsolateData> isolate_data = DataForIsolate (isolate);
229+ isolate_data->isolate_library = Dart_NewPersistentHandle (isolate_library);
230+ isolate_data->drain_microtasks_function_name = Dart_NewPersistentHandle (
231+ Dart_NewStringFromCString (kRunPendingImmediateCallback ));
232+ isolate_data->scheduler .context = nullptr ;
233+ isolate_data->scheduler .schedule_callback = nullptr ;
234+
219235 Dart_ExitScope ();
220236 Dart_ExitIsolate ();
221237 is_running_ = true ;
@@ -232,9 +248,12 @@ void Engine::Shutdown() {
232248
233249 is_running_ = false ;
234250 for (auto isolate : isolates_) {
251+ std::shared_ptr<Engine::IsolateData> isolate_data = DataForIsolate (isolate);
235252 LockIsolate (isolate);
236253 Dart_EnterIsolate (isolate);
237254 Dart_SetMessageNotifyCallback (nullptr );
255+ Dart_DeletePersistentHandle (isolate_data->isolate_library );
256+ Dart_DeletePersistentHandle (isolate_data->drain_microtasks_function_name );
238257 Dart_ShutdownIsolate ();
239258 UnlockIsolate (isolate);
240259 }
@@ -277,17 +296,30 @@ void Engine::HandleMessage(Dart_Isolate isolate) {
277296 UnlockIsolate (isolate);
278297}
279298
280- Mutex& Engine::MutexForIsolate (Dart_Isolate isolate) {
299+ Dart_Handle Engine::DrainMicrotasksQueue () {
300+ std::shared_ptr<Engine::IsolateData> isolate_data =
301+ DataForIsolate (Dart_CurrentIsolate ());
302+ return Dart_Invoke (isolate_data->isolate_library ,
303+ isolate_data->drain_microtasks_function_name , 0 , nullptr );
304+ }
305+
306+ std::shared_ptr<Engine::IsolateData> Engine::DataForIsolate (
307+ Dart_Isolate isolate) {
281308 MutexLocker ml (&engine_state_);
282- return mutexes_[isolate];
309+ auto it = isolate_data_.find (isolate);
310+ if (it == isolate_data_.end ()) {
311+ it = isolate_data_.emplace (isolate, std::make_shared<Engine::IsolateData>())
312+ .first ;
313+ }
314+ return it->second ;
283315}
284316
285317void Engine::LockIsolate (Dart_Isolate isolate) {
286- MutexForIsolate (isolate).Lock ();
318+ DataForIsolate (isolate)-> mutex .Lock ();
287319}
288320
289321void Engine::UnlockIsolate (Dart_Isolate isolate) {
290- MutexForIsolate (isolate).Unlock ();
322+ DataForIsolate (isolate)-> mutex .Unlock ();
291323}
292324
293325void Engine::NotifyMessage (Dart_Isolate isolate) {
@@ -313,11 +345,7 @@ void Engine::NotifyMessage(Dart_Isolate isolate) {
313345 return ;
314346 }
315347
316- DartEngine_MessageScheduler scheduler;
317- {
318- MutexLocker ml (&engine_state_);
319- scheduler = schedulers_[isolate];
320- }
348+ DartEngine_MessageScheduler scheduler = DataForIsolate (isolate)->scheduler ;
321349
322350 if (scheduler.schedule_callback == nullptr ) {
323351 scheduler = default_scheduler_;
@@ -341,8 +369,7 @@ void Engine::SetDefaultMessageScheduler(DartEngine_MessageScheduler scheduler) {
341369
342370void Engine::SetMessageScheduler (DartEngine_MessageScheduler scheduler,
343371 Dart_Isolate isolate) {
344- MutexLocker ml (&engine_state_);
345- schedulers_[isolate] = scheduler;
372+ DataForIsolate (isolate)->scheduler = scheduler;
346373}
347374
348375} // namespace engine
0 commit comments