| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [Original HTTPS Page] |
1 parent 9599607 commit 5014802
3 files changed
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -74,9 +74,10 @@ process.addListener("newListener", function (event) { | |||
| 74 | 74 | if (isSignal(event) && process.listeners(event).length === 0) { | |
| 75 | 75 | var b = process.binding('signal_watcher'); | |
| 76 | 76 | var w = new b.SignalWatcher(process[event]); | |
| 77 | - w.addListener("signal", function () { | ||
| 77 | + w.callback = function () { | ||
| 78 | 78 | process.emit(event); | |
| 79 | - }); | ||
| 79 | + }; | ||
| 80 | + w.start(); | ||
| 80 | 81 | } | |
| 81 | 82 | }); | |
| 82 | 83 | ||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -7,38 +7,46 @@ namespace node { | |||
| 7 | 7 | using namespace v8; | |
| 8 | 8 | ||
| 9 | 9 | Persistent<FunctionTemplate> SignalWatcher::constructor_template; | |
| 10 | - static Persistent<String> signal_symbol; | ||
| 10 | + static Persistent<String> callback_symbol; | ||
| 11 | 11 | ||
| 12 | 12 | void SignalWatcher::Initialize(Handle<Object> target) { | |
| 13 | 13 | HandleScope scope; | |
| 14 | 14 | ||
| 15 | 15 | Local<FunctionTemplate> t = FunctionTemplate::New(SignalWatcher::New); | |
| 16 | 16 | constructor_template = Persistent<FunctionTemplate>::New(t); | |
| 17 | - constructor_template->Inherit(EventEmitter::constructor_template); | ||
| 18 | 17 | constructor_template->InstanceTemplate()->SetInternalFieldCount(1); | |
| 19 | 18 | constructor_template->SetClassName(String::NewSymbol("SignalWatcher")); | |
| 20 | 19 | ||
| 20 | + NODE_SET_PROTOTYPE_METHOD(constructor_template, "start", SignalWatcher::Start); | ||
| 21 | 21 | NODE_SET_PROTOTYPE_METHOD(constructor_template, "stop", SignalWatcher::Stop); | |
| 22 | 22 | ||
| 23 | - signal_symbol = NODE_PSYMBOL("signal"); | ||
| 24 | - | ||
| 25 | 23 | target->Set(String::NewSymbol("SignalWatcher"), | |
| 26 | 24 | constructor_template->GetFunction()); | |
| 25 | + | ||
| 26 | + callback_symbol = NODE_PSYMBOL("callback"); | ||
| 27 | 27 | } | |
| 28 | 28 | ||
| 29 | - void SignalWatcher::OnSignal(EV_P_ ev_signal *watcher, int revents) { | ||
| 29 | + void SignalWatcher::Callback(EV_P_ ev_signal *watcher, int revents) { | ||
| 30 | 30 | SignalWatcher *w = static_cast<SignalWatcher*>(watcher->data); | |
| 31 | + | ||
| 32 | + assert(watcher == &w->watcher_); | ||
| 33 | + | ||
| 31 | 34 | HandleScope scope; | |
| 32 | 35 | ||
| 33 | - assert(revents == EV_SIGNAL); | ||
| 36 | + Local<Value> callback_v = w->handle_->Get(callback_symbol); | ||
| 37 | + if (!callback_v->IsFunction()) { | ||
| 38 | + w->Stop(); | ||
| 39 | + return; | ||
| 40 | + } | ||
| 34 | 41 | ||
| 35 | - w->Emit(signal_symbol, 0, NULL); | ||
| 36 | - } | ||
| 42 | + Local<Function> callback = Local<Function>::Cast(callback_v); | ||
| 37 | 43 | ||
| 38 | - SignalWatcher::~SignalWatcher() { | ||
| 39 | - if (watcher_.active) { | ||
| 40 | - ev_ref(EV_DEFAULT_UC); | ||
| 41 | - ev_signal_stop(EV_DEFAULT_UC_ &watcher_); | ||
| 44 | + TryCatch try_catch; | ||
| 45 | + | ||
| 46 | + callback->Call(w->handle_, 0, NULL); | ||
| 47 | + | ||
| 48 | + if (try_catch.HasCaught()) { | ||
| 49 | + FatalException(try_catch); | ||
| 42 | 50 | } | |
| 43 | 51 | } | |
| 44 | 52 | ||
@@ -51,30 +59,40 @@ Handle<Value> SignalWatcher::New(const Arguments& args) { | |||
| 51 | 59 | ||
| 52 | 60 | int sig = args[0]->Int32Value(); | |
| 53 | 61 | ||
| 54 | - SignalWatcher *w = new SignalWatcher(); | ||
| 62 | + SignalWatcher *w = new SignalWatcher(sig); | ||
| 55 | 63 | w->Wrap(args.Holder()); | |
| 56 | 64 | ||
| 57 | - ev_signal_init(&w->watcher_, SignalWatcher::OnSignal, sig); | ||
| 58 | - w->watcher_.data = w; | ||
| 59 | - // Give signal handlers very high priority. The only thing that has higher | ||
| 60 | - // priority is the garbage collector check. | ||
| 61 | - ev_set_priority(&w->watcher_, EV_MAXPRI-1); | ||
| 62 | - ev_signal_start(EV_DEFAULT_UC_ &w->watcher_); | ||
| 63 | - ev_unref(EV_DEFAULT_UC); | ||
| 65 | + return args.This(); | ||
| 66 | + } | ||
| 64 | 67 | ||
| 65 | - w->Ref(); | ||
| 68 | + Handle<Value> SignalWatcher::Start(const Arguments& args) { | ||
| 69 | + HandleScope scope; | ||
| 70 | + SignalWatcher *w = ObjectWrap::Unwrap<SignalWatcher>(args.Holder()); | ||
| 71 | + w->Start(); | ||
| 72 | + return Undefined(); | ||
| 73 | + } | ||
| 66 | 74 | ||
| 67 | - return args.This(); | ||
| 75 | + void SignalWatcher::Start () { | ||
| 76 | + if (!watcher_.active) { | ||
| 77 | + ev_signal_start(EV_DEFAULT_UC_ &watcher_); | ||
| 78 | + ev_unref(EV_DEFAULT_UC); | ||
| 79 | + Ref(); | ||
| 80 | + } | ||
| 68 | 81 | } | |
| 69 | 82 | ||
| 70 | 83 | Handle<Value> SignalWatcher::Stop(const Arguments& args) { | |
| 71 | 84 | HandleScope scope; | |
| 72 | - | ||
| 73 | 85 | SignalWatcher *w = ObjectWrap::Unwrap<SignalWatcher>(args.Holder()); | |
| 74 | - ev_ref(EV_DEFAULT_UC); | ||
| 75 | - ev_signal_stop(EV_DEFAULT_UC_ &w->watcher_); | ||
| 76 | - w->Unref(); | ||
| 86 | + w->Stop(); | ||
| 77 | 87 | return Undefined(); | |
| 78 | 88 | } | |
| 79 | 89 | ||
| 90 | + void SignalWatcher::Stop () { | ||
| 91 | + if (watcher_.active) { | ||
| 92 | + ev_ref(EV_DEFAULT_UC); | ||
| 93 | + ev_signal_stop(EV_DEFAULT_UC_ &watcher_); | ||
| 94 | + Unref(); | ||
| 95 | + } | ||
| 96 | + } | ||
| 97 | + | ||
| 80 | 98 | } // namespace node | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -10,21 +10,32 @@ | |||
| 10 | 10 | ||
| 11 | 11 | namespace node { | |
| 12 | 12 | ||
| 13 | - class SignalWatcher : EventEmitter { | ||
| 13 | + class SignalWatcher : ObjectWrap { | ||
| 14 | 14 | public: | |
| 15 | 15 | static void Initialize(v8::Handle<v8::Object> target); | |
| 16 | 16 | ||
| 17 | 17 | protected: | |
| 18 | 18 | static v8::Persistent<v8::FunctionTemplate> constructor_template; | |
| 19 | 19 | ||
| 20 | - SignalWatcher() : EventEmitter() { } | ||
| 21 | - ~SignalWatcher(); | ||
| 20 | + SignalWatcher(int sig) : ObjectWrap() { | ||
| 21 | + ev_signal_init(&watcher_, SignalWatcher::Callback, sig); | ||
| 22 | + watcher_.data = this; | ||
| 23 | + } | ||
| 24 | + | ||
| 25 | + ~SignalWatcher() { | ||
| 26 | + ev_signal_stop(EV_DEFAULT_UC_ &watcher_); | ||
| 27 | + } | ||
| 22 | 28 | ||
| 23 | 29 | static v8::Handle<v8::Value> New(const v8::Arguments& args); | |
| 30 | + static v8::Handle<v8::Value> Start(const v8::Arguments& args); | ||
| 24 | 31 | static v8::Handle<v8::Value> Stop(const v8::Arguments& args); | |
| 25 | 32 | ||
| 26 | 33 | private: | |
| 27 | - static void OnSignal(EV_P_ ev_signal *watcher, int revents); | ||
| 34 | + static void Callback(EV_P_ ev_signal *watcher, int revents); | ||
| 35 | + | ||
| 36 | + void Start(); | ||
| 37 | + void Stop(); | ||
| 38 | + | ||
| 28 | 39 | ev_signal watcher_; | |
| 29 | 40 | }; | |
| 30 | 41 | ||
| Back | FazBrowse Home | New Git URL |
0 commit comments