Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/nodejs/node.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorJoyee Cheung <joyeec9h3@gmail.com>2022-03-25 16:15:39 +0300
committerJoyee Cheung <joyeec9h3@gmail.com>2022-03-31 14:29:14 +0300
commitc131fbb65230cc8f62cc0f41682388507a669684 (patch)
tree30fe4a6b0f6a843a2b46be65208afaa4eea14f22 /lib
parent37aee80643822c8c9ff35c906d034ecc8fc448d5 (diff)
bootstrap: make I/O streams work with user-land snapshot
Use the mksnapshot cleanup hooks to release the references to the native streams so that they can be destroyed right before the snapshot is taken, and move the initialization of the global console to pre-execution so that they can be re-initialized during snapshot dehydration. This makes it possible for user-land snapshots to use the I/O during snapshot building. PR-URL: https://github.com/nodejs/node/pull/42466 Reviewed-By: Darshan Sen <raisinten@gmail.com> Reviewed-By: Mohammed Keyvanzadeh <mohammadkeyvanzade94@gmail.com> Reviewed-By: Khaidi Chu <i@2333.moe> Reviewed-By: Chengzhong Wu <legendecas@gmail.com>
Diffstat (limited to 'lib')
-rw-r--r--lib/internal/bootstrap/pre_execution.js6
-rw-r--r--lib/internal/bootstrap/switches/is_main_thread.js34
-rw-r--r--lib/internal/console/constructor.js6
-rw-r--r--lib/internal/console/global.js7
4 files changed, 45 insertions, 8 deletions
diff --git a/lib/internal/bootstrap/pre_execution.js b/lib/internal/bootstrap/pre_execution.js
index 4a5db2fab13..3ef1bca0d4f 100644
--- a/lib/internal/bootstrap/pre_execution.js
+++ b/lib/internal/bootstrap/pre_execution.js
@@ -124,6 +124,12 @@ function patchProcessObject(expandArgv1) {
}
}
+ // We need to initialize the global console here again with process.stdout
+ // and friends for snapshot deserialization.
+ const globalConsole = require('internal/console/global');
+ const { initializeGlobalConsole } = require('internal/console/constructor');
+ initializeGlobalConsole(globalConsole);
+
// TODO(joyeecheung): most of these should be deprecated and removed,
// except some that we need to be able to mutate during run time.
addReadOnlyProcessAlias('_eval', '--eval');
diff --git a/lib/internal/bootstrap/switches/is_main_thread.js b/lib/internal/bootstrap/switches/is_main_thread.js
index 606da95f21c..b7bd79e09c4 100644
--- a/lib/internal/bootstrap/switches/is_main_thread.js
+++ b/lib/internal/bootstrap/switches/is_main_thread.js
@@ -122,15 +122,34 @@ let stdin;
let stdout;
let stderr;
+let stdoutDestroy;
+let stderrDestroy;
+
+function refreshStdoutOnSigWinch() {
+ stdout._refreshSize();
+}
+
+function refreshStderrOnSigWinch() {
+ stderr._refreshSize();
+}
+
function getStdout() {
if (stdout) return stdout;
stdout = createWritableStdioStream(1);
stdout.destroySoon = stdout.destroy;
// Override _destroy so that the fd is never actually closed.
+ stdoutDestroy = stdout._destroy;
stdout._destroy = dummyDestroy;
if (stdout.isTTY) {
- process.on('SIGWINCH', () => stdout._refreshSize());
+ process.on('SIGWINCH', refreshStdoutOnSigWinch);
}
+
+ internalBinding('mksnapshot').cleanups.push(function cleanupStdout() {
+ stdout._destroy = stdoutDestroy;
+ stdout.destroy();
+ process.removeListener('SIGWINCH', refreshStdoutOnSigWinch);
+ stdout = undefined;
+ });
return stdout;
}
@@ -138,11 +157,18 @@ function getStderr() {
if (stderr) return stderr;
stderr = createWritableStdioStream(2);
stderr.destroySoon = stderr.destroy;
+ stderrDestroy = stderr._destroy;
// Override _destroy so that the fd is never actually closed.
stderr._destroy = dummyDestroy;
if (stderr.isTTY) {
- process.on('SIGWINCH', () => stderr._refreshSize());
+ process.on('SIGWINCH', refreshStderrOnSigWinch);
}
+ internalBinding('mksnapshot').cleanups.push(function cleanupStderr() {
+ stderr._destroy = stderrDestroy;
+ stderr.destroy();
+ process.removeListener('SIGWINCH', refreshStderrOnSigWinch);
+ stderr = undefined;
+ });
return stderr;
}
@@ -229,6 +255,10 @@ function getStdin() {
}
}
+ internalBinding('mksnapshot').cleanups.push(function cleanupStdin() {
+ stdin.destroy();
+ stdin = undefined;
+ });
return stdin;
}
diff --git a/lib/internal/console/constructor.js b/lib/internal/console/constructor.js
index 695a56164b7..5ad57be3bed 100644
--- a/lib/internal/console/constructor.js
+++ b/lib/internal/console/constructor.js
@@ -669,9 +669,15 @@ Console.prototype.dirxml = Console.prototype.log;
Console.prototype.error = Console.prototype.warn;
Console.prototype.groupCollapsed = Console.prototype.group;
+function initializeGlobalConsole(globalConsole) {
+ globalConsole[kBindStreamsLazy](process);
+ globalConsole[kBindProperties](true, 'auto');
+}
+
module.exports = {
Console,
kBindStreamsLazy,
kBindProperties,
+ initializeGlobalConsole,
formatTime // exported for tests
};
diff --git a/lib/internal/console/global.js b/lib/internal/console/global.js
index d6c0c24d529..782a585957f 100644
--- a/lib/internal/console/global.js
+++ b/lib/internal/console/global.js
@@ -21,9 +21,7 @@ const {
} = primordials;
const {
- Console,
- kBindStreamsLazy,
- kBindProperties
+ Console
} = require('internal/console/constructor');
const globalConsole = ObjectCreate({});
@@ -44,9 +42,6 @@ for (const prop of ReflectOwnKeys(Console.prototype)) {
ReflectDefineProperty(globalConsole, prop, desc);
}
-globalConsole[kBindStreamsLazy](process);
-globalConsole[kBindProperties](true, 'auto');
-
// This is a legacy feature - the Console constructor is exposed on
// the global console instance.
globalConsole.Console = Console;