Skip to content

Commit 52c6449

Browse files
authored
src: drain platform tasks before creating startup snapshot
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. PR-URL: nodejs#56403 Refs: nodejs#56292 Reviewed-By: James M Snell <[email protected]> Reviewed-By: Joyee Cheung <[email protected]>
1 parent 062ae6f commit 52c6449

File tree

1 file changed

+14
-10
lines changed

1 file changed

+14
-10
lines changed

src/node_snapshotable.cc

+14-10
Original file line numberDiff line numberDiff line change
@@ -973,25 +973,29 @@ ExitCode BuildSnapshotWithoutCodeCache(
973973
}
974974
});
975975

976+
Context::Scope context_scope(setup->context());
977+
Environment* env = setup->env();
978+
976979
// Run the custom main script for fully customized snapshots.
977980
if (snapshot_type == SnapshotMetadata::Type::kFullyCustomized) {
978-
Context::Scope context_scope(setup->context());
979-
Environment* env = setup->env();
980981
#if HAVE_INSPECTOR
981982
env->InitializeInspector({});
982983
#endif
983984
if (LoadEnvironment(env, builder_script_content.value()).IsEmpty()) {
984985
return ExitCode::kGenericUserError;
985986
}
987+
}
986988

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

0 commit comments

Comments
 (0)