Skip to content
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

build: don't squash signal handlers with --shared #10539

Closed
wants to merge 1 commit into from
Closed
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
4 changes: 3 additions & 1 deletion src/node.cc
Original file line number Diff line number Diff line change
@@ -2192,7 +2192,7 @@ static void WaitForInspectorDisconnect(Environment* env) {
if (env->inspector_agent()->IsConnected()) {
// Restore signal dispositions, the app is done and is no longer
// capable of handling signals.
#ifdef __POSIX__
#if defined(__POSIX__) && !defined(NODE_SHARED_MODE)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can you provide a bit more detail on why its needed here in addition to the other location. The section that avoids restoring them because the parent may have changed them makes sense to me. But this part seems more related to the inspector and may still apply in the shared library case.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I didn't think the inspector applied any additional signal handlers therefore it seems wrong to squash them all on the exit of the node runtime when loaded as a shared library (potentially someone could shutdown the node runtime within their own application and I wouldn't want this to squash any signal handlers in the caller).

I'm happy to be corrected though if there was a separate reason for this loop to be added in here. @eugeneo added this sequence in 6626919 so may have more info and be able to comment.

To be fair, as far as I can see this is only invoked when someone calls process.exit() from within javascript, in which case it'll currently be taking the wrapping process down anyway. on that basis I suspect it won't make a lot of practical difference either way, although I'd prefer to be sure that we really didn't want to squash the handlers in this "embedded" case before removing it.

struct sigaction act;
memset(&act, 0, sizeof(act));
for (unsigned nr = 1; nr < kMaxSignal; nr += 1) {
@@ -4093,6 +4093,7 @@ inline void PlatformInit() {

CHECK_EQ(err, 0);

#ifndef NODE_SHARED_MODE
// Restore signal dispositions, the parent process may have changed them.
struct sigaction act;
memset(&act, 0, sizeof(act));
@@ -4106,6 +4107,7 @@ inline void PlatformInit() {
act.sa_handler = (nr == SIGPIPE) ? SIG_IGN : SIG_DFL;
CHECK_EQ(0, sigaction(nr, &act, nullptr));
}
#endif // !NODE_SHARED_MODE

RegisterSignalHandler(SIGINT, SignalExit, true);
RegisterSignalHandler(SIGTERM, SignalExit, true);