Changeset 591
- Timestamp:
- 11/27/07 02:27:32 (1 year ago)
- Files:
-
- version_0/ext/cmain.cpp (modified) (1 diff)
- version_0/ext/ed.h (modified) (3 diffs)
- version_0/ext/eventmachine.h (modified) (1 diff)
- version_0/ext/pipe.cpp (modified) (3 diffs)
- version_0/ext/rubymain.cpp (modified) (2 diffs)
- version_0/lib/eventmachine.rb (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
version_0/ext/cmain.cpp
r580 r591 271 271 if (ed) { 272 272 return ed->GetSubprocessPid (pid) ? 1 : 0; 273 } 274 else 275 return 0; 276 } 277 278 /************************** 279 evma_get_subprocess_status 280 **************************/ 281 282 extern "C" int evma_get_subprocess_status (const char *binding, int *status) 283 { 284 if (!EventMachine) 285 throw std::runtime_error ("not initialized"); 286 EventableDescriptor *ed = dynamic_cast <EventableDescriptor*> (Bindable_t::GetObject (binding)); 287 if (ed) { 288 return ed->GetSubprocessStatus (status) ? 1 : 0; 273 289 } 274 290 else version_0/ext/ed.h
r569 r591 64 64 virtual bool GetPeername (struct sockaddr*) {return false;} 65 65 virtual bool GetSubprocessPid (pid_t*) {return false;} 66 virtual bool GetSubprocessStatus (int*) {return false;} 66 67 67 68 virtual void StartTls() {} … … 290 291 291 292 virtual bool GetSubprocessPid (pid_t*); 293 virtual bool GetSubprocessStatus (int*); 292 294 293 295 protected: … … 309 311 310 312 pid_t SubprocessPid; 313 int SubprocessStatus; 311 314 312 315 private: version_0/ext/eventmachine.h
r580 r591 49 49 int evma_get_peername (const char *binding, struct sockaddr*); 50 50 int evma_get_subprocess_pid (const char *binding, pid_t*); 51 int evma_get_subprocess_status (const char *binding, int*); 51 52 int evma_send_data_to_connection (const char *binding, const char *data, int data_length); 52 53 int evma_send_datagram (const char *binding, const char *data, int data_length, const char *address, int port); version_0/ext/pipe.cpp
r501 r591 34 34 InactivityTimeout (0), 35 35 OutboundDataSize (0), 36 SubprocessPid (subpid) 36 SubprocessPid (subpid), 37 SubprocessStatus (0) 37 38 { 38 39 #ifdef HAVE_EPOLL … … 77 78 kill (SubprocessPid, SIGTERM); 78 79 nanosleep (&req, NULL); 79 if (waitpid (SubprocessPid, NULL, WNOHANG) == 0) {80 if (waitpid (SubprocessPid, &SubprocessStatus, WNOHANG) == 0) { 80 81 kill (SubprocessPid, SIGKILL); 81 82 nanosleep (&req, NULL); 82 if (waitpid (SubprocessPid, NULL, WNOHANG) == 0)83 if (waitpid (SubprocessPid, &SubprocessStatus, WNOHANG) == 0) 83 84 throw std::runtime_error ("unable to reap subprocess"); 84 85 } … … 303 304 } 304 305 306 /*********************************** 307 PipeDescriptor::GetSubprocessStatus 308 ***********************************/ 309 310 bool PipeDescriptor::GetSubprocessStatus (int *status) 311 { 312 bool ok = false; 313 if (status) { 314 *status = SubprocessStatus; 315 ok = true; 316 } 317 return ok; 318 } 319 305 320 #endif // OS_UNIX 306 321 version_0/ext/rubymain.cpp
r580 r591 177 177 if (evma_get_subprocess_pid (StringValuePtr (signature), &pid)) { 178 178 return INT2NUM (pid); 179 } 180 181 return Qnil; 182 } 183 184 /*********************** 185 t_get_subprocess_status 186 ***********************/ 187 188 static VALUE t_get_subprocess_status (VALUE self, VALUE signature) 189 { 190 int status; 191 if (evma_get_subprocess_status (StringValuePtr (signature), &status)) { 192 return INT2NUM (status); 179 193 } 180 194 … … 526 540 rb_define_module_function (EmModule, "get_peername", (VALUE(*)(...))t_get_peername, 1); 527 541 rb_define_module_function (EmModule, "get_subprocess_pid", (VALUE(*)(...))t_get_subprocess_pid, 1); 542 rb_define_module_function (EmModule, "get_subprocess_status", (VALUE(*)(...))t_get_subprocess_status, 1); 528 543 rb_define_module_function (EmModule, "get_comm_inactivity_timeout", (VALUE(*)(...))t_get_comm_inactivity_timeout, 1); 529 544 rb_define_module_function (EmModule, "set_comm_inactivity_timeout", (VALUE(*)(...))t_set_comm_inactivity_timeout, 2); version_0/lib/eventmachine.rb
r585 r591 1430 1430 end 1431 1431 1432 # Returns a subprocess exit status. Only useful for #popen. Call it in your 1433 # #unbind handler. 1434 # 1435 def get_status 1436 EventMachine::get_subprocess_status @signature 1437 end 1438 1432 1439 # comm_inactivity_timeout returns the current value (in seconds) of the inactivity-timeout 1433 1440 # property of network-connection and datagram-socket objects. A nonzero value