summaryrefslogtreecommitdiff
path: root/src/node_stat_watcher.cc
diff options
context:
space:
mode:
authorRyan Dahl <ry@tinyclouds.org>2010-03-15 14:05:18 -0700
committerRyan Dahl <ry@tinyclouds.org>2010-03-15 14:24:15 -0700
commit8492c52e1529cf5988efd2b64e853b08a9c3a079 (patch)
tree55588f229d953c4bf0aafb095bd72ac57279190e /src/node_stat_watcher.cc
parent627fb5adbbc324fae657d2c88523234e6d83cc1c (diff)
downloadandroid-node-v8-8492c52e1529cf5988efd2b64e853b08a9c3a079.tar.gz
android-node-v8-8492c52e1529cf5988efd2b64e853b08a9c3a079.tar.bz2
android-node-v8-8492c52e1529cf5988efd2b64e853b08a9c3a079.zip
Use uniform watcher names
Diffstat (limited to 'src/node_stat_watcher.cc')
-rw-r--r--src/node_stat_watcher.cc109
1 files changed, 109 insertions, 0 deletions
diff --git a/src/node_stat_watcher.cc b/src/node_stat_watcher.cc
new file mode 100644
index 0000000000..f5fd09c8bc
--- /dev/null
+++ b/src/node_stat_watcher.cc
@@ -0,0 +1,109 @@
+// Copyright 2009 Ryan Dahl <ry@tinyclouds.org>
+#include <node_stat_watcher.h>
+
+#include <assert.h>
+#include <string.h>
+#include <stdlib.h>
+
+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("StatWatcherWatcher"));
+
+ change_symbol = NODE_PSYMBOL("change");
+ stop_symbol = NODE_PSYMBOL("stop");
+
+ NODE_SET_PROTOTYPE_METHOD(constructor_template, "start", StatWatcher::Start);
+ NODE_SET_PROTOTYPE_METHOD(constructor_template, "stop", StatWatcher::Stop);
+
+ target->Set(String::NewSymbol("StatWatcherWatcher"), constructor_template->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_);
+ 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();
+}
+
+
+Handle<Value> StatWatcher::Start(const Arguments& args) {
+ HandleScope scope;
+
+ if (args.Length() < 1 || !args[0]->IsString()) {
+ return ThrowException(Exception::TypeError(String::New("Bad arguments")));
+ }
+
+ StatWatcher *handler = ObjectWrap::Unwrap<StatWatcher>(args.Holder());
+ String::Utf8Value path(args[0]->ToString());
+
+ assert(handler->path_ == NULL);
+ handler->path_ = strdup(*path);
+
+ 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);
+ }
+
+ handler->Ref();
+
+ 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();
+ return Undefined();
+}
+
+
+void StatWatcher::Stop () {
+ if (watcher_.active) {
+ if (!persistent_) ev_ref(EV_DEFAULT_UC);
+ ev_stat_stop(EV_DEFAULT_UC_ &watcher_);
+ free(path_);
+ path_ = NULL;
+ Unref();
+ }
+}
+
+
+} // namespace node