Re: [Incrtcl-users] ::itcl::delete class leaks?
by Tyukodi Zoltán other posts by this author
Jun 6 2006 4:47AM messages near this date
Re: [Incrtcl-users] ::itcl::delete class leaks?
|
Re: [Incrtcl-users] ::itcl::delete class leaks?
Hello Jeff,
thank you for the help.
Isn't it necessary to check if mcode-> procPtr is null before the line:
} else if (mcode-> procPtr->firstLocalPtr) {
Zolt�n Tyukodi
________________________________
From: Jeff Hobbs [mailto:jeffh@[...].com]
Sent: Friday, June 02, 2006 19:51
To: Tyukodi Zolt�n
Cc: incrtcl-users@[...].net
Subject: RE: [Incrtcl-users] ::itcl::delete class leaks?
Hi Zolt�n,
Attached is a bit more conservative variant of the same patch. I do believe it is correct (
passes all tests, plus one new one). I have commited this to CVS.
Thanks,
Jeff Hobbs, The Tcl Guy, http://www.ActiveState.com/
-----Original Message-----
From: Tyukodi Zolt�n [mailto:tyukodi.zoltan@[...].hu]
Sent: June 1, 2006 12:08 AM
To: Jeff Hobbs
Cc: incrtcl-users@[...].net
Subject: RE: [Incrtcl-users] ::itcl::delete class leaks?
Hello Jeff,
thank you for your suggestion but unfortunately it is not allowed me to modify the class.
I have spent 4 days to investigate the source code of the itcl and now I think that the pro
blem is in the Itcl_DeleteMemberCode function. I have made the following modification on it:
Original version of the Itcl_DeleteMemberCode function:
void
Itcl_DeleteMemberCode(cdata)
CONST char* cdata; /* pointer to member function definition */
{
ItclMemberCode* mcode = (ItclMemberCode*)cdata;
if (mcode-> arglist) {
Itcl_DeleteArgList(mcode-> arglist);
}
if (mcode-> procPtr) {
ckfree((char*) mcode-> procPtr->cmdPtr);
/* don't free compiled locals -- that is handled by arglist above */
if (mcode-> procPtr->bodyPtr) {
Tcl_DecrRefCount(mcode-> procPtr->bodyPtr);
}
ckfree((char*)mcode-> procPtr);
}
ckfree((char*)mcode);
}
Fixed (by me) of version of the Itcl_DeleteMemberCode function:
void
Itcl_DeleteMemberCode(cdata)
CONST char* cdata; /* pointer to member function definition */
{
ItclMemberCode* mcode = (ItclMemberCode*)cdata;
if (mcode-> arglist) {
Itcl_DeleteArgList(mcode-> arglist);
}
if (mcode-> procPtr) {
ckfree((char*) mcode-> procPtr->cmdPtr);
/* don't free compiled locals -- that is handled by arglist above, if there are arg
uments */
if ( !( mcode-> arglist ) ) {
Itcl_DeleteArgList( mcode-> procPtr->firstLocalPtr );
}
if (mcode-> procPtr->bodyPtr) {
Tcl_DecrRefCount(mcode-> procPtr->bodyPtr);
}
ckfree((char*)mcode-> procPtr);
}
ckfree((char*)mcode);
}
The compiled local variables are not freed, if there is not any argument of the itcl member
procedure. Am I right?
I think that You are one of the developers of the itcl. Is it possible that You validate my
modification?
Thank You very much.
Zolt�n Tyukodi
________________________________
From: Jeff Hobbs [mailto:jeffh@[...].com]
Sent: Tuesday, May 30, 2006 18:23
To: Tyukodi Zolt�n; incrtcl-users@[...].net
Subject: RE: [Incrtcl-users] ::itcl::delete class leaks?
Itcl is apparently not cleaning up after itself properly. I verified the leak, then just c
hanged "set n 1" to "set ::n 1", ensuring a single global var is used, and there was no long
er a leak.
Jeff Hobbs, The Tcl Guy, http://www.ActiveState.com/
-----Original Message-----
From: incrtcl-users-admin@[...].net [mailto:incrtcl-users-admin@[...].net] On Behalf Of Ty
ukodi Zolt�n
Sent: May 30, 2006 12:38 AM
To: incrtcl-users@[...].net
Subject: [Incrtcl-users] ::itcl::delete class leaks?
Hello,
can anybody tell me why the following script leaks memory intensively?
package require Itcl
while { 1 } {
::itcl::class LeakClass {
proc leakProc {} {
set n 1
}
}
LeakClass::leakProc
::itcl::delete class "LeakClass"
}
There is no leak, if I remove the call of the procedure or the set n 1 line.
I know, this is a stupid algorithm but I have to do a similar one.
Thread:
Tyukodi Zoltán
Tyukodi Zoltán
Jeff Hobbs
Jeff Hobbs
Michael Thomas
|