Flutter Engine
The Flutter Engine
Loading...
Searching...
No Matches
Public Member Functions | List of all members
dart::SpawnIsolateTask Class Reference
Inheritance diagram for dart::SpawnIsolateTask:
dart::ThreadPool::Task dart::IntrusiveDListEntry< Task >

Public Member Functions

 SpawnIsolateTask (Isolate *parent_isolate, std::unique_ptr< IsolateSpawnState > state)
 
 ~SpawnIsolateTask () override
 
void Run () override
 
void RunHeavyweight (const char *name)
 
void RunLightweight (const char *name)
 
- Public Member Functions inherited from dart::ThreadPool::Task
virtual ~Task ()
 
- Public Member Functions inherited from dart::IntrusiveDListEntry< Task >
 IntrusiveDListEntry ()
 
 ~IntrusiveDListEntry ()
 

Additional Inherited Members

- Protected Member Functions inherited from dart::ThreadPool::Task
 Task ()
 

Detailed Description

Definition at line 559 of file isolate.cc.

Constructor & Destructor Documentation

◆ SpawnIsolateTask()

dart::SpawnIsolateTask::SpawnIsolateTask ( Isolate parent_isolate,
std::unique_ptr< IsolateSpawnState state 
)
inline

Definition at line 561 of file isolate.cc.

563 : parent_isolate_(parent_isolate), state_(std::move(state)) {
564 parent_isolate->IncrementSpawnCount();
565 }
AtkStateType state

◆ ~SpawnIsolateTask()

dart::SpawnIsolateTask::~SpawnIsolateTask ( )
inlineoverride

Definition at line 567 of file isolate.cc.

567 {
568 if (parent_isolate_ != nullptr) {
569 parent_isolate_->DecrementSpawnCount();
570 }
571 }
void DecrementSpawnCount()
Definition isolate.cc:3670

Member Function Documentation

◆ Run()

void dart::SpawnIsolateTask::Run ( )
inlineoverridevirtual

Implements dart::ThreadPool::Task.

Definition at line 573 of file isolate.cc.

573 {
574 const char* name = state_->debug_name();
575 ASSERT(name != nullptr);
576
577 auto group = state_->isolate_group();
578 if (group == nullptr) {
580 } else {
582 }
583 }
void RunLightweight(const char *name)
Definition isolate.cc:632
void RunHeavyweight(const char *name)
Definition isolate.cc:585
#define ASSERT(E)
const char *const name

◆ RunHeavyweight()

void dart::SpawnIsolateTask::RunHeavyweight ( const char *  name)
inline

Definition at line 585 of file isolate.cc.

585 {
586 // The create isolate group callback is mandatory. If not provided we
587 // cannot spawn isolates.
588 auto create_group_callback = Isolate::CreateGroupCallback();
589 if (create_group_callback == nullptr) {
590 FailedSpawn("Isolate spawn is not supported by this Dart embedder\n");
591 return;
592 }
593
594 char* error = nullptr;
595
596 // Make a copy of the state's isolate flags and hand it to the callback.
597 Dart_IsolateFlags api_flags = *(state_->isolate_flags());
598
599 // Inherit the system isolate property to work around issues with
600 // --pause-isolates-on-start and --pause-isolates-on-exit impacting macro
601 // generation isolates which are spawned by the kernel-service
602 // (see https://github.com/dart-lang/sdk/issues/54729 for details).
603 //
604 // This flag isn't inherited in the case that the main isolate is marked as
605 // a system isolate in the standalone VM using the
606 // --mark-main-isolate-as-system-isolate flag as it's currently used to
607 // hide test runner implementation details and spawns isolates that should
608 // be debuggable as non-system isolates.
609 //
610 // TODO(bkonyi): revisit this decision, see
611 // https://github.com/dart-lang/sdk/issues/54736 for the tracking issue.
612 const bool is_parent_main_isolate =
613 strcmp(parent_isolate_->name(), "main") == 0;
614 api_flags.is_system_isolate =
615 api_flags.is_system_isolate && !is_parent_main_isolate;
616 Dart_Isolate isolate =
617 (create_group_callback)(state_->script_url(), name, nullptr,
618 state_->package_config(), &api_flags,
619 parent_isolate_->init_callback_data(), &error);
620 parent_isolate_->DecrementSpawnCount();
621 parent_isolate_ = nullptr;
622
623 if (isolate == nullptr) {
624 FailedSpawn(error, /*has_current_isolate=*/false);
625 free(error);
626 return;
627 }
628 Dart_EnterIsolate(isolate);
629 Run(reinterpret_cast<Isolate*>(isolate));
630 }
void * init_callback_data() const
Definition isolate.h:1021
static Dart_IsolateGroupCreateCallback CreateGroupCallback()
Definition isolate.h:1156
const char * name() const
Definition isolate.h:996
void Run() override
Definition isolate.cc:573
struct _Dart_Isolate * Dart_Isolate
Definition dart_api.h:88
const uint8_t uint32_t uint32_t GError ** error
DART_EXPORT void Dart_EnterIsolate(Dart_Isolate isolate)

◆ RunLightweight()

void dart::SpawnIsolateTask::RunLightweight ( const char *  name)
inline

Definition at line 632 of file isolate.cc.

632 {
633 // The create isolate initialize callback is mandatory.
634 auto initialize_callback = Isolate::InitializeCallback();
635 if (initialize_callback == nullptr) {
636 FailedSpawn(
637 "Lightweight isolate spawn is not supported by this Dart embedder\n",
638 /*has_current_isolate=*/false);
639 return;
640 }
641
642 char* error = nullptr;
643
644 auto group = state_->isolate_group();
645 Isolate* isolate = CreateWithinExistingIsolateGroup(group, name, &error);
646 parent_isolate_->DecrementSpawnCount();
647 parent_isolate_ = nullptr;
648
649 if (isolate == nullptr) {
650 FailedSpawn(error, /*has_current_isolate=*/false);
651 free(error);
652 return;
653 }
654
655 void* child_isolate_data = nullptr;
656 const bool success = initialize_callback(&child_isolate_data, &error);
657 if (!success) {
658 FailedSpawn(error);
660 free(error);
661 return;
662 }
663
664 isolate->set_init_callback_data(child_isolate_data);
665 Run(isolate);
666 }
static Dart_InitializeIsolateCallback InitializeCallback()
Definition isolate.h:1163
Isolate * CreateWithinExistingIsolateGroup(IsolateGroup *group, const char *name, char **error)
DART_EXPORT void Dart_ShutdownIsolate()

The documentation for this class was generated from the following file: