From 2fd4958698b6efa8b2f924ed28d3520806de1a38 Mon Sep 17 00:00:00 2001 From: Ryan Date: Sun, 21 Jun 2009 13:29:15 +0200 Subject: [PATCH] Add pid accessor --- src/process.cc | 30 ++++++++++++++++++++++++++---- src/process.h | 1 + 2 files changed, 27 insertions(+), 4 deletions(-) diff --git a/src/process.cc b/src/process.cc index bba44dd..1c83c53 100644 --- a/src/process.cc +++ b/src/process.cc @@ -14,6 +14,7 @@ using namespace node; #define ON_ERROR_SYMBOL String::NewSymbol("onError") #define ON_OUTPUT_SYMBOL String::NewSymbol("onOutput") #define ON_EXIT_SYMBOL String::NewSymbol("onExit") +#define PID_SYMBOL String::NewSymbol("pid") Persistent Process::constructor_template; @@ -29,6 +30,9 @@ Process::Initialize (Handle target) NODE_SET_PROTOTYPE_METHOD(constructor_template, "write", Process::Write); NODE_SET_PROTOTYPE_METHOD(constructor_template, "close", Process::Close); + constructor_template->PrototypeTemplate()->SetAccessor(PID_SYMBOL, + PIDGetter); + target->Set(String::NewSymbol("Process"), constructor_template->GetFunction()); } @@ -52,6 +56,20 @@ Process::New (const Arguments& args) return args.This(); } +Handle +Process::PIDGetter (Local _, const AccessorInfo& info) +{ + Process *process = NODE_UNWRAP(Process, info.This()); + assert(process); + + HandleScope scope; + + if (process->pid_ == 0) return Null(); + + Local pid = Integer::New(process->pid_); + return scope.Close(pid); +} + static void free_buf (oi_buf *b) { @@ -189,6 +207,14 @@ Process::~Process () void Process::Shutdown () { + // Clear the out_stream + while (!oi_queue_empty(&out_stream_)) { + oi_queue *q = oi_queue_last(&out_stream_); + oi_buf *buf = (oi_buf*) oi_queue_data(q, oi_buf, queue); + oi_queue_remove(q); + if (buf->release) buf->release(buf); + } + if (stdout_pipe_[0] >= 0) close(stdout_pipe_[0]); if (stdout_pipe_[1] >= 0) close(stdout_pipe_[1]); @@ -260,8 +286,6 @@ Process::Spawn (const char *command) return -4; case 0: // Child. - //printf("child process!\n"); - close(stdout_pipe_[0]); // close read end dup2(stdout_pipe_[1], STDOUT_FILENO); @@ -271,8 +295,6 @@ Process::Spawn (const char *command) close(stdin_pipe_[1]); // close write end dup2(stdin_pipe_[0], STDIN_FILENO); - //printf("child process!\n"); - execl("/bin/sh", "sh", "-c", command, (char *)NULL); //execl(_PATH_BSHELL, "sh", "-c", program, (char *)NULL); _exit(127); diff --git a/src/process.h b/src/process.h index faee88e..b48ba97 100644 --- a/src/process.h +++ b/src/process.h @@ -18,6 +18,7 @@ class Process : ObjectWrap { static v8::Handle New (const v8::Arguments& args); static v8::Handle Write (const v8::Arguments& args); static v8::Handle Close (const v8::Arguments& args); + static v8::Handle PIDGetter (v8::Local _, const v8::AccessorInfo& info); Process(v8::Handle handle); ~Process(); -- 2.7.4