Browse Source

Remove StatWatcher's dep on C++ EventEmitter

v0.7.4-release
Ryan Dahl 14 years ago
parent
commit
0a3fc1d9c8
  1. 29
      lib/fs.js
  2. 11
      src/node_stat_watcher.cc
  3. 4
      src/node_stat_watcher.h

29
lib/fs.js

@ -25,6 +25,7 @@ var binding = process.binding('fs');
var constants = process.binding('constants'); var constants = process.binding('constants');
var fs = exports; var fs = exports;
var Stream = require('stream').Stream; var Stream = require('stream').Stream;
var EventEmitter = require('events').EventEmitter;
var kMinPoolSpace = 128; var kMinPoolSpace = 128;
var kPoolSize = 40 * 1024; var kPoolSize = 40 * 1024;
@ -587,8 +588,34 @@ fs.writeFileSync = function(path, data, encoding) {
// Stat Change Watchers // 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 = {}; var statWatchers = {};
fs.watchFile = function(filename) { fs.watchFile = function(filename) {
var stat; var stat;
var options; var options;
@ -608,7 +635,7 @@ fs.watchFile = function(filename) {
if (statWatchers[filename]) { if (statWatchers[filename]) {
stat = statWatchers[filename]; stat = statWatchers[filename];
} else { } else {
statWatchers[filename] = new binding.StatWatcher(); statWatchers[filename] = new StatWatcher();
stat = statWatchers[filename]; stat = statWatchers[filename];
stat.start(filename, options.persistent, options.interval); stat.start(filename, options.persistent, options.interval);
} }

11
src/node_stat_watcher.cc

@ -31,21 +31,14 @@ using namespace v8;
Persistent<FunctionTemplate> StatWatcher::constructor_template; Persistent<FunctionTemplate> StatWatcher::constructor_template;
static Persistent<String> change_symbol;
static Persistent<String> stop_symbol;
void StatWatcher::Initialize(Handle<Object> target) { void StatWatcher::Initialize(Handle<Object> target) {
HandleScope scope; HandleScope scope;
Local<FunctionTemplate> t = FunctionTemplate::New(StatWatcher::New); Local<FunctionTemplate> t = FunctionTemplate::New(StatWatcher::New);
constructor_template = Persistent<FunctionTemplate>::New(t); constructor_template = Persistent<FunctionTemplate>::New(t);
constructor_template->Inherit(EventEmitter::constructor_template);
constructor_template->InstanceTemplate()->SetInternalFieldCount(1); constructor_template->InstanceTemplate()->SetInternalFieldCount(1);
constructor_template->SetClassName(String::NewSymbol("StatWatcher")); 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, "start", StatWatcher::Start);
NODE_SET_PROTOTYPE_METHOD(constructor_template, "stop", StatWatcher::Stop); NODE_SET_PROTOTYPE_METHOD(constructor_template, "stop", StatWatcher::Stop);
@ -61,7 +54,7 @@ void StatWatcher::Callback(EV_P_ ev_stat *watcher, int revents) {
Handle<Value> argv[2]; Handle<Value> argv[2];
argv[0] = Handle<Value>(BuildStatsObject(&watcher->attr)); argv[0] = Handle<Value>(BuildStatsObject(&watcher->attr));
argv[1] = Handle<Value>(BuildStatsObject(&watcher->prev)); argv[1] = Handle<Value>(BuildStatsObject(&watcher->prev));
handler->Emit(change_symbol, 2, argv); MakeCallback(handler->handle_, "onchange", 2, argv);
} }
@ -113,7 +106,7 @@ Handle<Value> StatWatcher::Start(const Arguments& args) {
Handle<Value> StatWatcher::Stop(const Arguments& args) { Handle<Value> StatWatcher::Stop(const Arguments& args) {
HandleScope scope; HandleScope scope;
StatWatcher *handler = ObjectWrap::Unwrap<StatWatcher>(args.Holder()); StatWatcher *handler = ObjectWrap::Unwrap<StatWatcher>(args.Holder());
handler->Emit(stop_symbol, 0, NULL); MakeCallback(handler->handle_, "onstop", 0, NULL);
handler->Stop(); handler->Stop();
return Undefined(); return Undefined();
} }

4
src/node_stat_watcher.h

@ -28,14 +28,14 @@
namespace node { namespace node {
class StatWatcher : EventEmitter { class StatWatcher : ObjectWrap {
public: public:
static void Initialize(v8::Handle<v8::Object> target); static void Initialize(v8::Handle<v8::Object> target);
protected: protected:
static v8::Persistent<v8::FunctionTemplate> constructor_template; static v8::Persistent<v8::FunctionTemplate> constructor_template;
StatWatcher() : EventEmitter() { StatWatcher() : ObjectWrap() {
persistent_ = false; persistent_ = false;
path_ = NULL; path_ = NULL;
ev_init(&watcher_, StatWatcher::Callback); ev_init(&watcher_, StatWatcher::Callback);

Loading…
Cancel
Save