Skip to content

Commit

Permalink
src: drain platform tasks before creating startup snapshot
Browse files Browse the repository at this point in the history
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]>
  • Loading branch information
legendecas authored Jan 7, 2025
1 parent 062ae6f commit 52c6449
Showing 1 changed file with 14 additions and 10 deletions.
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

0 comments on commit 52c6449

Please sign in to comment.