Closed Bug 104042 Opened 23 years ago Closed 22 years ago

get some pampers, 'cause we leak

Categories

(Core :: XSLT, defect)

defect
Not set
normal

Tracking

()

VERIFIED FIXED

People

(Reporter: axel, Assigned: keith)

Details

(Keywords: memory-leak)

Attachments

(5 obsolete files)

I'll add some leaks, and hopefully some patches as I go. Got the grand new workshop compiler, with a leak detection tool. ProcessorState::ImportFrame::~ImportFrame leaks templKeys ProcessorState::~ProcessorState doesn't clear() the (NamedMap*) variableSets.pop(); Element::setAttribute leaks new attributes, no idea if I plug that in nsdoom. There are more reports, but I can't trace those to source code right now. Axel
about the variable Bindings: We leak the globalVars from ::initialize, and we have to clear() the several NamedMaps that we use for localBindings or bindings in XSLTProcessor. Axel
Adding "mlk" keyword. Axel: Please include this keyword in any future bug reports on memory leaks.
Keywords: mlk
The localBindings should be ok since they have .setObjectDeletion(MB_TRUE), however we might very well leak the global variables, but i'm genually afraid of that code :-)
Just realized that we sometimes leak local variables. If a template is instantiated and you send a parameter "foo" to the template and the template doesn't contain a parameter "foo", but a variable "foo". Then the variable is leaked.
I think i found why we leak variable bindings. It turns out that my fix for bug 101946 wasn't entierly correct. What I did was to remove the bindings from the local variables if the variable was copied from the params map. However i just noticed that it's not the binding that is copied over from the params map, just the ExprResult contained in the binding. So what I do now is to remove the ExprResult contained in the local variable binding instead of the entire binding. I also added a check to make sure that the ExprResult is indeed the one copied from the params map. Again, this is patching existing logic, the RightThing fix is to rewrite the entire variables code, but that is left as an exercise to the reader ;-)
ok, this bug is two-fold. You're moving the delete stuff from remove to the destructor. And NamedMap::remove doesn't pay attention to the ownership. That's why we didn't crash and leaked instead. Cool. So now you're unsetting the value, and really delete the binding. Did I get that right? Would you know if we rely on ::remove in other places?
Comment on attachment 54059 [details] [diff] [review] fix templKeys leak r=me
Attachment #54059 - Flags: review+
Comment on attachment 54384 [details] [diff] [review] fix variable bindings leak r=me, assuming you think you did what I summarized above. Anyway, it works ;-)
Attachment #54384 - Flags: review+
Not sure that we're 100% on the same page, so just to clarify: The bug is two-fold: 1. Instead of removing the entire variable-binding from the variables-map i just remove the bound ExprResult, since that is all that is shared with the parameters-map 2. Before removing i check that it actually is the ExprResult shared with the parameters-map, since in some cases it's not. (Specifically if we ignored a parameter sent to the template, but created a variable with the same name)
Comment on attachment 54420 [details] [diff] [review] I introduced a leak in txNamespaceManager::Shutdown :-( r=sicking
Attachment #54420 - Flags: review+
The ::remove was never intended to do any deleting. It was done so that we would *not* delete the variable once the variable-map went away. The reason for this is that we didn't really own the variable, we had just "borrowed" it from the params-map. But it turns out that we just borrowed the ExprResult, not the entire binding, so that is what i remove now. We use NamedMap::remove to remove sourceDoc and the xslDoc out from the loadedDocuments map so that they won't get deleted along with the other documents. So we are relying elsewhere on ::remove not deleting.
Comment on attachment 54484 [details] [diff] [review] plug the leak of an inputstream in main, and the sub-exprResult in UnionExpr::evaluate (iterator cleanup, too) could you add a nullcheck of exprResult after expr->evaluate. with that r=sicking
Attachment #54484 - Flags: review+
r=peterv on templKeys (attachment 54059 [details] [diff] [review]), txNamespaceManager (attachment 54420 [details] [diff] [review]) and inputstream/UnionExpr with sicking's comment addressed (attachment 54484 [details] [diff] [review]).
Comment on attachment 54384 [details] [diff] [review] fix variable bindings leak >+ while((key = keyIter.next())) { Space after the while please. r=peterv.
Comment on attachment 54059 [details] [diff] [review] fix templKeys leak sr=jst
Attachment #54059 - Flags: superreview+
Comment on attachment 54384 [details] [diff] [review] fix variable bindings leak sr=jst
Attachment #54384 - Flags: superreview+
Comment on attachment 54420 [details] [diff] [review] I introduced a leak in txNamespaceManager::Shutdown :-( sr=jst
Attachment #54420 - Flags: superreview+
Comment on attachment 54484 [details] [diff] [review] plug the leak of an inputstream in main, and the sub-exprResult in UnionExpr::evaluate (iterator cleanup, too) sr=jst
Attachment #54484 - Flags: superreview+
Comment on attachment 54059 [details] [diff] [review] fix templKeys leak checked in
Attachment #54059 - Attachment is obsolete: true
Comment on attachment 54384 [details] [diff] [review] fix variable bindings leak checked in
Attachment #54384 - Attachment is obsolete: true
Comment on attachment 54420 [details] [diff] [review] I introduced a leak in txNamespaceManager::Shutdown :-( checked in
Attachment #54420 - Attachment is obsolete: true
Comment on attachment 54484 [details] [diff] [review] plug the leak of an inputstream in main, and the sub-exprResult in UnionExpr::evaluate (iterator cleanup, too) checked in
Attachment #54484 - Attachment is obsolete: true
how do we unleak result tree fragments? Currently, code like XSLTProcessor::processVariable creates a result tree fragment by creating a document fragment and adding that to a nodeset. That leaks the document fragment.
Comment on attachment 54420 [details] [diff] [review] I introduced a leak in txNamespaceManager::Shutdown :-( really in now
Comment on attachment 54850 [details] [diff] [review] others copied and pasted the leaks, I copy and paste the fix sr=jst
Attachment #54850 - Flags: superreview+
Comment on attachment 54850 [details] [diff] [review] others copied and pasted the leaks, I copy and paste the fix r=peterv
Attachment #54850 - Flags: review+
Comment on attachment 54850 [details] [diff] [review] others copied and pasted the leaks, I copy and paste the fix patch checked in
Attachment #54850 - Attachment is obsolete: true
do we still have any known leaks? or could/should this be closed? The only leak that I know of is that we leak RTFs in standalone, but fixing that requires implementing "real" RTFs which should IMHO be done in a separate bug (I was thinking of using bug 116755 for that)
we are faster these days. Lets close this and open bugs on specific issues when we find them
ok, the correct comment should be: We have plugged all currently known leaks. Lets close this and open bugs on specific issues when we find them
Status: NEW → RESOLVED
Closed: 22 years ago
Resolution: --- → FIXED
mass verifying
Status: RESOLVED → VERIFIED
You need to log in before you can comment on or make changes to this bug.

Attachment

General

Created:
Updated:
Size: