src: do not persist fs_poll handle in stat_watcher · nodejs/node@4f01168
@@ -77,19 +77,15 @@ void StatWatcher::Initialize(Environment* env, Local<Object> target) {
77777878StatWatcher::StatWatcher(Environment* env, Local<Object> wrap, bool use_bigint)
7979 : AsyncWrap(env, wrap, AsyncWrap::PROVIDER_STATWATCHER),
80-watcher_(new uv_fs_poll_t),
80+watcher_(nullptr),
8181 use_bigint_(use_bigint) {
8282MakeWeak();
83-uv_fs_poll_init(env->event_loop(), watcher_);
84- watcher_->data = static_cast<void*>(this);
8583}
868487858886StatWatcher::~StatWatcher() {
89-if (IsActive()) {
87+if (IsActive())
9088Stop();
91- }
92-env()->CloseHandle(watcher_, [](uv_fs_poll_t* handle) { delete handle; });
9389}
94909591@@ -123,7 +119,7 @@ void StatWatcher::New(const FunctionCallbackInfo<Value>& args) {
123119}
124120125121bool StatWatcher::IsActive() {
126-return uv_is_active(reinterpret_cast<uv_handle_t*>(watcher_)) != 0;
122+return watcher_ != nullptr;
127123}
128124129125void StatWatcher::IsActive(const v8::FunctionCallbackInfo<v8::Value>& args) {
@@ -156,6 +152,9 @@ void StatWatcher::Start(const FunctionCallbackInfo<Value>& args) {
156152CHECK(args[2]->IsUint32());
157153const uint32_t interval = args[2].As<Uint32>()->Value();
158154155+ wrap->watcher_ = new uv_fs_poll_t();
156+CHECK_EQ(0, uv_fs_poll_init(wrap->env()->event_loop(), wrap->watcher_));
157+ wrap->watcher_->data = static_cast<void*>(wrap);
159158// Safe, uv_ref/uv_unref are idempotent.
160159if (persistent)
161160uv_ref(reinterpret_cast<uv_handle_t*>(wrap->watcher_));
@@ -187,7 +186,8 @@ void StatWatcher::Stop(const FunctionCallbackInfo<Value>& args) {
187186188187189188void StatWatcher::Stop() {
190-uv_fs_poll_stop(watcher_);
189+env()->CloseHandle(watcher_, [](uv_fs_poll_t* handle) { delete handle; });
190+ watcher_ = nullptr;
191191MakeWeak();
192192}
193193