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]