Skip to content

Commit

Permalink
StatWatcher to use EventSource
Browse files Browse the repository at this point in the history
  • Loading branch information
ry committed Sep 17, 2010
1 parent d42ec74 commit 53406cd
Show file tree
Hide file tree
Showing 3 changed files with 25 additions and 50 deletions.
2 changes: 1 addition & 1 deletion lib/fs.js
Original file line number Diff line number Diff line change
Expand Up @@ -452,7 +452,7 @@ fs.watchFile = function (filename) {
stat = statWatchers[filename];
stat.start(filename, options.persistent, options.interval);
}
stat.addListener("change", listener);
stat.callback = listener;
return stat;
};

Expand Down
63 changes: 20 additions & 43 deletions src/node_stat_watcher.cc
Original file line number Diff line number Diff line change
Expand Up @@ -9,47 +9,28 @@ namespace node {

using namespace v8;

Persistent<FunctionTemplate> StatWatcher::constructor_template;

static Persistent<String> change_symbol;
static Persistent<String> stop_symbol;

void StatWatcher::Initialize(Handle<Object> target) {
HandleScope scope;

Local<FunctionTemplate> t = FunctionTemplate::New(StatWatcher::New);
constructor_template = Persistent<FunctionTemplate>::New(t);
constructor_template->Inherit(EventEmitter::constructor_template);
constructor_template->InstanceTemplate()->SetInternalFieldCount(1);
constructor_template->SetClassName(String::NewSymbol("StatWatcher"));

change_symbol = NODE_PSYMBOL("change");
stop_symbol = NODE_PSYMBOL("stop");
Local<FunctionTemplate> t = BuildTemplate<StatWatcher>("StatWatcher");

NODE_SET_PROTOTYPE_METHOD(constructor_template, "start", StatWatcher::Start);
NODE_SET_PROTOTYPE_METHOD(constructor_template, "stop", StatWatcher::Stop);
NODE_SET_PROTOTYPE_METHOD(t, "start", Start);
NODE_SET_PROTOTYPE_METHOD(t, "stop", Stop);

target->Set(String::NewSymbol("StatWatcher"), constructor_template->GetFunction());
target->Set(String::NewSymbol("StatWatcher"), t->GetFunction());
}


void StatWatcher::Callback(EV_P_ ev_stat *watcher, int revents) {
assert(revents == EV_STAT);
StatWatcher *handler = static_cast<StatWatcher*>(watcher->data);
assert(watcher == &handler->watcher_);
StatWatcher *w = static_cast<StatWatcher*>(watcher->data);
assert(watcher == &w->watcher_);

HandleScope scope;
Handle<Value> argv[2];
argv[0] = Handle<Value>(BuildStatsObject(&watcher->attr));
argv[1] = Handle<Value>(BuildStatsObject(&watcher->prev));
handler->Emit(change_symbol, 2, argv);
}


Handle<Value> StatWatcher::New(const Arguments& args) {
HandleScope scope;
StatWatcher *s = new StatWatcher();
s->Wrap(args.Holder());
return args.This();
w->MakeCallback(2, argv);
}


Expand All @@ -60,37 +41,33 @@ Handle<Value> StatWatcher::Start(const Arguments& args) {
return ThrowException(Exception::TypeError(String::New("Bad arguments")));
}

StatWatcher *handler = ObjectWrap::Unwrap<StatWatcher>(args.Holder());
StatWatcher *w = ObjectWrap::Unwrap<StatWatcher>(args.Holder());

String::Utf8Value path(args[0]->ToString());
assert(w->path_ == NULL);
w->path_ = strdup(*path);

assert(handler->path_ == NULL);
handler->path_ = strdup(*path);
w->persistent_ = args[1]->IsTrue();

ev_tstamp interval = 0.;
if (args[2]->IsInt32()) {
interval = NODE_V8_UNIXTIME(args[2]);
}

ev_stat_set(&handler->watcher_, handler->path_, interval);
ev_stat_start(EV_DEFAULT_UC_ &handler->watcher_);

handler->persistent_ = args[1]->IsTrue();

if (!handler->persistent_) {
ev_unref(EV_DEFAULT_UC);
}
ev_stat_set(&w->watcher_, w->path_, interval);
ev_stat_start(EV_DEFAULT_UC_ &w->watcher_);

handler->Ref();
w->Active();
if (!w->persistent_) ev_unref(EV_DEFAULT_UC);

return Undefined();
}


Handle<Value> StatWatcher::Stop(const Arguments& args) {
HandleScope scope;
StatWatcher *handler = ObjectWrap::Unwrap<StatWatcher>(args.Holder());
handler->Emit(stop_symbol, 0, NULL);
handler->Stop();
StatWatcher *w = ObjectWrap::Unwrap<StatWatcher>(args.Holder());
w->Stop();
return Undefined();
}

Expand All @@ -99,9 +76,9 @@ void StatWatcher::Stop () {
if (watcher_.active) {
if (!persistent_) ev_ref(EV_DEFAULT_UC);
ev_stat_stop(EV_DEFAULT_UC_ &watcher_);
Inactive();
free(path_);
path_ = NULL;
Unref();
}
}

Expand Down
10 changes: 4 additions & 6 deletions src/node_stat_watcher.h
Original file line number Diff line number Diff line change
Expand Up @@ -8,14 +8,11 @@

namespace node {

class StatWatcher : EventEmitter {
class StatWatcher : public EventSource {
public:
static void Initialize(v8::Handle<v8::Object> target);

protected:
static v8::Persistent<v8::FunctionTemplate> constructor_template;

StatWatcher() : EventEmitter() {
StatWatcher() : EventSource() {
persistent_ = false;
path_ = NULL;
ev_init(&watcher_, StatWatcher::Callback);
Expand All @@ -27,7 +24,8 @@ class StatWatcher : EventEmitter {
assert(path_ == NULL);
}

static v8::Handle<v8::Value> New(const v8::Arguments& args);

protected:
static v8::Handle<v8::Value> Start(const v8::Arguments& args);
static v8::Handle<v8::Value> Stop(const v8::Arguments& args);

Expand Down

0 comments on commit 53406cd

Please sign in to comment.