31
31
namespace node {
32
32
33
33
using v8::Context;
34
- using v8::DontDelete;
35
- using v8::DontEnum;
36
34
using v8::FunctionCallbackInfo;
37
35
using v8::FunctionTemplate;
38
36
using v8::HandleScope;
39
37
using v8::Integer;
40
38
using v8::Local;
41
39
using v8::Object;
42
- using v8::PropertyAttribute;
43
- using v8::ReadOnly;
44
- using v8::Signature;
45
40
using v8::String;
46
41
using v8::Uint32;
47
42
using v8::Value;
@@ -58,43 +53,32 @@ void StatWatcher::Initialize(Environment* env, Local<Object> target) {
58
53
59
54
AsyncWrap::AddWrapMethods (env, t);
60
55
env->SetProtoMethod (t, " start" , StatWatcher::Start);
61
- env->SetProtoMethod (t, " stop" , StatWatcher::Stop);
62
-
63
- Local<FunctionTemplate> is_active_templ =
64
- FunctionTemplate::New (env->isolate (),
65
- IsActive,
66
- env->as_external (),
67
- Signature::New (env->isolate (), t));
68
- t->PrototypeTemplate ()->SetAccessorProperty (
69
- FIXED_ONE_BYTE_STRING (env->isolate (), " isActive" ),
70
- is_active_templ,
71
- Local<FunctionTemplate>(),
72
- static_cast <PropertyAttribute>(ReadOnly | DontDelete | DontEnum));
56
+ env->SetProtoMethod (t, " close" , HandleWrap::Close);
57
+ env->SetProtoMethod (t, " ref" , HandleWrap::Ref);
58
+ env->SetProtoMethod (t, " unref" , HandleWrap::Unref);
59
+ env->SetProtoMethod (t, " hasRef" , HandleWrap::HasRef);
73
60
74
61
target->Set (statWatcherString, t->GetFunction ());
75
62
}
76
63
77
64
78
- StatWatcher::StatWatcher (Environment* env, Local<Object> wrap, bool use_bigint)
79
- : AsyncWrap(env, wrap, AsyncWrap::PROVIDER_STATWATCHER),
80
- watcher_ (nullptr ),
65
+ StatWatcher::StatWatcher (Environment* env,
66
+ Local<Object> wrap,
67
+ bool use_bigint)
68
+ : HandleWrap(env,
69
+ wrap,
70
+ reinterpret_cast <uv_handle_t *>(&watcher_),
71
+ AsyncWrap::PROVIDER_STATWATCHER),
81
72
use_bigint_ (use_bigint) {
82
- MakeWeak ();
83
- }
84
-
85
-
86
- StatWatcher::~StatWatcher () {
87
- if (IsActive ())
88
- Stop ();
73
+ CHECK_EQ (0 , uv_fs_poll_init (env->event_loop (), &watcher_));
89
74
}
90
75
91
76
92
77
void StatWatcher::Callback (uv_fs_poll_t * handle,
93
78
int status,
94
79
const uv_stat_t * prev,
95
80
const uv_stat_t * curr) {
96
- StatWatcher* wrap = static_cast <StatWatcher*>(handle->data );
97
- CHECK_EQ (wrap->watcher_ , handle);
81
+ StatWatcher* wrap = ContainerOf (&StatWatcher::watcher_, handle);
98
82
Environment* env = wrap->env ();
99
83
HandleScope handle_scope (env->isolate ());
100
84
Context::Scope context_scope (env->context ());
@@ -118,78 +102,28 @@ void StatWatcher::New(const FunctionCallbackInfo<Value>& args) {
118
102
new StatWatcher (env, args.This (), args[0 ]->IsTrue ());
119
103
}
120
104
121
- bool StatWatcher::IsActive () {
122
- return watcher_ != nullptr ;
123
- }
124
-
125
- void StatWatcher::IsActive (const v8::FunctionCallbackInfo<v8::Value>& args) {
126
- StatWatcher* wrap = Unwrap<StatWatcher>(args.This ());
127
- CHECK_NOT_NULL (wrap);
128
- args.GetReturnValue ().Set (wrap->IsActive ());
129
- }
130
-
131
- // wrap.start(filename, persistent, interval)
105
+ // wrap.start(filename, interval)
132
106
void StatWatcher::Start (const FunctionCallbackInfo<Value>& args) {
133
- CHECK_EQ (args.Length (), 3 );
107
+ CHECK_EQ (args.Length (), 2 );
134
108
135
- StatWatcher* wrap = Unwrap<StatWatcher>(args.Holder ());
136
- CHECK_NOT_NULL (wrap);
137
- if (wrap->IsActive ()) {
138
- return ;
139
- }
109
+ StatWatcher* wrap;
110
+ ASSIGN_OR_RETURN_UNWRAP (&wrap, args.Holder ());
111
+ CHECK (!uv_is_active (wrap->GetHandle ()));
140
112
141
113
const int argc = args.Length ();
142
- CHECK_GE (argc, 3 );
143
114
144
115
node::Utf8Value path (args.GetIsolate (), args[0 ]);
145
116
CHECK_NOT_NULL (*path);
146
117
147
- bool persistent = true ;
148
- if (args[1 ]->IsFalse ()) {
149
- persistent = false ;
150
- }
151
-
152
- CHECK (args[2 ]->IsUint32 ());
153
- const uint32_t interval = args[2 ].As <Uint32>()->Value ();
154
-
155
- 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);
158
- // Safe, uv_ref/uv_unref are idempotent.
159
- if (persistent)
160
- uv_ref (reinterpret_cast <uv_handle_t *>(wrap->watcher_ ));
161
- else
162
- uv_unref (reinterpret_cast <uv_handle_t *>(wrap->watcher_ ));
118
+ CHECK (args[1 ]->IsUint32 ());
119
+ const uint32_t interval = args[1 ].As <Uint32>()->Value ();
163
120
164
121
// Note that uv_fs_poll_start does not return ENOENT, we are handling
165
122
// mostly memory errors here.
166
- const int err = uv_fs_poll_start (wrap->watcher_ , Callback, *path, interval);
123
+ const int err = uv_fs_poll_start (& wrap->watcher_ , Callback, *path, interval);
167
124
if (err != 0 ) {
168
125
args.GetReturnValue ().Set (err);
169
126
}
170
- wrap->ClearWeak ();
171
127
}
172
128
173
-
174
- void StatWatcher::Stop (const FunctionCallbackInfo<Value>& args) {
175
- StatWatcher* wrap = Unwrap<StatWatcher>(args.Holder ());
176
- CHECK_NOT_NULL (wrap);
177
- if (!wrap->IsActive ()) {
178
- return ;
179
- }
180
-
181
- Environment* env = wrap->env ();
182
- Context::Scope context_scope (env->context ());
183
- wrap->MakeCallback (env->onstop_string (), 0 , nullptr );
184
- wrap->Stop ();
185
- }
186
-
187
-
188
- void StatWatcher::Stop () {
189
- env ()->CloseHandle (watcher_, [](uv_fs_poll_t * handle) { delete handle; });
190
- watcher_ = nullptr ;
191
- MakeWeak ();
192
- }
193
-
194
-
195
129
} // namespace node
0 commit comments