From 0a3fc1d9c8becc32c63ae736ca2b3719a3d03c5b Mon Sep 17 00:00:00 2001 From: Ryan Dahl Date: Tue, 19 Jul 2011 01:23:50 -0700 Subject: [PATCH] Remove StatWatcher's dep on C++ EventEmitter --- lib/fs.js | 29 ++++++++++++++++++++++++++++- src/node_stat_watcher.cc | 11 ++--------- src/node_stat_watcher.h | 4 ++-- 3 files changed, 32 insertions(+), 12 deletions(-) diff --git a/lib/fs.js b/lib/fs.js index d7961ec2d6..29e1a3d2b1 100644 --- a/lib/fs.js +++ b/lib/fs.js @@ -25,6 +25,7 @@ var binding = process.binding('fs'); var constants = process.binding('constants'); var fs = exports; var Stream = require('stream').Stream; +var EventEmitter = require('events').EventEmitter; var kMinPoolSpace = 128; var kPoolSize = 40 * 1024; @@ -587,8 +588,34 @@ fs.writeFileSync = function(path, data, encoding) { // Stat Change Watchers +function StatWatcher() { + var self = this; + this._handle = new binding.StatWatcher(); + + this._handle.onchange = function(current, previous) { + self.emit('change', current, previous); + }; + + this._handle.onstop = function() { + self.emit('stop'); + }; +} +util.inherits(StatWatcher, EventEmitter); + + +StatWatcher.prototype.start = function(filename, persistent, interval) { + this._handle.start(filename, persistent, interval); +}; + + +StatWatcher.prototype.stop = function() { + this._handle.stop(); +}; + + var statWatchers = {}; + fs.watchFile = function(filename) { var stat; var options; @@ -608,7 +635,7 @@ fs.watchFile = function(filename) { if (statWatchers[filename]) { stat = statWatchers[filename]; } else { - statWatchers[filename] = new binding.StatWatcher(); + statWatchers[filename] = new StatWatcher(); stat = statWatchers[filename]; stat.start(filename, options.persistent, options.interval); } diff --git a/src/node_stat_watcher.cc b/src/node_stat_watcher.cc index 340f387354..fd4d68a5cc 100644 --- a/src/node_stat_watcher.cc +++ b/src/node_stat_watcher.cc @@ -31,21 +31,14 @@ using namespace v8; Persistent StatWatcher::constructor_template; -static Persistent change_symbol; -static Persistent stop_symbol; - void StatWatcher::Initialize(Handle target) { HandleScope scope; Local t = FunctionTemplate::New(StatWatcher::New); constructor_template = Persistent::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"); - NODE_SET_PROTOTYPE_METHOD(constructor_template, "start", StatWatcher::Start); NODE_SET_PROTOTYPE_METHOD(constructor_template, "stop", StatWatcher::Stop); @@ -61,7 +54,7 @@ void StatWatcher::Callback(EV_P_ ev_stat *watcher, int revents) { Handle argv[2]; argv[0] = Handle(BuildStatsObject(&watcher->attr)); argv[1] = Handle(BuildStatsObject(&watcher->prev)); - handler->Emit(change_symbol, 2, argv); + MakeCallback(handler->handle_, "onchange", 2, argv); } @@ -113,7 +106,7 @@ Handle StatWatcher::Start(const Arguments& args) { Handle StatWatcher::Stop(const Arguments& args) { HandleScope scope; StatWatcher *handler = ObjectWrap::Unwrap(args.Holder()); - handler->Emit(stop_symbol, 0, NULL); + MakeCallback(handler->handle_, "onstop", 0, NULL); handler->Stop(); return Undefined(); } diff --git a/src/node_stat_watcher.h b/src/node_stat_watcher.h index af02f0b06b..f88caef18b 100644 --- a/src/node_stat_watcher.h +++ b/src/node_stat_watcher.h @@ -28,14 +28,14 @@ namespace node { -class StatWatcher : EventEmitter { +class StatWatcher : ObjectWrap { public: static void Initialize(v8::Handle target); protected: static v8::Persistent constructor_template; - StatWatcher() : EventEmitter() { + StatWatcher() : ObjectWrap() { persistent_ = false; path_ = NULL; ev_init(&watcher_, StatWatcher::Callback);