Skip to content

src: drain platform tasks before taking startup snapshot #56403

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
Jan 7, 2025
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 14 additions & 10 deletions src/node_snapshotable.cc
Original file line number Diff line number Diff line change
Expand Up @@ -973,25 +973,29 @@ ExitCode BuildSnapshotWithoutCodeCache(
}
});

Context::Scope context_scope(setup->context());
Environment* env = setup->env();

// Run the custom main script for fully customized snapshots.
if (snapshot_type == SnapshotMetadata::Type::kFullyCustomized) {
Context::Scope context_scope(setup->context());
Environment* env = setup->env();
#if HAVE_INSPECTOR
env->InitializeInspector({});
#endif
if (LoadEnvironment(env, builder_script_content.value()).IsEmpty()) {
return ExitCode::kGenericUserError;
}
}

// FIXME(joyeecheung): right now running the loop in the snapshot
// builder might introduce inconsistencies in JS land that need to
// be synchronized again after snapshot restoration.
ExitCode exit_code =
SpinEventLoopInternal(env).FromMaybe(ExitCode::kGenericUserError);
if (exit_code != ExitCode::kNoFailure) {
return exit_code;
}
// Drain the loop and platform tasks before creating a snapshot. This is
// necessary to ensure that the no roots are held by the the platform
// tasks, which may reference objects associated with a context. For
// example, a WeakRef may schedule an per-isolate platform task as a GC
// root, and referencing an object in a context, causing an assertion in
// the snapshot creator.
ExitCode exit_code =
SpinEventLoopInternal(env).FromMaybe(ExitCode::kGenericUserError);
if (exit_code != ExitCode::kNoFailure) {
return exit_code;
}
}

Expand Down
Loading