Skip to content

Commit

Permalink
src: make start of signal_wrap reenterable
Browse files Browse the repository at this point in the history
  • Loading branch information
theanarkh authored and aduh95 committed May 12, 2024
1 parent 91d30f3 commit d1a0bdd
Show file tree
Hide file tree
Showing 2 changed files with 28 additions and 1 deletion.
7 changes: 6 additions & 1 deletion src/signal_wrap.cc
Original file line number Diff line number Diff line change
Expand Up @@ -118,6 +118,8 @@ class SignalWrap : public HandleWrap {
}
}
#endif
// Save the old signum
int old_signum = wrap->handle_.signum;
int err = uv_signal_start(
&wrap->handle_,
[](uv_signal_t* handle, int signum) {
Expand All @@ -131,7 +133,10 @@ class SignalWrap : public HandleWrap {
signum);

if (err == 0) {
CHECK(!wrap->active_);
// Subtract 1 if previously registered
if (wrap->active_) {
DecreaseSignalHandlerCount(old_signum);
}
wrap->active_ = true;
Mutex::ScopedLock lock(handled_signals_mutex);
handled_signals[signum]++;
Expand Down
22 changes: 22 additions & 0 deletions test/parallel/test-signal-reuse.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
// Flags: --expose-internals
'use strict';
const common = require('../common');
const { internalBinding } = require('internal/test/binding');
const { signals } = internalBinding('constants').os;
const Signal = internalBinding('signal_wrap').Signal;

if (!common.isMainThread)
common.skip('Signal handling in Workers is not supported');

const signal = new Signal();
signal.start(signals.SIGUSR2);
signal.onsignal = common.mustCall(() => {
process.nextTick(() => {
signal.start(signals.SIGINT);
signal.onsignal = common.mustCall(() => {
signal.close();
});
process.kill(0, signals.SIGINT);
});
});
process.kill(0, signals.SIGUSR2);

0 comments on commit d1a0bdd

Please sign in to comment.