@@ -38,8 +38,13 @@ using v8::Object;
38
38
using v8::String;
39
39
using v8::Value;
40
40
41
+ void DecreaseSignalHandlerCount (int signum);
42
+
41
43
namespace {
42
44
45
+ static Mutex handled_signals_mutex;
46
+ static std::map<int , int64_t > handled_signals; // Signal -> number of handlers
47
+
43
48
class SignalWrap : public HandleWrap {
44
49
public:
45
50
static void Initialize (Local<Object> target,
@@ -85,6 +90,11 @@ class SignalWrap : public HandleWrap {
85
90
CHECK_EQ (r, 0 );
86
91
}
87
92
93
+ void Close (v8::Local<v8::Value> close_callback) override {
94
+ if (active_) DecreaseSignalHandlerCount (handle_.signum );
95
+ HandleWrap::Close (close_callback);
96
+ }
97
+
88
98
static void Start (const FunctionCallbackInfo<Value>& args) {
89
99
SignalWrap* wrap;
90
100
ASSIGN_OR_RETURN_UNWRAP (&wrap, args.Holder ());
@@ -112,21 +122,49 @@ class SignalWrap : public HandleWrap {
112
122
wrap->MakeCallback (env->onsignal_string (), 1 , &arg);
113
123
},
114
124
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
+
115
133
args.GetReturnValue ().Set (err);
116
134
}
117
135
118
136
static void Stop (const FunctionCallbackInfo<Value>& args) {
119
137
SignalWrap* wrap;
120
138
ASSIGN_OR_RETURN_UNWRAP (&wrap, args.Holder ());
139
+
140
+ if (wrap->active_ ) {
141
+ wrap->active_ = false ;
142
+ DecreaseSignalHandlerCount (wrap->handle_ .signum );
143
+ }
144
+
121
145
int err = uv_signal_stop (&wrap->handle_ );
122
146
args.GetReturnValue ().Set (err);
123
147
}
124
148
125
149
uv_signal_t handle_;
150
+ bool active_ = false ;
126
151
};
127
152
128
153
129
154
} // 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
+ }
130
168
} // namespace node
131
169
132
170
0 commit comments