Changeset 591

Show
Ignore:
Timestamp:
11/27/07 02:27:32 (1 year ago)
Author:
blackhedd
Message:

added visibility to subprocess status for popen

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • version_0/ext/cmain.cpp

    r580 r591  
    271271        if (ed) { 
    272272                return ed->GetSubprocessPid (pid) ? 1 : 0; 
     273        } 
     274        else 
     275                return 0; 
     276} 
     277 
     278/************************** 
     279evma_get_subprocess_status 
     280**************************/ 
     281 
     282extern "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; 
    273289        } 
    274290        else 
  • version_0/ext/ed.h

    r569 r591  
    6464                virtual bool GetPeername (struct sockaddr*) {return false;} 
    6565                virtual bool GetSubprocessPid (pid_t*) {return false;} 
     66                virtual bool GetSubprocessStatus (int*) {return false;} 
    6667 
    6768                virtual void StartTls() {} 
     
    290291 
    291292                virtual bool GetSubprocessPid (pid_t*); 
     293                virtual bool GetSubprocessStatus (int*); 
    292294 
    293295        protected: 
     
    309311 
    310312                pid_t SubprocessPid; 
     313                int SubprocessStatus; 
    311314 
    312315        private: 
  • version_0/ext/eventmachine.h

    r580 r591  
    4949        int evma_get_peername (const char *binding, struct sockaddr*); 
    5050        int evma_get_subprocess_pid (const char *binding, pid_t*); 
     51        int evma_get_subprocess_status (const char *binding, int*); 
    5152        int evma_send_data_to_connection (const char *binding, const char *data, int data_length); 
    5253        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  
    3434        InactivityTimeout (0), 
    3535        OutboundDataSize (0), 
    36         SubprocessPid (subpid) 
     36        SubprocessPid (subpid), 
     37        SubprocessStatus (0) 
    3738{ 
    3839        #ifdef HAVE_EPOLL 
     
    7778        kill (SubprocessPid, SIGTERM); 
    7879        nanosleep (&req, NULL); 
    79         if (waitpid (SubprocessPid, NULL, WNOHANG) == 0) { 
     80        if (waitpid (SubprocessPid, &SubprocessStatus, WNOHANG) == 0) { 
    8081                kill (SubprocessPid, SIGKILL); 
    8182                nanosleep (&req, NULL); 
    82                 if (waitpid (SubprocessPid, NULL, WNOHANG) == 0) 
     83                if (waitpid (SubprocessPid, &SubprocessStatus, WNOHANG) == 0) 
    8384                        throw std::runtime_error ("unable to reap subprocess"); 
    8485        } 
     
    303304} 
    304305 
     306/*********************************** 
     307PipeDescriptor::GetSubprocessStatus 
     308***********************************/ 
     309 
     310bool PipeDescriptor::GetSubprocessStatus (int *status) 
     311{ 
     312        bool ok = false; 
     313        if (status) { 
     314                *status = SubprocessStatus; 
     315                ok = true; 
     316        } 
     317        return ok; 
     318} 
     319 
    305320#endif // OS_UNIX 
    306321 
  • version_0/ext/rubymain.cpp

    r580 r591  
    177177        if (evma_get_subprocess_pid (StringValuePtr (signature), &pid)) { 
    178178                return INT2NUM (pid); 
     179        } 
     180 
     181        return Qnil; 
     182} 
     183 
     184/*********************** 
     185t_get_subprocess_status 
     186***********************/ 
     187 
     188static 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); 
    179193        } 
    180194 
     
    526540        rb_define_module_function (EmModule, "get_peername", (VALUE(*)(...))t_get_peername, 1); 
    527541        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); 
    528543        rb_define_module_function (EmModule, "get_comm_inactivity_timeout", (VALUE(*)(...))t_get_comm_inactivity_timeout, 1); 
    529544        rb_define_module_function (EmModule, "set_comm_inactivity_timeout", (VALUE(*)(...))t_set_comm_inactivity_timeout, 2); 
  • version_0/lib/eventmachine.rb

    r585 r591  
    14301430        end 
    14311431 
     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 
    14321439        # comm_inactivity_timeout returns the current value (in seconds) of the inactivity-timeout 
    14331440        # property of network-connection and datagram-socket objects. A nonzero value