<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns:p="urn:schemas-microsoft-com:office:powerpoint" xmlns:a="urn:schemas-microsoft-com:office:access" xmlns:dt="uuid:C2F41010-65B3-11d1-A29F-00AA00C14882" xmlns:s="uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882" xmlns:rs="urn:schemas-microsoft-com:rowset" xmlns:z="#RowsetSchema" xmlns:b="urn:schemas-microsoft-com:office:publisher" xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" xmlns:c="urn:schemas-microsoft-com:office:component:spreadsheet" xmlns:odc="urn:schemas-microsoft-com:office:odc" xmlns:oa="urn:schemas-microsoft-com:office:activation" xmlns:html="http://www.w3.org/TR/REC-html40" xmlns:q="http://schemas.xmlsoap.org/soap/envelope/" xmlns:rtc="http://microsoft.com/officenet/conferencing" xmlns:D="DAV:" xmlns:Repl="http://schemas.microsoft.com/repl/" xmlns:mt="http://schemas.microsoft.com/sharepoint/soap/meetings/" xmlns:x2="http://schemas.microsoft.com/office/excel/2003/xml" xmlns:ppda="http://www.passport.com/NameSpace.xsd" xmlns:ois="http://schemas.microsoft.com/sharepoint/soap/ois/" xmlns:dir="http://schemas.microsoft.com/sharepoint/soap/directory/" xmlns:ds="http://www.w3.org/2000/09/xmldsig#" xmlns:dsp="http://schemas.microsoft.com/sharepoint/dsp" xmlns:udc="http://schemas.microsoft.com/data/udc" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:sub="http://schemas.microsoft.com/sharepoint/soap/2002/1/alerts/" xmlns:ec="http://www.w3.org/2001/04/xmlenc#" xmlns:sp="http://schemas.microsoft.com/sharepoint/" xmlns:sps="http://schemas.microsoft.com/sharepoint/soap/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:udcs="http://schemas.microsoft.com/data/udc/soap" xmlns:udcxf="http://schemas.microsoft.com/data/udc/xmlfile" xmlns:udcp2p="http://schemas.microsoft.com/data/udc/parttopart" xmlns:wf="http://schemas.microsoft.com/sharepoint/soap/workflow/" xmlns:dsss="http://schemas.microsoft.com/office/2006/digsig-setup" xmlns:dssi="http://schemas.microsoft.com/office/2006/digsig" xmlns:mdssi="http://schemas.openxmlformats.org/package/2006/digital-signature" xmlns:mver="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns:mrels="http://schemas.openxmlformats.org/package/2006/relationships" xmlns:spwp="http://microsoft.com/sharepoint/webpartpages" xmlns:ex12t="http://schemas.microsoft.com/exchange/services/2006/types" xmlns:ex12m="http://schemas.microsoft.com/exchange/services/2006/messages" xmlns:pptsl="http://schemas.microsoft.com/sharepoint/soap/SlideLibrary/" xmlns:spsl="http://microsoft.com/webservices/SharePointPortalServer/PublishedLinksService" xmlns:Z="urn:schemas-microsoft-com:" xmlns:st="" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=us-ascii">
<meta name=Generator content="Microsoft Word 12 (filtered medium)">
<style>
<!--
/* Font Definitions */
@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
        {font-family:Tahoma;
        panose-1:2 11 6 4 3 5 4 4 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0in;
        margin-bottom:.0001pt;
        text-align:right;
        direction:rtl;
        unicode-bidi:embed;
        font-size:11.0pt;
        font-family:"Calibri","sans-serif";}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:purple;
        text-decoration:underline;}
p.MsoListParagraph, li.MsoListParagraph, div.MsoListParagraph
        {mso-style-priority:34;
        margin-top:0in;
        margin-right:.5in;
        margin-bottom:0in;
        margin-left:0in;
        margin-bottom:.0001pt;
        text-align:right;
        direction:rtl;
        unicode-bidi:embed;
        font-size:11.0pt;
        font-family:"Calibri","sans-serif";}
span.EmailStyle18
        {mso-style-type:personal;
        font-family:"Calibri","sans-serif";
        color:windowtext;}
span.EmailStyle19
        {mso-style-type:personal;
        font-family:"Calibri","sans-serif";
        color:#1F497D;}
span.EmailStyle20
        {mso-style-type:personal;
        font-family:"Calibri","sans-serif";
        color:#1F497D;}
span.EmailStyle21
        {mso-style-type:personal-reply;
        font-family:"Calibri","sans-serif";
        color:#1F497D;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-size:10.0pt;}
@page Section1
        {size:8.5in 11.0in;
        margin:1.0in 1.25in 1.0in 1.25in;}
div.Section1
        {page:Section1;}
/* List Definitions */
@list l0
        {mso-list-id:753472813;
        mso-list-type:hybrid;
        mso-list-template-ids:1100926382 67698703 67698713 67698715 67698703 67698713 67698715 67698703 67698713 67698715;}
@list l0:level1
        {mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;}
@list l0:level2
        {mso-level-tab-stop:1.0in;
        mso-level-number-position:left;
        text-indent:-.25in;}
@list l0:level3
        {mso-level-tab-stop:1.5in;
        mso-level-number-position:left;
        text-indent:-.25in;}
@list l0:level4
        {mso-level-tab-stop:2.0in;
        mso-level-number-position:left;
        text-indent:-.25in;}
@list l0:level5
        {mso-level-tab-stop:2.5in;
        mso-level-number-position:left;
        text-indent:-.25in;}
@list l0:level6
        {mso-level-tab-stop:3.0in;
        mso-level-number-position:left;
        text-indent:-.25in;}
@list l0:level7
        {mso-level-tab-stop:3.5in;
        mso-level-number-position:left;
        text-indent:-.25in;}
@list l0:level8
        {mso-level-tab-stop:4.0in;
        mso-level-number-position:left;
        text-indent:-.25in;}
@list l0:level9
        {mso-level-tab-stop:4.5in;
        mso-level-number-position:left;
        text-indent:-.25in;}
ol
        {margin-bottom:0in;}
ul
        {margin-bottom:0in;}
-->
</style>
<!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]-->
</head>
<body lang=EN-US link=blue vlink=purple>
<div class=Section1>
<p class=MsoNormal style='text-align:left;direction:ltr;unicode-bidi:embed'><span
style='color:#1F497D'>2.6.1 is when it should be fixed which should be sometime
early next year. A better workaround might be to avoid try/except in the
generator if you can refactor that out into its own function. But if that
doesn’t work then I also think calling close explicitly should avoid it and do
so without the cost of throwing the exception. <o:p></o:p></span></p>
<p class=MsoNormal style='text-align:left;direction:ltr;unicode-bidi:embed'><span
style='color:#1F497D'><o:p> </o:p></span></p>
<div style='border:none;border-left:solid blue 1.5pt;padding:0in 0in 0in 4.0pt'>
<div>
<div style='border:none;border-top:solid #B5C4DF 1.0pt;padding:3.0pt 0in 0in 0in'>
<p class=MsoNormal style='text-align:left;direction:ltr;unicode-bidi:embed'><b><span
style='font-size:10.0pt;font-family:"Tahoma","sans-serif"'>From:</span></b><span
style='font-size:10.0pt;font-family:"Tahoma","sans-serif"'>
users-bounces@lists.ironpython.com [mailto:users-bounces@lists.ironpython.com] <b>On
Behalf Of </b>Idan Zaltzberg<br>
<b>Sent:</b> Monday, December 28, 2009 11:52 PM<br>
<b>To:</b> Discussion of IronPython<br>
<b>Subject:</b> Re: [IronPython] Memory leaks in Ipy 2.6<o:p></o:p></span></p>
</div>
</div>
<p class=MsoNormal style='text-align:left;direction:ltr;unicode-bidi:embed'><o:p> </o:p></p>
<p class=MsoNormal style='text-align:left;direction:ltr;unicode-bidi:embed'><span
style='color:#1F497D'>Thanks for the fast reply.</span><o:p></o:p></p>
<p class=MsoNormal style='text-align:left;direction:ltr;unicode-bidi:embed'><span
style='color:#1F497D'>Could you estimate when and how (in what version) the fix
will be deployed?</span><o:p></o:p></p>
<p class=MsoNormal style='text-align:left;direction:ltr;unicode-bidi:embed'><span
style='color:#1F497D'>Regardless, our current fix is to "throw"
exception when we want the generator to be disposed and catch it ourselves, is
that the right way to go?</span><o:p></o:p></p>
<p class=MsoNormal style='text-align:left;direction:ltr;unicode-bidi:embed'><span
style='color:#1F497D'> </span><o:p></o:p></p>
<div>
<div style='border:none;border-top:solid #B5C4DF 1.0pt;padding:3.0pt 0in 0in 0in'>
<p class=MsoNormal style='text-align:left;direction:ltr;unicode-bidi:embed'><b><span
style='font-size:10.0pt;font-family:"Tahoma","sans-serif"'>From:</span></b><span
style='font-size:10.0pt;font-family:"Tahoma","sans-serif"'> <a
href="mailto:users-bounces@lists.ironpython.com">users-bounces@lists.ironpython.com</a>
[mailto:<a href="mailto:users-bounces@lists.ironpython.com">users-bounces@lists.ironpython.com</a>]
<b>On Behalf Of </b>Dino Viehland<br>
<b>Sent:</b> Monday, December 28, 2009 9:47 PM<br>
<b>To:</b> Discussion of IronPython<br>
<b>Subject:</b> Re: [IronPython] Memory leaks in Ipy 2.6</span><o:p></o:p></p>
</div>
</div>
<p class=MsoNormal style='text-align:left;direction:ltr;unicode-bidi:embed'> <o:p></o:p></p>
<p class=MsoNormal style='text-align:left;direction:ltr;unicode-bidi:embed'><span
style='color:#1F497D'>This is definitely a bug – we’re leaking our stack frames
on the CLR’s finalizer thread when we swallow exceptions while closing the
generator. I think this is the correct fix but I haven’t fully tested it
yet, in our generator we have the code below but it’s missing the assignment of
null to DynamicStackFrames:</span><o:p></o:p></p>
<p class=MsoNormal style='text-align:left;direction:ltr;unicode-bidi:embed'><span
style='color:#1F497D'> </span><o:p></o:p></p>
<p class=MsoNormal style='text-align:left;text-autospace:none;direction:ltr;
unicode-bidi:embed'><span style='font-size:10.0pt;font-family:"Courier New"'>
<span style='color:blue'>try</span> {</span><o:p></o:p></p>
<p class=MsoNormal style='text-align:left;text-autospace:none;direction:ltr;
unicode-bidi:embed'><span style='font-size:10.0pt;font-family:"Courier New"'>
@throw(<span style='color:blue'>new</span> <span style='color:#2B91AF'>GeneratorExitException</span>());</span><o:p></o:p></p>
<p class=MsoNormal style='text-align:left;text-autospace:none;direction:ltr;
unicode-bidi:embed'><span style='font-size:10.0pt;font-family:"Courier New"'> </span><o:p></o:p></p>
<p class=MsoNormal style='text-align:left;text-autospace:none;direction:ltr;
unicode-bidi:embed'><span style='font-size:10.0pt;font-family:"Courier New"'>
<span style='color:green'>// Generator should not have exited normally. </span></span><o:p></o:p></p>
<p class=MsoNormal style='text-align:left;text-autospace:none;direction:ltr;
unicode-bidi:embed'><span style='font-size:10.0pt;font-family:"Courier New"'>
<span style='color:blue'>throw</span> <span style='color:blue'>new</span> <span
style='color:#2B91AF'>RuntimeException</span>(<span style='color:#A31515'>"generator
ignored GeneratorExit"</span>);</span><o:p></o:p></p>
<p class=MsoNormal style='text-align:left;text-autospace:none;direction:ltr;
unicode-bidi:embed'><span style='font-size:10.0pt;font-family:"Courier New"'>
} <span style='color:blue'>catch</span> (<span style='color:#2B91AF'>StopIterationException</span>)
{</span><o:p></o:p></p>
<p class=MsoNormal style='text-align:left;text-autospace:none;direction:ltr;
unicode-bidi:embed'><span style='font-size:10.0pt;font-family:"Courier New"'>
<span style='color:green'>// Ignore</span></span><o:p></o:p></p>
<p class=MsoNormal style='text-align:left;text-autospace:none;direction:ltr;
unicode-bidi:embed'><span style='font-size:10.0pt;font-family:"Courier New"'>
<span style='color:#2B91AF'>ExceptionHelpers</span>.DynamicStackFrames = <span
style='color:blue'>null</span>; // adding this fixes it</span><o:p></o:p></p>
<p class=MsoNormal style='text-align:left;text-autospace:none;direction:ltr;
unicode-bidi:embed'><span style='font-size:10.0pt;font-family:"Courier New"'>
} <span style='color:blue'>catch</span> (<span style='color:#2B91AF'>GeneratorExitException</span>)
{</span><o:p></o:p></p>
<p class=MsoNormal style='text-align:left;text-autospace:none;direction:ltr;
unicode-bidi:embed'><span style='font-size:10.0pt;font-family:"Courier New"'>
<span style='color:green'>// Ignore</span></span><o:p></o:p></p>
<p class=MsoNormal style='text-align:left;text-autospace:none;direction:ltr;
unicode-bidi:embed'><span style='font-size:10.0pt;font-family:"Courier New"'>
<span style='color:#2B91AF'>ExceptionHelpers</span>.DynamicStackFrames = <span
style='color:blue'>null</span>; // adding this fixes it</span><o:p></o:p></p>
<p class=MsoNormal style='text-align:left;text-autospace:none;direction:ltr;
unicode-bidi:embed'><span style='font-size:10.0pt;font-family:"Courier New"'>
}</span><o:p></o:p></p>
<p class=MsoNormal style='text-align:left;direction:ltr;unicode-bidi:embed'><span
style='color:#1F497D'> </span><o:p></o:p></p>
<p class=MsoNormal style='text-align:left;direction:ltr;unicode-bidi:embed'><span
style='color:#1F497D'>This definitely fixes 1 and 2. After running this 3
doesn’t actually seem to leak memory when running repeatedly for me but
after-before > 10 is True. I’ll take a closer look and make sure this
is the correct fix after the new year when I’m back in the office.</span><o:p></o:p></p>
<p class=MsoNormal style='text-align:left;direction:ltr;unicode-bidi:embed'><span
style='color:#1F497D'> </span><o:p></o:p></p>
<div style='border:none;border-left:solid blue 1.5pt;padding:0in 0in 0in 4.0pt'>
<div>
<div style='border:none;border-top:solid #B5C4DF 1.0pt;padding:3.0pt 0in 0in 0in'>
<p class=MsoNormal style='text-align:left;direction:ltr;unicode-bidi:embed'><b><span
style='font-size:10.0pt;font-family:"Tahoma","sans-serif"'>From:</span></b><span
style='font-size:10.0pt;font-family:"Tahoma","sans-serif"'> <a
href="mailto:users-bounces@lists.ironpython.com">users-bounces@lists.ironpython.com</a>
[mailto:<a href="mailto:users-bounces@lists.ironpython.com">users-bounces@lists.ironpython.com</a>]
<b>On Behalf Of </b>Idan Zaltzberg<br>
<b>Sent:</b> Monday, December 28, 2009 10:33 AM<br>
<b>To:</b> <a href="mailto:users@lists.ironpython.com">users@lists.ironpython.com</a><br>
<b>Subject:</b> [IronPython] Memory leaks in Ipy 2.6</span><o:p></o:p></p>
</div>
</div>
<p class=MsoNormal style='text-align:left;direction:ltr;unicode-bidi:embed'> <o:p></o:p></p>
<p class=MsoNormal style='text-align:left;direction:ltr;unicode-bidi:embed'>Hi,<o:p></o:p></p>
<p class=MsoNormal style='text-align:left;direction:ltr;unicode-bidi:embed'>Working
with the new version I have encountered some problems which look like memory
leaks to me.<o:p></o:p></p>
<p class=MsoNormal style='text-align:left;direction:ltr;unicode-bidi:embed'>I've
written 3 test methods that reproduce the problems, and would appreciate your
response.<o:p></o:p></p>
<p class=MsoNormal style='text-align:left;direction:ltr;unicode-bidi:embed'>Thanks<o:p></o:p></p>
<p class=MsoNormal style='text-align:left;direction:ltr;unicode-bidi:embed'><u>Problem
1</u><o:p></o:p></p>
<p class=MsoNormal style='text-align:left;direction:ltr;unicode-bidi:embed'>Occurs
when you do the all of the following<o:p></o:p></p>
<p class=MsoListParagraph style='mso-margin-top-alt:0in;margin-right:0in;
margin-bottom:0in;margin-left:.5in;margin-bottom:.0001pt;text-align:left;
text-indent:-.25in;mso-list:l0 level1 lfo2;direction:ltr;unicode-bidi:embed'><![if !supportLists]><span
style='mso-list:Ignore'>1.<span style='font:7.0pt "Times New Roman"'>
</span></span><![endif]>Define a generator method<o:p></o:p></p>
<p class=MsoListParagraph style='mso-margin-top-alt:0in;margin-right:0in;
margin-bottom:0in;margin-left:.5in;margin-bottom:.0001pt;text-align:left;
text-indent:-.25in;mso-list:l0 level1 lfo2;direction:ltr;unicode-bidi:embed'><![if !supportLists]><span
style='mso-list:Ignore'>2.<span style='font:7.0pt "Times New Roman"'>
</span></span><![endif]>Insert a try/except clause in the method<o:p></o:p></p>
<p class=MsoListParagraph style='mso-margin-top-alt:0in;margin-right:0in;
margin-bottom:0in;margin-left:.5in;margin-bottom:.0001pt;text-align:left;
text-indent:-.25in;mso-list:l0 level1 lfo2;direction:ltr;unicode-bidi:embed'><![if !supportLists]><span
style='mso-list:Ignore'>3.<span style='font:7.0pt "Times New Roman"'>
</span></span><![endif]>define an inner method that uses some local variable<o:p></o:p></p>
<p class=MsoListParagraph style='mso-margin-top-alt:0in;margin-right:0in;
margin-bottom:0in;margin-left:.5in;margin-bottom:.0001pt;text-align:left;
text-indent:-.25in;mso-list:l0 level1 lfo2;direction:ltr;unicode-bidi:embed'><![if !supportLists]><span
style='mso-list:Ignore'>4.<span style='font:7.0pt "Times New Roman"'>
</span></span><![endif]>Call the generator method without reaching the
"StopIteration"<o:p></o:p></p>
<p class=MsoNormal style='text-align:left;direction:ltr;unicode-bidi:embed'>Looks
like the local variable used by the inner method is never cleared.<o:p></o:p></p>
<p class=MsoNormal style='text-align:left;direction:ltr;unicode-bidi:embed'>This
code reproduces the problem:<o:p></o:p></p>
<p class=MsoNormal style='text-align:left;direction:ltr;unicode-bidi:embed'>
def test_generator_memory_leak(self):<o:p></o:p></p>
<p class=MsoNormal style='text-align:left;direction:ltr;unicode-bidi:embed'>
"""<o:p></o:p></p>
<p class=MsoNormal style='text-align:left;direction:ltr;unicode-bidi:embed'>
Ipy 2.6 This test reproduces a memory leak when calling a
generator method without reaching the end.<o:p></o:p></p>
<p class=MsoNormal style='text-align:left;direction:ltr;unicode-bidi:embed'>
"""<o:p></o:p></p>
<p class=MsoNormal style='text-align:left;direction:ltr;unicode-bidi:embed'>
def coroutine():<o:p></o:p></p>
<p class=MsoNormal style='text-align:left;direction:ltr;unicode-bidi:embed'>
try: pass<o:p></o:p></p>
<p class=MsoNormal style='text-align:left;direction:ltr;unicode-bidi:embed'>
except: pass<o:p></o:p></p>
<p class=MsoNormal style='text-align:left;direction:ltr;unicode-bidi:embed'>
just_numbers = range(1,1000)<o:p></o:p></p>
<p class=MsoNormal style='text-align:left;direction:ltr;unicode-bidi:embed'>
def inner_method():<o:p></o:p></p>
<p class=MsoNormal style='text-align:left;direction:ltr;unicode-bidi:embed'>
return just_numbers<o:p></o:p></p>
<p class=MsoNormal style='text-align:left;direction:ltr;unicode-bidi:embed'>
yield None<o:p></o:p></p>
<p class=MsoNormal style='text-align:left;direction:ltr;unicode-bidi:embed'>
yield None<o:p></o:p></p>
<p class=MsoNormal style='text-align:left;direction:ltr;unicode-bidi:embed'><span
dir=RTL></span><span lang=HE dir=RTL style='font-family:"Arial","sans-serif"'><span
dir=RTL></span> </span><o:p></o:p></p>
<p class=MsoNormal style='text-align:left;direction:ltr;unicode-bidi:embed'>
from System import GC<o:p></o:p></p>
<p class=MsoNormal style='text-align:left;direction:ltr;unicode-bidi:embed'>
def get_memory():<o:p></o:p></p>
<p class=MsoNormal style='text-align:left;direction:ltr;unicode-bidi:embed'>
for _ in xrange(4):<o:p></o:p></p>
<p class=MsoNormal style='text-align:left;direction:ltr;unicode-bidi:embed'>
GC.Collect()<o:p></o:p></p>
<p class=MsoNormal style='text-align:left;direction:ltr;unicode-bidi:embed'>
GC.WaitForPendingFinalizers()<o:p></o:p></p>
<p class=MsoNormal style='text-align:left;direction:ltr;unicode-bidi:embed'>
return GC.GetTotalMemory(True)/1e6<o:p></o:p></p>
<p class=MsoNormal style='text-align:left;direction:ltr;unicode-bidi:embed'>
before = get_memory()<o:p></o:p></p>
<p class=MsoNormal style='text-align:left;direction:ltr;unicode-bidi:embed'>
for j in xrange(10000):<o:p></o:p></p>
<p class=MsoNormal style='text-align:left;direction:ltr;unicode-bidi:embed'>
crt = coroutine()<o:p></o:p></p>
<p class=MsoNormal style='text-align:left;direction:ltr;unicode-bidi:embed'>
crt.next()<o:p></o:p></p>
<p class=MsoNormal style='text-align:left;direction:ltr;unicode-bidi:embed'>
after = get_memory()<o:p></o:p></p>
<p class=MsoNormal style='text-align:left;direction:ltr;unicode-bidi:embed'>
self.assert_(after-before > 10,'There should be a memory leak in this
case.before=%s after=%s' % (before,after))<o:p></o:p></p>
<p class=MsoNormal style='text-align:left;direction:ltr;unicode-bidi:embed'> <o:p></o:p></p>
<p class=MsoNormal style='text-align:left;direction:ltr;unicode-bidi:embed'><u>Problem
2</u><o:p></o:p></p>
<p class=MsoNormal style='text-align:left;direction:ltr;unicode-bidi:embed'>The
same as problem, just instead of defining an inner method, just call
"eval" with any string<o:p></o:p></p>
<p class=MsoNormal style='text-align:left;direction:ltr;unicode-bidi:embed'>
def test_generator_memory_leak2(self):<o:p></o:p></p>
<p class=MsoNormal style='text-align:left;direction:ltr;unicode-bidi:embed'>
"""<o:p></o:p></p>
<p class=MsoNormal style='text-align:left;direction:ltr;unicode-bidi:embed'>
Ipy 2.6 This test reproduces a memory leak when calling a
generator method without reaching the end.<o:p></o:p></p>
<p class=MsoNormal style='text-align:left;direction:ltr;unicode-bidi:embed'>
"""<o:p></o:p></p>
<p class=MsoNormal style='text-align:left;direction:ltr;unicode-bidi:embed'>
def coroutine(b_bool):<o:p></o:p></p>
<p class=MsoNormal style='text-align:left;direction:ltr;unicode-bidi:embed'>
try: pass<o:p></o:p></p>
<p class=MsoNormal style='text-align:left;direction:ltr;unicode-bidi:embed'>
except: pass<o:p></o:p></p>
<p class=MsoNormal style='text-align:left;direction:ltr;unicode-bidi:embed'>
if False: eval("")<o:p></o:p></p>
<p class=MsoNormal style='text-align:left;direction:ltr;unicode-bidi:embed'>
<o:p></o:p></p>
<p class=MsoNormal style='text-align:left;direction:ltr;unicode-bidi:embed'>
just_numbers = range(1,1000)<o:p></o:p></p>
<p class=MsoNormal style='text-align:left;direction:ltr;unicode-bidi:embed'>
yield None<o:p></o:p></p>
<p class=MsoNormal style='text-align:left;direction:ltr;unicode-bidi:embed'>
yield None<o:p></o:p></p>
<p class=MsoNormal style='text-align:left;direction:ltr;unicode-bidi:embed'><span
dir=RTL></span><span lang=HE dir=RTL style='font-family:"Arial","sans-serif"'><span
dir=RTL></span> </span><o:p></o:p></p>
<p class=MsoNormal style='text-align:left;direction:ltr;unicode-bidi:embed'>
from System import GC<o:p></o:p></p>
<p class=MsoNormal style='text-align:left;direction:ltr;unicode-bidi:embed'>
def get_memory():<o:p></o:p></p>
<p class=MsoNormal style='text-align:left;direction:ltr;unicode-bidi:embed'>
for _ in xrange(4):<o:p></o:p></p>
<p class=MsoNormal style='text-align:left;direction:ltr;unicode-bidi:embed'>
GC.Collect()<o:p></o:p></p>
<p class=MsoNormal style='text-align:left;direction:ltr;unicode-bidi:embed'>
GC.WaitForPendingFinalizers()<o:p></o:p></p>
<p class=MsoNormal style='text-align:left;direction:ltr;unicode-bidi:embed'>
return GC.GetTotalMemory(True)/1e6<o:p></o:p></p>
<p class=MsoNormal style='text-align:left;direction:ltr;unicode-bidi:embed'>
before = get_memory()<o:p></o:p></p>
<p class=MsoNormal style='text-align:left;direction:ltr;unicode-bidi:embed'>
for j in xrange(10000):<o:p></o:p></p>
<p class=MsoNormal style='text-align:left;direction:ltr;unicode-bidi:embed'>
crt = coroutine(False)<o:p></o:p></p>
<p class=MsoNormal style='text-align:left;direction:ltr;unicode-bidi:embed'>
crt.next()<o:p></o:p></p>
<p class=MsoNormal style='text-align:left;direction:ltr;unicode-bidi:embed'><span
dir=RTL></span><span lang=HE dir=RTL style='font-family:"Arial","sans-serif"'><span
dir=RTL></span> </span><o:p></o:p></p>
<p class=MsoNormal style='text-align:left;direction:ltr;unicode-bidi:embed'>
after = get_memory()<o:p></o:p></p>
<p class=MsoNormal style='text-align:left;direction:ltr;unicode-bidi:embed'>
self.assert_(after-before > 10,'There should be a memory leak in this case.before=%s
after=%s' % (before,after))<o:p></o:p></p>
<p class=MsoNormal style='text-align:left;direction:ltr;unicode-bidi:embed'> <o:p></o:p></p>
<p class=MsoNormal style='text-align:left;direction:ltr;unicode-bidi:embed'><u>Problem
3</u> <o:p></o:p></p>
<p class=MsoNormal style='text-align:left;direction:ltr;unicode-bidi:embed'>This
is actually a our solution to problems 1,2. We noticed that if we end the
iteration by using "throw" then the memory doesn’t rise on subsequent
instances. Still there some memory increase that depends on the size of the
local variable which doesn’t seem to go away:<o:p></o:p></p>
<p class=MsoNormal style='text-align:left;direction:ltr;unicode-bidi:embed'> <o:p></o:p></p>
<p class=MsoNormal style='text-align:left;direction:ltr;unicode-bidi:embed'>
def test_generator_memory_leak2(self):<o:p></o:p></p>
<p class=MsoNormal style='text-align:left;direction:ltr;unicode-bidi:embed'>
"""<o:p></o:p></p>
<p class=MsoNormal style='text-align:left;direction:ltr;unicode-bidi:embed'>
Ipy 2.6 when exiting a generator method with an exception, some
objects are never collected<o:p></o:p></p>
<p class=MsoNormal style='text-align:left;direction:ltr;unicode-bidi:embed'>
This seems to be static to the type (the leak does not grow if we
repeat the experiment<o:p></o:p></p>
<p class=MsoNormal style='text-align:left;direction:ltr;unicode-bidi:embed'>
"""<o:p></o:p></p>
<p class=MsoNormal style='text-align:left;direction:ltr;unicode-bidi:embed'>
def coroutine():<o:p></o:p></p>
<p class=MsoNormal style='text-align:left;direction:ltr;unicode-bidi:embed'>
just_numbers = range(1,1000000)<o:p></o:p></p>
<p class=MsoNormal style='text-align:left;direction:ltr;unicode-bidi:embed'>
def inner_method():<o:p></o:p></p>
<p class=MsoNormal style='text-align:left;direction:ltr;unicode-bidi:embed'>
return just_numbers<o:p></o:p></p>
<p class=MsoNormal style='text-align:left;direction:ltr;unicode-bidi:embed'>
yield None<o:p></o:p></p>
<p class=MsoNormal style='text-align:left;direction:ltr;unicode-bidi:embed'>
raise Exception("some exception") # comment out
this line to make the test not work<o:p></o:p></p>
<p class=MsoNormal style='text-align:left;direction:ltr;unicode-bidi:embed'>
from System import GC<o:p></o:p></p>
<p class=MsoNormal style='text-align:left;direction:ltr;unicode-bidi:embed'>
def get_memory():<o:p></o:p></p>
<p class=MsoNormal style='text-align:left;direction:ltr;unicode-bidi:embed'>
for _ in xrange(4):<o:p></o:p></p>
<p class=MsoNormal style='text-align:left;direction:ltr;unicode-bidi:embed'>
GC.Collect()<o:p></o:p></p>
<p class=MsoNormal style='text-align:left;direction:ltr;unicode-bidi:embed'>
GC.WaitForPendingFinalizers()<o:p></o:p></p>
<p class=MsoNormal style='text-align:left;direction:ltr;unicode-bidi:embed'>
return GC.GetTotalMemory(True)/1e6<o:p></o:p></p>
<p class=MsoNormal style='text-align:left;direction:ltr;unicode-bidi:embed'>
before = get_memory()<o:p></o:p></p>
<p class=MsoNormal style='text-align:left;direction:ltr;unicode-bidi:embed'>
crt = coroutine()<o:p></o:p></p>
<p class=MsoNormal style='text-align:left;direction:ltr;unicode-bidi:embed'>
try:<o:p></o:p></p>
<p class=MsoNormal style='text-align:left;direction:ltr;unicode-bidi:embed'>
crt.next()<o:p></o:p></p>
<p class=MsoNormal style='text-align:left;direction:ltr;unicode-bidi:embed'>
crt.next()<o:p></o:p></p>
<p class=MsoNormal style='text-align:left;direction:ltr;unicode-bidi:embed'>
except:<o:p></o:p></p>
<p class=MsoNormal style='text-align:left;direction:ltr;unicode-bidi:embed'>
pass<o:p></o:p></p>
<p class=MsoNormal style='text-align:left;direction:ltr;unicode-bidi:embed'>
crt = None<o:p></o:p></p>
<p class=MsoNormal style='text-align:left;direction:ltr;unicode-bidi:embed'>
after = get_memory()<o:p></o:p></p>
<p class=MsoNormal style='text-align:left;direction:ltr;unicode-bidi:embed'>
self.assert_(after-before > 10,'There should be a memory leak in this
case.before=%s after=%s' % (before,after))<o:p></o:p></p>
<p class=MsoNormal style='text-align:left;direction:ltr;unicode-bidi:embed'> <o:p></o:p></p>
<p class=MsoNormal style='text-align:left;direction:ltr;unicode-bidi:embed'> <o:p></o:p></p>
</div>
</div>
</div>
</body>
</html>