richter     2004/08/15 12:26:48

  Modified:    .        Makefile.PL epcmd2.c epcomp.c epmain.c
                        mod_embperl.c
  Log:
  fix some memory leaks
  
  Revision  Changes    Path
  1.71      +1 -1      embperl/Makefile.PL
  
  Index: Makefile.PL
  ===================================================================
  RCS file: /home/cvs/embperl/Makefile.PL,v
  retrieving revision 1.70
  retrieving revision 1.71
  diff -u -r1.70 -r1.71
  --- Makefile.PL       14 Aug 2004 14:28:40 -0000      1.70
  +++ Makefile.PL       15 Aug 2004 19:26:48 -0000      1.71
  @@ -508,7 +508,7 @@
           }
       else
           {
  -        $ccdebug = '-ggdb -O0 -Wall -DEPDEBUG' ;
  +        $ccdebug = '-g -O0 -Wall -DEPDEBUG' ;
           $lddebug = '-g' ;
           }
       }
  
  
  
  1.14      +2 -0      embperl/epcmd2.c
  
  Index: epcmd2.c
  ===================================================================
  RCS file: /home/cvs/embperl/epcmd2.c,v
  retrieving revision 1.13
  retrieving revision 1.14
  diff -u -r1.13 -r1.14
  --- epcmd2.c  14 Aug 2004 14:28:41 -0000      1.13
  +++ epcmd2.c  15 Aug 2004 19:26:48 -0000      1.14
  @@ -549,6 +549,8 @@
   
       Element_selfSetAttribut (r -> pApp, pDomTree, pNode, nRepeatLevel, sAttrName, 
nAttrLen, pAttrString, ArrayGetSize (r -> pApp, pAttrString)) ;
   
  +    StringFree (r -> pApp, &pAttrString) ;

  +

       return ok ;
       }
   
  
  
  
  1.16      +5 -2      embperl/epcomp.c
  
  Index: epcomp.c
  ===================================================================
  RCS file: /home/cvs/embperl/epcomp.c,v
  retrieving revision 1.15
  retrieving revision 1.16
  diff -u -r1.15 -r1.16
  --- epcomp.c  14 Aug 2004 14:28:41 -0000      1.15
  +++ epcomp.c  15 Aug 2004 19:26:48 -0000      1.16
  @@ -1903,7 +1903,8 @@
               gv = *((GV **)hv_fetch    (pStash, "param", 5, 0)) ;
               /* gv = r -> pThread -> pParamArrayGV ; */
               save_ary (gv) ;
  -            GvAV(gv) = (AV *)SvREFCNT_inc(c -> Param.pParam) ;
  +            SvREFCNT_dec((SV *)GvAV(gv)) ;

  +            GvAV(gv) = (AV *)SvREFCNT_inc(c -> Param.pParam) ;

               }
       
           if (c -> Param.pFormHash)
  @@ -1911,6 +1912,7 @@
               gv = *((GV **)hv_fetch    (pStash, "fdat", 4, 0)) ;
               /* gv = r -> pThread -> pFormHashGV ; */
               save_hash (gv) ;
  +            SvREFCNT_dec((SV *)GvHV(gv)) ;

               GvHV(gv) = (HV *)SvREFCNT_inc(c -> Param.pFormHash) ;
               }
   
  @@ -1919,10 +1921,12 @@
               gv = *((GV **)hv_fetch    (pStash, "ffld", 4, 0)) ;
               /* gv = r -> pThread -> pFormArrayGV ; */
               save_ary (gv) ;
  +            SvREFCNT_dec((SV *)GvAV(gv)) ;

               if (c -> Param.pFormArray)
                   GvAV(gv) = (AV *)SvREFCNT_inc(c -> Param.pFormArray) ;
               else
                   {
  +                /* SVREFCNT_dec (pAV) is done by LEAVE, because of save_ary above 
(you can savely ignore dmalloc logged error) */

                   AV * pAV = newAV ();
                   HE *   pEntry ;
                   char * pKey ;
  @@ -1934,7 +1938,6 @@
                       pKey = hv_iterkey (pEntry, &l) ;
                       av_push (pAV, newSVpv(pKey, l)) ;
                       }
  -                av_push (r -> pCleanupAV, (SV *)pAV) ;

                   }
               
               }
  
  
  
  1.129     +30 -4     embperl/epmain.c
  
  Index: epmain.c
  ===================================================================
  RCS file: /home/cvs/embperl/epmain.c,v
  retrieving revision 1.128
  retrieving revision 1.129
  diff -u -r1.128 -r1.129
  --- epmain.c  14 Aug 2004 14:28:42 -0000      1.128
  +++ epmain.c  15 Aug 2004 19:26:48 -0000      1.129
  @@ -1338,10 +1338,12 @@
       if (!r -> bError)
           {
           if ((rc = ProcessFile (r, 0 /*r -> Buf.pFile -> nFilesize*/)) != ok)
  +            {

               if (rc == rcExit)
                   rc = ok ;
               else
  -                LogError (r, rc) ;
  +                LogError (r, rc) ;

  +            }
   
           if (r -> Component.Param.nImport > 0)
               export (r) ;
  @@ -1416,7 +1418,8 @@
   
   #ifdef DMALLOC

       time_t t = time(NULL) ;

  -    unsigned long nMemCheckpoint ;

  +    static unsigned long nMemCheckpoint ;

  +    static unsigned long nMemCheckpoint2 ;

       dmalloc_message ("[%d]REQ: Start Request at %s\n", getpid(), ctime (&t)) ; 

   #endif        

   

  @@ -1424,6 +1427,7 @@
       _CrtMemCheckpoint(&r -> MemCheckpoint);    

   #endif    

   #ifdef DMALLOC

  +    nMemCheckpoint2 = nMemCheckpoint  ;   

       nMemCheckpoint = dmalloc_mark () ;   

   #endif    

   

  @@ -1458,6 +1462,11 @@
       dmalloc_log_changed (nMemCheckpoint, 1, 0, 1) ;

       dmalloc_message ( "[%d]Request freed. Exit-SVs: %d -OBJs: %d\n", getpid(),

            sv_count, sv_objcount) ;

  +    if (nMemCheckpoint2)

  +        {

  +        dmalloc_message ( "***TO PREVIOUS REQUEST***\n") ;

  +        dmalloc_log_changed (nMemCheckpoint2, 1, 0, 1) ;

  +        }

   #endif    

   
       return rc ;
  @@ -1497,10 +1506,12 @@
           oBegin (r) ;
   
       if ((rc = ProcessFile (r, 0 /*r -> Buf.pFile -> nFilesize*/)) != ok)
  +        {

           if (rc == rcExit)
               rc = ok ;
           else
  -            LogError (r, rc) ;
  +            LogError (r, rc) ;

  +        }
   
       if (rc == ok && (c -> Config.bOptions & optReturnError) && r -> bError)
           rc = 500 ;
  @@ -1526,7 +1537,22 @@
       LEAVE;
       c -> bReqRunning = 0 ;
   
  -        
  +#ifdef DMALLOC

  +        {

  +        static unsigned long nMemCheckpoint  ;   

  +        if (nMemCheckpoint)

  +            {

  +            dmalloc_message ( "***TO PREVIOUS REQUEST IN RUN***\n") ;

  +            dmalloc_log_changed (nMemCheckpoint, 1, 0, 1) ;

  +            }

  +        nMemCheckpoint = dmalloc_mark () ; 

  +        }

  +#endif    

  +

  +    

  +

  +

  +
       return rc ;
       }
       
  
  
  
  1.18      +27 -2     embperl/mod_embperl.c
  
  Index: mod_embperl.c
  ===================================================================
  RCS file: /home/cvs/embperl/mod_embperl.c,v
  retrieving revision 1.17
  retrieving revision 1.18
  diff -u -r1.17 -r1.18
  --- mod_embperl.c     14 Aug 2004 14:28:45 -0000      1.17
  +++ mod_embperl.c     15 Aug 2004 19:26:48 -0000      1.18
  @@ -428,6 +428,8 @@
   #define EPCFG_DEC(STRUCT,TYPE,NAME,CFGNAME)  \

       if (cfg -> STRUCT.NAME) \

           { \

  +        if (bApDebug) \

  +            ap_log_error (APLOG_MARK, APLOG_WARNING | APLOG_NOERRNO, 
APLOG_STATUSCODE NULL, "EmbperlDebug: ApacheConfigCleanup:SvREFCNT_dec "#CFGNAME" 
(name="#NAME" type="#TYPE") \n") ; \

           SvREFCNT_dec ((SV *)(cfg -> STRUCT.NAME)) ; \

           cfg -> STRUCT.NAME = NULL ; \

           }

  @@ -443,7 +445,10 @@
       tApacheDirConfig * cfg = (tApacheDirConfig *) p ;

       dTHX ;

   

  -/* #include "epcfg.h" */

  +    if (bApDebug)

  +        ap_log_error (APLOG_MARK, APLOG_WARNING | APLOG_NOERRNO, APLOG_STATUSCODE 
NULL, "EmbperlDebug: ApacheConfigCleanup [%d/%d]\n", getpid(), gettid()) ;

  +

  +#include "epcfg.h"

   

   #ifdef APACHE2

       return OK ;

  @@ -508,11 +513,13 @@
   #endif

       cfg = (tApacheDirConfig *) ap_pcalloc(subpool, sizeof(tApacheDirConfig));

   

  +#if 0

   #ifdef APACHE2

       apr_pool_cleanup_register(subpool, cfg, embperl_ApacheConfigCleanup, 
embperl_ApacheConfigCleanup); 

   #else

       ap_register_cleanup(subpool, cfg, embperl_ApacheConfigCleanup, 
embperl_ApacheConfigCleanup);

   #endif
  +#endif

       

       embperl_DefaultReqConfig (&cfg -> ReqConfig) ;
       embperl_DefaultAppConfig (&cfg -> AppConfig) ;
  @@ -618,13 +625,17 @@
           mrg -> set_##STRUCT##NAME = 1 ; \
           mrg -> STRUCT.NAME = add -> STRUCT.NAME ; \
           mrg -> save_##STRUCT##NAME = add -> save_##STRUCT##NAME ; \
  +        if (mrg -> STRUCT.NAME) \

  +            SvREFCNT_inc((SV *)mrg -> STRUCT.NAME) ; \

           if (bApDebug) \
               ap_log_error (APLOG_MARK, APLOG_WARNING | APLOG_NOERRNO, 
APLOG_STATUSCODE NULL, "EmbperlDebug: Merge "#CFGNAME" (type="#TYPE") => %s\n", mrg -> 
save_##STRUCT##NAME?mrg -> save_##STRUCT##NAME:"<null>") ; \
           } \
       else \
           {  \
  +        if (mrg -> STRUCT.NAME) \

  +            SvREFCNT_inc((SV *)mrg -> STRUCT.NAME) ; \

           if (bApDebug && mrg -> set_##STRUCT##NAME) \
  -        ap_log_error (APLOG_MARK, APLOG_WARNING | APLOG_NOERRNO, APLOG_STATUSCODE 
NULL, "EmbperlDebug: Merge "#CFGNAME" (type="#TYPE") stays %s\n", mrg -> 
save_##STRUCT##NAME?mrg -> save_##STRUCT##NAME:"<null>") ; \
  +            ap_log_error (APLOG_MARK, APLOG_WARNING | APLOG_NOERRNO, 
APLOG_STATUSCODE NULL, "EmbperlDebug: Merge "#CFGNAME" (type="#TYPE") stays %s\n", mrg 
-> save_##STRUCT##NAME?mrg -> save_##STRUCT##NAME:"<null>") ; \
           } 
   
   
  @@ -641,6 +652,20 @@
           tApacheDirConfig *mrg = (tApacheDirConfig *)ap_palloc (p, 
sizeof(tApacheDirConfig));
           tApacheDirConfig *base = (tApacheDirConfig *)basev;
           tApacheDirConfig *add = (tApacheDirConfig *)addv;
  +        apr_pool_t * subpool ;

  +

  +#ifdef APACHE2

  +        apr_pool_sub_make(&subpool, p, NULL);

  +#else

  +        subpool = ap_make_sub_pool(p);

  +#endif

  +        mrg = (tApacheDirConfig *)ap_palloc (subpool, sizeof(tApacheDirConfig));

  +

  +#ifdef APACHE2

  +        apr_pool_cleanup_register(subpool, mrg, embperl_ApacheConfigCleanup, 
embperl_ApacheConfigCleanup); 

  +#else

  +        ap_register_cleanup(subpool, mrg, embperl_ApacheConfigCleanup, 
embperl_ApacheConfigCleanup);

  +#endif

   
           memcpy (mrg, base, sizeof (*mrg)) ;
   
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to