2525#include < string.h>
2626#include < stdlib.h>
2727
28+ // Poll interval in milliseconds. 5007 is what libev used to use. It's a little
29+ // on the slow side but let's stick with it for now, keep behavioral changes to
30+ // a minimum.
31+ #define DEFAULT_POLL_INTERVAL 5007
32+
2833namespace node {
2934
3035using namespace v8 ;
@@ -33,6 +38,7 @@ Persistent<FunctionTemplate> StatWatcher::constructor_template;
3338static Persistent<String> onchange_sym;
3439static Persistent<String> onstop_sym;
3540
41+
3642void StatWatcher::Initialize (Handle<Object> target) {
3743 HandleScope scope;
3844
@@ -48,18 +54,24 @@ void StatWatcher::Initialize(Handle<Object> target) {
4854}
4955
5056
51- void StatWatcher::Callback (EV_P_ ev_stat *watcher, int revents) {
52- assert (revents == EV_STAT);
53- StatWatcher *handler = static_cast <StatWatcher*>(watcher->data );
54- assert (watcher == &handler->watcher_ );
57+ void StatWatcher::Callback (uv_fs_poll_t * handle,
58+ int status,
59+ const uv_statbuf_t * prev,
60+ const uv_statbuf_t * curr) {
61+ StatWatcher* wrap = container_of (handle, StatWatcher, watcher_);
62+ assert (handle == &wrap->watcher_ );
5563 HandleScope scope;
56- Local<Value> argv[2 ];
57- argv[0 ] = BuildStatsObject (&watcher->attr );
58- argv[1 ] = BuildStatsObject (&watcher->prev );
64+ Local<Value> argv[3 ];
65+ argv[0 ] = BuildStatsObject (curr);
66+ argv[1 ] = BuildStatsObject (prev);
67+ argv[2 ] = Integer::New (status);
68+ if (status == -1 ) {
69+ SetErrno (uv_last_error (wrap->watcher_ .loop ));
70+ }
5971 if (onchange_sym.IsEmpty ()) {
6072 onchange_sym = NODE_PSYMBOL (" onchange" );
6173 }
62- MakeCallback (handler ->handle_ , onchange_sym, ARRAY_SIZE (argv), argv);
74+ MakeCallback (wrap ->handle_ , onchange_sym, ARRAY_SIZE (argv), argv);
6375}
6476
6577
@@ -69,7 +81,7 @@ Handle<Value> StatWatcher::New(const Arguments& args) {
6981 }
7082
7183 HandleScope scope;
72- StatWatcher * s = new StatWatcher ();
84+ StatWatcher* s = new StatWatcher ();
7385 s->Wrap (args.Holder ());
7486 return args.This ();
7587}
@@ -82,52 +94,44 @@ Handle<Value> StatWatcher::Start(const Arguments& args) {
8294 return ThrowException (Exception::TypeError (String::New (" Bad arguments" )));
8395 }
8496
85- StatWatcher *handler = ObjectWrap::Unwrap<StatWatcher>(args.Holder ());
97+ StatWatcher* wrap = ObjectWrap::Unwrap<StatWatcher>(args.Holder ());
8698 String::Utf8Value path (args[0 ]);
8799
88- assert (handler->path_ == NULL );
89- handler->path_ = strdup (*path);
90-
91- ev_tstamp interval = 0 .;
92- if (args[2 ]->IsInt32 ()) {
93- interval = NODE_V8_UNIXTIME (args[2 ]);
100+ uint32_t interval = DEFAULT_POLL_INTERVAL;
101+ if (args[2 ]->IsUint32 ()) {
102+ interval = args[2 ]->Uint32Value ();
94103 }
95104
96- ev_stat_set (&handler->watcher_ , handler->path_ , interval);
97- ev_stat_start (EV_DEFAULT_UC_ &handler->watcher_ );
105+ uv_fs_poll_start (&wrap->watcher_ , Callback, *path, interval);
98106
99- handler ->persistent_ = args[1 ]->IsTrue ();
107+ wrap ->persistent_ = args[1 ]->IsTrue ();
100108
101- if (!handler ->persistent_ ) {
102- ev_unref (EV_DEFAULT_UC );
109+ if (!wrap ->persistent_ ) {
110+ uv_unref ( reinterpret_cast < uv_handle_t *>(&wrap-> watcher_ ) );
103111 }
104112
105- handler ->Ref ();
113+ wrap ->Ref ();
106114
107115 return Undefined ();
108116}
109117
110118
111119Handle<Value> StatWatcher::Stop (const Arguments& args) {
112120 HandleScope scope;
113- StatWatcher *handler = ObjectWrap::Unwrap<StatWatcher>(args.Holder ());
121+ StatWatcher* wrap = ObjectWrap::Unwrap<StatWatcher>(args.Holder ());
114122 if (onstop_sym.IsEmpty ()) {
115123 onstop_sym = NODE_PSYMBOL (" onstop" );
116124 }
117- MakeCallback (handler ->handle_ , onstop_sym, 0 , NULL );
118- handler ->Stop ();
125+ MakeCallback (wrap ->handle_ , onstop_sym, 0 , NULL );
126+ wrap ->Stop ();
119127 return Undefined ();
120128}
121129
122130
123131void StatWatcher::Stop () {
124- if (watcher_.active ) {
125- if (!persistent_) ev_ref (EV_DEFAULT_UC);
126- ev_stat_stop (EV_DEFAULT_UC_ &watcher_);
127- free (path_);
128- path_ = NULL ;
129- Unref ();
130- }
132+ if (!uv_is_active (reinterpret_cast <uv_handle_t *>(&watcher_))) return ;
133+ uv_fs_poll_stop (&watcher_);
134+ Unref ();
131135}
132136
133137
0 commit comments