Skip to content

Commit d1f7ffa

Browse files
committed
SignalHanlder now uses EventSource too
1 parent 137c0e0 commit d1f7ffa

File tree

3 files changed

+28
-48
lines changed

3 files changed

+28
-48
lines changed

src/node.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -546,7 +546,8 @@ var events = module.requireNative('events');
546546
if (isSignal(type)) {
547547
if (!signalWatchers.hasOwnProperty(type)) {
548548
var b = process.binding('signal_watcher'),
549-
w = new b.SignalWatcher(process[type]);
549+
w = new b.SignalWatcher();
550+
w.set(process[type]);
550551
w.callback = function () {
551552
process.emit(type);
552553
}

src/node_signal_watcher.cc

Lines changed: 21 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -6,95 +6,76 @@ namespace node {
66

77
using namespace v8;
88

9-
Persistent<FunctionTemplate> SignalWatcher::constructor_template;
10-
static Persistent<String> callback_symbol;
119

1210
void SignalWatcher::Initialize(Handle<Object> target) {
1311
HandleScope scope;
1412

15-
Local<FunctionTemplate> t = FunctionTemplate::New(SignalWatcher::New);
16-
constructor_template = Persistent<FunctionTemplate>::New(t);
17-
constructor_template->InstanceTemplate()->SetInternalFieldCount(1);
18-
constructor_template->SetClassName(String::NewSymbol("SignalWatcher"));
13+
Local<FunctionTemplate> t = BuildTemplate<SignalWatcher>("SignalWatcher");
1914

20-
NODE_SET_PROTOTYPE_METHOD(constructor_template, "start", SignalWatcher::Start);
21-
NODE_SET_PROTOTYPE_METHOD(constructor_template, "stop", SignalWatcher::Stop);
15+
NODE_SET_PROTOTYPE_METHOD(t, "start", Start);
16+
NODE_SET_PROTOTYPE_METHOD(t, "stop", Stop);
17+
NODE_SET_PROTOTYPE_METHOD(t, "set", Set);
2218

23-
target->Set(String::NewSymbol("SignalWatcher"),
24-
constructor_template->GetFunction());
25-
26-
callback_symbol = NODE_PSYMBOL("callback");
19+
target->Set(String::NewSymbol("SignalWatcher"), t->GetFunction());
2720
}
2821

22+
2923
void SignalWatcher::Callback(EV_P_ ev_signal *watcher, int revents) {
3024
SignalWatcher *w = static_cast<SignalWatcher*>(watcher->data);
31-
3225
assert(watcher == &w->watcher_);
33-
34-
HandleScope scope;
35-
36-
Local<Value> callback_v = w->handle_->Get(callback_symbol);
37-
if (!callback_v->IsFunction()) {
38-
w->Stop();
39-
return;
40-
}
41-
42-
Local<Function> callback = Local<Function>::Cast(callback_v);
43-
44-
TryCatch try_catch;
45-
46-
callback->Call(w->handle_, 0, NULL);
47-
48-
if (try_catch.HasCaught()) {
49-
FatalException(try_catch);
50-
}
26+
w->MakeCallback(0, NULL);
5127
}
5228

53-
Handle<Value> SignalWatcher::New(const Arguments& args) {
29+
30+
Handle<Value> SignalWatcher::Set(const Arguments& args) {
5431
HandleScope scope;
32+
SignalWatcher *w = ObjectWrap::Unwrap<SignalWatcher>(args.Holder());
5533

5634
if (args.Length() != 1 || !args[0]->IsInt32()) {
5735
return ThrowException(String::New("Bad arguments"));
5836
}
5937

6038
int sig = args[0]->Int32Value();
6139

62-
SignalWatcher *w = new SignalWatcher(sig);
63-
w->Wrap(args.Holder());
64-
65-
return args.This();
40+
ev_signal_set(&w->watcher_, sig);
41+
return Undefined();
6642
}
6743

44+
6845
Handle<Value> SignalWatcher::Start(const Arguments& args) {
6946
HandleScope scope;
7047
SignalWatcher *w = ObjectWrap::Unwrap<SignalWatcher>(args.Holder());
7148
w->Start();
7249
return Undefined();
7350
}
7451

52+
7553
void SignalWatcher::Start () {
76-
if (!watcher_.active) {
54+
if (!ev_is_active(&watcher_)) {
7755
ev_signal_start(EV_DEFAULT_UC_ &watcher_);
7856
ev_unref(EV_DEFAULT_UC);
79-
Ref();
57+
Active();
8058
}
8159
}
8260

61+
8362
Handle<Value> SignalWatcher::Stop(const Arguments& args) {
8463
HandleScope scope;
8564
SignalWatcher *w = ObjectWrap::Unwrap<SignalWatcher>(args.Holder());
8665
w->Stop();
8766
return Undefined();
8867
}
8968

69+
9070
void SignalWatcher::Stop () {
91-
if (watcher_.active) {
71+
if (ev_is_active(&watcher_)) {
9272
ev_ref(EV_DEFAULT_UC);
9373
ev_signal_stop(EV_DEFAULT_UC_ &watcher_);
94-
Unref();
74+
Inactive();
9575
}
9676
}
9777

78+
9879
} // namespace node
9980

10081
NODE_MODULE(node_signal_watcher, node::SignalWatcher::Initialize);

src/node_signal_watcher.h

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -10,25 +10,23 @@
1010

1111
namespace node {
1212

13-
class SignalWatcher : ObjectWrap {
13+
class SignalWatcher : public EventSource {
1414
public:
1515
static void Initialize(v8::Handle<v8::Object> target);
1616

17-
protected:
18-
static v8::Persistent<v8::FunctionTemplate> constructor_template;
19-
20-
SignalWatcher(int sig) : ObjectWrap() {
21-
ev_signal_init(&watcher_, SignalWatcher::Callback, sig);
17+
SignalWatcher() : EventSource() {
18+
ev_signal_init(&watcher_, SignalWatcher::Callback, SIGINT);
2219
watcher_.data = this;
2320
}
2421

2522
~SignalWatcher() {
2623
ev_signal_stop(EV_DEFAULT_UC_ &watcher_);
2724
}
2825

29-
static v8::Handle<v8::Value> New(const v8::Arguments& args);
26+
protected:
3027
static v8::Handle<v8::Value> Start(const v8::Arguments& args);
3128
static v8::Handle<v8::Value> Stop(const v8::Arguments& args);
29+
static v8::Handle<v8::Value> Set(const v8::Arguments& args);
3230

3331
private:
3432
static void Callback(EV_P_ ev_signal *watcher, int revents);

0 commit comments

Comments
 (0)