| // Copyright 2013 The Flutter Authors. All rights reserved. | |
| // Use of this source code is governed by a BSD-style license that can be | |
| // found in the LICENSE file. | |
| #include <iostream> | |
| #include <thread> | |
| #include "flutter/fml/macros.h" | |
| #include "flutter/fml/task_runner.h" | |
| #include "flutter/lib/ui/ui_dart_state.h" | |
| #include "flutter/lib/ui/window/platform_isolate.h" | |
| #include "third_party/tonic/converter/dart_converter.h" | |
| namespace flutter { | |
| void PlatformIsolateNativeApi::Spawn(Dart_Handle entry_point) { | |
| UIDartState* current_state = UIDartState::Current(); | |
| FML_DCHECK(current_state != nullptr); | |
| if (!current_state->IsRootIsolate()) { | |
| // TODO(flutter/flutter#136314): Remove this restriction. | |
| Dart_EnterScope(); | |
| Dart_ThrowException(tonic::ToDart( | |
| "PlatformIsolates can only be spawned on the root isolate.")); | |
| } | |
| char* error = nullptr; | |
| current_state->CreatePlatformIsolate(entry_point, &error); | |
| if (error) { | |
| Dart_EnterScope(); | |
| Dart_Handle error_handle = tonic::ToDart<const char*>(error); | |
| ::free(error); | |
| Dart_ThrowException(error_handle); | |
| } | |
| } | |
| bool PlatformIsolateNativeApi::IsRunningOnPlatformThread() { | |
| UIDartState* current_state = UIDartState::Current(); | |
| FML_DCHECK(current_state != nullptr); | |
| fml::RefPtr<fml::TaskRunner> platform_task_runner = | |
| current_state->GetTaskRunners().GetPlatformTaskRunner(); | |
| if (!platform_task_runner) { | |
| return false; | |
| } | |
| return platform_task_runner->RunsTasksOnCurrentThread(); | |
| } | |
| } // namespace flutter |