◐ Shell
clean mode source ↗

src: drain platform tasks before creating startup snapshot · nodejs/node@cf25a5e

Original file line numberDiff line numberDiff line change

@@ -993,25 +993,29 @@ ExitCode BuildSnapshotWithoutCodeCache(

993993

}

994994

});

995995
996+

Context::Scope context_scope(setup->context());

997+

Environment* env = setup->env();

998+
996999

// Run the custom main script for fully customized snapshots.

9971000

if (snapshot_type == SnapshotMetadata::Type::kFullyCustomized) {

998-

Context::Scope context_scope(setup->context());

999-

Environment* env = setup->env();

10001001

#if HAVE_INSPECTOR

10011002

env->InitializeInspector({});

10021003

#endif

10031004

if (LoadEnvironment(env, builder_script_content.value()).IsEmpty()) {

10041005

return ExitCode::kGenericUserError;

10051006

}

1007+

}

10061008
1007-

// FIXME(joyeecheung): right now running the loop in the snapshot

1008-

// builder might introduce inconsistencies in JS land that need to

1009-

// be synchronized again after snapshot restoration.

1010-

ExitCode exit_code =

1011-

SpinEventLoopInternal(env).FromMaybe(ExitCode::kGenericUserError);

1012-

if (exit_code != ExitCode::kNoFailure) {

1013-

return exit_code;

1014-

}

1009+

// Drain the loop and platform tasks before creating a snapshot. This is

1010+

// necessary to ensure that the no roots are held by the the platform

1011+

// tasks, which may reference objects associated with a context. For

1012+

// example, a WeakRef may schedule an per-isolate platform task as a GC

1013+

// root, and referencing an object in a context, causing an assertion in

1014+

// the snapshot creator.

1015+

ExitCode exit_code =

1016+

SpinEventLoopInternal(env).FromMaybe(ExitCode::kGenericUserError);

1017+

if (exit_code != ExitCode::kNoFailure) {

1018+

return exit_code;

10151019

}

10161020

}

10171021