Browse Source

Add process.kill(sig = SIGTERM)

v0.7.4-release
Ryan 16 years ago
parent
commit
e39923a3d7
  1. 37
      src/process.cc
  2. 2
      src/process.h

37
src/process.cc

@ -29,6 +29,7 @@ Process::Initialize (Handle<Object> target)
NODE_SET_PROTOTYPE_METHOD(constructor_template, "write", Process::Write); NODE_SET_PROTOTYPE_METHOD(constructor_template, "write", Process::Write);
NODE_SET_PROTOTYPE_METHOD(constructor_template, "close", Process::Close); NODE_SET_PROTOTYPE_METHOD(constructor_template, "close", Process::Close);
NODE_SET_PROTOTYPE_METHOD(constructor_template, "kill", Process::Kill);
constructor_template->PrototypeTemplate()->SetAccessor(PID_SYMBOL, constructor_template->PrototypeTemplate()->SetAccessor(PID_SYMBOL,
PIDGetter); PIDGetter);
@ -101,13 +102,6 @@ Process::Write (const Arguments& args)
Process *process = NODE_UNWRAP(Process, args.Holder()); Process *process = NODE_UNWRAP(Process, args.Holder());
assert(process); assert(process);
#if 0
if ( connection->ReadyState() != OPEN
&& connection->ReadyState() != WRITE_ONLY
)
return ThrowException(String::New("Socket is not open for writing"));
#endif
// XXX // XXX
// A lot of improvement can be made here. First of all we're allocating // A lot of improvement can be made here. First of all we're allocating
// oi_bufs for every send which is clearly inefficent - it should use a // oi_bufs for every send which is clearly inefficent - it should use a
@ -156,6 +150,23 @@ Process::Write (const Arguments& args)
return Undefined(); return Undefined();
} }
Handle<Value>
Process::Kill (const Arguments& args)
{
HandleScope scope;
Process *process = NODE_UNWRAP(Process, args.Holder());
assert(process);
int sig = SIGTERM;
if (args[0]->IsInt32()) sig = args[0]->Int32Value();
if (process->Kill(sig) != 0) {
return ThrowException(String::New("Process already dead"));
}
return Undefined();
}
Handle<Value> Handle<Value>
Process::Close (const Arguments& args) Process::Close (const Arguments& args)
{ {
@ -451,8 +462,7 @@ Process::OnExit (EV_P_ ev_child *watcher, int revents)
int int
Process::Write (oi_buf *buf) Process::Write (oi_buf *buf)
{ {
if (stdin_pipe_[1] < 0 || got_close_) if (stdin_pipe_[1] < 0 || got_close_) return -1;
return -1;
oi_queue_insert_head(&out_stream_, &buf->queue); oi_queue_insert_head(&out_stream_, &buf->queue);
buf->written = 0; buf->written = 0;
ev_io_start(EV_DEFAULT_UC_ &stdin_watcher_); ev_io_start(EV_DEFAULT_UC_ &stdin_watcher_);
@ -462,10 +472,15 @@ Process::Write (oi_buf *buf)
int int
Process::Close () Process::Close ()
{ {
if (stdin_pipe_[1] < 0 || got_close_) if (stdin_pipe_[1] < 0 || got_close_) return -1;
return -1;
got_close_ = true; got_close_ = true;
ev_io_start(EV_DEFAULT_UC_ &stdin_watcher_); ev_io_start(EV_DEFAULT_UC_ &stdin_watcher_);
return 0; return 0;
} }
int
Process::Kill (int sig)
{
if (pid_ == 0) return -1;
return kill(pid_, sig);
}

2
src/process.h

@ -18,6 +18,7 @@ class Process : ObjectWrap {
static v8::Handle<v8::Value> New (const v8::Arguments& args); static v8::Handle<v8::Value> New (const v8::Arguments& args);
static v8::Handle<v8::Value> Write (const v8::Arguments& args); static v8::Handle<v8::Value> Write (const v8::Arguments& args);
static v8::Handle<v8::Value> Close (const v8::Arguments& args); static v8::Handle<v8::Value> Close (const v8::Arguments& args);
static v8::Handle<v8::Value> Kill (const v8::Arguments& args);
static v8::Handle<v8::Value> PIDGetter (v8::Local<v8::String> _, const v8::AccessorInfo& info); static v8::Handle<v8::Value> PIDGetter (v8::Local<v8::String> _, const v8::AccessorInfo& info);
Process(v8::Handle<v8::Object> handle); Process(v8::Handle<v8::Object> handle);
@ -27,6 +28,7 @@ class Process : ObjectWrap {
int Spawn (const char *command); int Spawn (const char *command);
int Write (oi_buf *buf); int Write (oi_buf *buf);
int Close (); int Close ();
int Kill (int sig);
private: private:
static void OnOutput (EV_P_ ev_io *watcher, int revents); static void OnOutput (EV_P_ ev_io *watcher, int revents);

Loading…
Cancel
Save