
richter at apache
Aug 15, 2004, 12:26 PM
Post #1 of 1
(785 views)
Permalink
|
|
cvs commit: embperl Makefile.PL epcmd2.c epcomp.c epmain.c mod_embperl.c
|
|
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: embperl-cvs-unsubscribe [at] perl For additional commands, e-mail: embperl-cvs-help [at] perl
|