<html><head><meta http-equiv="Content-Type" content="text/html; charset=us-ascii"><meta name="Generator" content="Microsoft Word 14 (filtered medium)"><style><!--
/* Font Definitions */
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 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;}
span.EmailStyle17
        {mso-style-type:personal-compose;
        font-family:"Calibri","sans-serif";
        color:windowtext;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-family:"Calibri","sans-serif";}
@page WordSection1
        {size:8.5in 11.0in;
        margin:1.0in 1.25in 1.0in 1.25in;}
div.WordSection1
        {page:WordSection1;}
--></style></head><body lang="EN-US" link="blue" vlink="purple"><div class="WordSection1"><p class="MsoNormal" style="text-align:left;direction:ltr;unicode-bidi:embed">Hi,</p><p class="MsoNormal" style="text-align:left;direction:ltr;unicode-bidi:embed">
I'm investigating memory leakage in a Ipy 2.6.1 application.</p><p class="MsoNormal" style="text-align:left;direction:ltr;unicode-bidi:embed">Using WinDbg I found a WeakDictionary that is only increasing in size, though most of the instances are already collected.</p>
<p class="MsoNormal" style="text-align:left;direction:ltr;unicode-bidi:embed">This WeakDicitionary is used by a DelegationInfo object.</p><p class="MsoNormal" style="text-align:left;direction:ltr;unicode-bidi:embed"> </p>
<p class="MsoNormal" style="text-align:left;direction:ltr;unicode-bidi:embed">Looking at the code, I think I found the problem:</p><p class="MsoNormal" style="text-align:left;direction:ltr;unicode-bidi:embed">The method CheckCleanup is called the method "<span style="font-size:10.0pt;font-family:"Courier New";color:blue">public</span><span style="font-size:10.0pt;font-family:"Courier New""> <span style="color:blue">void</span> Add(TKey key, TValue value)"</span></p>
<p class="MsoNormal" style="text-align:left;direction:ltr;unicode-bidi:embed"><b>But it NOT called</b> from the indexer:</p><p class="MsoNormal" style="text-align:left;direction:ltr;unicode-bidi:embed"> </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";color:blue">public</span><span style="font-size:10.0pt;font-family:"Courier New""> TValue <span style="color:blue">this</span>[TKey key] {</span></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">get</span> {</span></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">return</span> dict[key];</span></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></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">set</span> {</span></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">// If the WeakHash already holds this value as a key, it will lead to a circular-reference and result</span></span></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">// in the objects being kept alive forever. The caller needs to ensure that this cannot happen.</span></span></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">Debug</span>.Assert(!dict.ContainsKey(<span style="color:blue">value</span>));</span></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></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""> dict[<span style="color:blue">new</span> <span style="color:#2B91AF">WeakObject</span>(key)] = <span style="color:blue">value</span>;</span></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></p><p class="MsoNormal" style="text-align:left;direction:ltr;unicode-bidi:embed">
<span style="font-size:10.0pt;font-family:"Courier New""> }</span></p><p class="MsoNormal" style="text-align:left;direction:ltr;unicode-bidi:embed"> </p><p class="MsoNormal" style="text-align:left;direction:ltr;unicode-bidi:embed">
Since the dictionary is populated using the indexer in DelegateInfo:</p><p class="MsoNormal" style="text-align:left;direction:ltr;unicode-bidi:embed"><span style="font-size:10.0pt;font-family:"Courier New"">_constantMap[target] = <span style="color:blue">new</span> <span style="color:#2B91AF">WeakReference</span>(clone = (<span style="color:blue">object</span>[])_constants.Clone());</span></p>
<p class="MsoNormal" style="text-align:left;direction:ltr;unicode-bidi:embed"> </p><p class="MsoNormal" style="text-align:left;direction:ltr;unicode-bidi:embed">This means that the "version" field is never updated, and the dictionary never gets cleaned up.</p>
<p class="MsoNormal" style="text-align:left;direction:ltr;unicode-bidi:embed"> </p><p class="MsoNormal" style="text-align:left;direction:ltr;unicode-bidi:embed">Have I got something wrong here?</p><p class="MsoNormal" style="text-align:left;direction:ltr;unicode-bidi:embed">
Thanks</p></div></body></html>