<div dir="ltr"><br><div class="gmail_extra"><br><br><div class="gmail_quote">On Sat, May 4, 2013 at 8:50 AM, Edward Z. Yang <span dir="ltr">&lt;<a href="mailto:ezyang@cs.stanford.edu" target="_blank">ezyang@cs.stanford.edu</a>&gt;</span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Akio, your derefWeak WHITEHOLE fix looks really weird. I don&#39;t<br>
know what the right pattern is, but it seems like asking for trouble<br>
when there are multiple concurrent derefs:<br>
<br>
    if (info == stg_WHITEHOLE_info) {<br>
      (&quot;ptr&quot; info) = ccall lockClosure(w &quot;ptr&quot;);<br>
       unlockClosure(w, info);<br>
<div class="im">    }<br>
<br></div></blockquote><div><br>I don&#39;t see what the problem is, could you elaborate?<br><br>The purpose of the fix was to prevent a sequence like this:<br><br>- w is a dead weak pointer.<br>- Thread A: finalizeWeak# w.<br>
- Thread A: finalizeWeak#  calls lockClosure(w), overwriting w-&gt;info with stg_WHITEHOLE_info.<br>- Thread B: deRefWeak# w<br>- Thread B: deRefWeak# sees stg_WHITEHOLE_info, and since it&#39;s not the same as stg_DEAD_WEAK_info, it thinks w is alive.<br>
<br>The problem was that if deRefWeak# saw stg_WHITEHOLE_info, it was not clear whether the weak pointer was alive or not. So my fix adds a call to lockClosure, which never returns stg_WHITEHOLE_info.<br> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div class="im">
&gt; addForeignPtrFinalizer retries in this case.<br>
<br>
</div>This can&#39;t be right; a dead weak pointer always stays dead, so won&#39;t<br>
this infinite loop?<br></blockquote><div><br>No. When addForeignPtrFinalizer retries, it will use a new Weak# object, because foreignPtrFinalizer must have been replaced the content of the IORef.<br> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">

<div class="im"><br>
&gt; I haven&#39;t got around to looking at this, but I see Edward is on the case<br>
&gt; with some code review.  Do you think I should look at it before it goes in?<br>
<br>
</div>Now you&#39;re asking for it :)  I would always be interested in seeing if I<br>
missed anything.<br>
<br>
Cheers,<br>
Edward<br>
</blockquote></div><br></div></div>