Duma and libev, cont'd....and a leak found

Michael Leib michael.leib at hypermediasystems.com
Thu Jun 19 23:13:24 CEST 2008


Well, right idea, wrong code...here is an obvious correction.

void                                         
ev_default_destroy (void)                    
{                                            
#if EV_MULTIPLICITY                          
  struct ev_loop *loop = ev_default_loop_ptr;
#endif                                       
                                             
#ifndef _WIN32                               
  int signum;                                
                                             
  ev_ref (EV_A); /* child watcher */         
  for (signum = signalmax; signum--; ) {     
    if ( signals [signum].head )             
      signal (signum + 1, SIG_DFL);          
  }                                          
  ev_free (signals); signalmax = 0;          
#endif                                       
                                             
  loop_destroy (EV_A);                       
}                                            

Thanks,

Michael
  ----- Original Message ----- 
  From: Michael Leib 
  To: libev at lists.schmorp.de 
  Cc: Weslee External ; Kihong Lee ; John thompson 
  Sent: Thursday, June 19, 2008 1:22 PM
  Subject: Duma and libev, cont'd....and a leak found


  Hello..

  I appreciate the response I received to my previous request of help with the integration of duma into libev. I have 
  resolved that issue which was, glady, my own. Albiet embarrassed, it appears it was worth the effort to get this 
  working as I have found what I belive is a memory leak in libev when dealing with signals and the deafult loop.

  Since the default loop has 1 signal set by default (childev), even if the signal api's are not used (ev_siginal_init(), etc)
  by the binding application, it would still have this issue for anyone who uses the library.

  The "signals" array is never freed, with particular attention to the ev_default_destroy() function. 
  Rather than going into a bunch of details, the code pretty much speaks for itself as to what is the perceived problem
  which is/are:

  1) The "signals" array is never freed
  2) Pending signal events are not restored to to system default handling when the default loop is destroyed.

  What is:

  void
  ev_default_destroy (void)
  {
  #if EV_MULTIPLICITY
    struct ev_loop *loop = ev_default_loop_ptr;
  #endif

  #ifndef _WIN32
    ev_ref (EV_A); /* child watcher */
    ev_signal_stop (EV_A_ &childev);
  #endif

    loop_destroy (EV_A);
  }
                      
  Has been changed in my version to:

  void                                         
  ev_default_destroy (void)                    
  {                                            
  #if EV_MULTIPLICITY                          
    struct ev_loop *loop = ev_default_loop_ptr;
  #endif                                       
                                               
  #ifndef _WIN32                               
    int signum;                                
                                               
    ev_ref (EV_A); /* child watcher */         
    for ( signum = signalmax; signum--; ) {     
      if ( signals [signum].gotsig )             
        signal (signum, SIG_DFL);              
    }                                          
    ev_free (signals); signalmax = 0;          
  #endif                                       
                                               
    loop_destroy (EV_A);                       
  }                                            


  Now, this works for me but I would love to know if you have any comments about my change (good or bad) or anything
  I may have missed? Although obviously not the only solution, this one works for my observed issues. If you have something
  better, I'd love to see it and I would, of course, replace that into what I am working with rather than my change.

  I hope this e-mail brings out a shortcoming and provides a solution. I would not have caught this without duma.

  Thanks in advance,

  Michael
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.schmorp.de/pipermail/libev/attachments/20080619/a9d062fb/attachment.html>


More information about the libev mailing list