| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [Original HTTPS Page] |
1 parent 0072a8e commit 8234d04
2 files changed
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -322,6 +322,8 @@ void EndStartedProfilers(Environment* env); | |||
| 322 | 322 | } | |
| 323 | 323 | #endif // HAVE_INSPECTOR | |
| 324 | 324 | ||
| 325 | + bool HasSignalJSHandler(int signum); | ||
| 326 | + | ||
| 325 | 327 | #ifdef _WIN32 | |
| 326 | 328 | typedef SYSTEMTIME TIME_TYPE; | |
| 327 | 329 | #else // UNIX, OSX | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -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 | ||
| Back | FazBrowse Home | New Git URL |
0 commit comments