Skip to content

Commit 8234d04

Browse files
addaleaxMylesBorins
authored andcommittedNov 17, 2019
src: track no of active JS signal handlers
This makes it possible to tell whether a signal is being tracked in JS. PR-URL: #30229 Reviewed-By: Colin Ihrig <[email protected]> Reviewed-By: Gireesh Punathil <[email protected]> Reviewed-By: Joyee Cheung <[email protected]> Reviewed-By: Shelley Vohr <[email protected]>
1 parent 0072a8e commit 8234d04

File tree

2 files changed

+40
-0
lines changed

2 files changed

+40
-0
lines changed
 

‎src/node_internals.h

+2
Original file line numberDiff line numberDiff line change
@@ -322,6 +322,8 @@ void EndStartedProfilers(Environment* env);
322322
}
323323
#endif // HAVE_INSPECTOR
324324

325+
bool HasSignalJSHandler(int signum);
326+
325327
#ifdef _WIN32
326328
typedef SYSTEMTIME TIME_TYPE;
327329
#else // UNIX, OSX

‎src/signal_wrap.cc

+38
Original file line numberDiff line numberDiff line change
@@ -38,8 +38,13 @@ using v8::Object;
3838
using v8::String;
3939
using v8::Value;
4040

41+
void DecreaseSignalHandlerCount(int signum);
42+
4143
namespace {
4244

45+
static Mutex handled_signals_mutex;
46+
static std::map<int, int64_t> handled_signals; // Signal -> number of handlers
47+
4348
class SignalWrap : public HandleWrap {
4449
public:
4550
static void Initialize(Local<Object> target,
@@ -85,6 +90,11 @@ class SignalWrap : public HandleWrap {
8590
CHECK_EQ(r, 0);
8691
}
8792

93+
void Close(v8::Local<v8::Value> close_callback) override {
94+
if (active_) DecreaseSignalHandlerCount(handle_.signum);
95+
HandleWrap::Close(close_callback);
96+
}
97+
8898
static void Start(const FunctionCallbackInfo<Value>& args) {
8999
SignalWrap* wrap;
90100
ASSIGN_OR_RETURN_UNWRAP(&wrap, args.Holder());
@@ -112,21 +122,49 @@ class SignalWrap : public HandleWrap {
112122
wrap->MakeCallback(env->onsignal_string(), 1, &arg);
113123
},
114124
signum);
125+
126+
if (err == 0) {
127+
CHECK(!wrap->active_);
128+
wrap->active_ = true;
129+
Mutex::ScopedLock lock(handled_signals_mutex);
130+
handled_signals[signum]++;
131+
}
132+
115133
args.GetReturnValue().Set(err);
116134
}
117135

118136
static void Stop(const FunctionCallbackInfo<Value>& args) {
119137
SignalWrap* wrap;
120138
ASSIGN_OR_RETURN_UNWRAP(&wrap, args.Holder());
139+
140+
if (wrap->active_) {
141+
wrap->active_ = false;
142+
DecreaseSignalHandlerCount(wrap->handle_.signum);
143+
}
144+
121145
int err = uv_signal_stop(&wrap->handle_);
122146
args.GetReturnValue().Set(err);
123147
}
124148

125149
uv_signal_t handle_;
150+
bool active_ = false;
126151
};
127152

128153

129154
} // anonymous namespace
155+
156+
void DecreaseSignalHandlerCount(int signum) {
157+
Mutex::ScopedLock lock(handled_signals_mutex);
158+
int new_handler_count = --handled_signals[signum];
159+
CHECK_GE(new_handler_count, 0);
160+
if (new_handler_count == 0)
161+
handled_signals.erase(signum);
162+
}
163+
164+
bool HasSignalJSHandler(int signum) {
165+
Mutex::ScopedLock lock(handled_signals_mutex);
166+
return handled_signals.find(signum) != handled_signals.end();
167+
}
130168
} // namespace node
131169

132170

0 commit comments

Comments
 (0)