<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
  <meta content="text/html; charset=ISO-8859-1"
 http-equiv="Content-Type">
</head>
<body text="#000000" bgcolor="#ffffff">
Hi Jolyon
<blockquote cite="mid:007501cb8b8c$dcc659a0$96530ce0$@co.nz" type="cite">
  <meta http-equiv="Content-Type"
 content="text/html; charset=ISO-8859-1">
  <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:0cm;
        margin-bottom:.0001pt;
        font-size:12.0pt;
        font-family:"Times New Roman","serif";
        color:black;}
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-reply;
        font-family:"Calibri","sans-serif";
        color:#1F497D;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-size:10.0pt;}
@page WordSection1
        {size:612.0pt 792.0pt;
        margin:72.0pt 72.0pt 72.0pt 72.0pt;}
div.WordSection1
        {page:WordSection1;}
--></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]-->
  <div class="WordSection1">
  <p class="MsoNormal"><span
 style="font-size: 11pt; font-family: &quot;Calibri&quot;,&quot;sans-serif&quot;; color: rgb(31, 73, 125);">I
spotted that they fixed that a while ago &#8211; I remember having to fix the
issue myself many years ago so was quite pleased to see that it was now
taken care of in TInterfaceObject as a matter of course.&nbsp; For some
reason I never noticed the omission of the same facility in the
destructor.&nbsp; And yes, it&#8217;s a [potentially] big problem.<o:p></o:p></span></p>
  <p class="MsoNormal"><span
 style="font-size: 11pt; font-family: &quot;Calibri&quot;,&quot;sans-serif&quot;; color: rgb(31, 73, 125);"><o:p>&nbsp;</o:p></span></p>
  <p class="MsoNormal"><span
 style="font-size: 11pt; font-family: &quot;Calibri&quot;,&quot;sans-serif&quot;; color: rgb(31, 73, 125);">I
need to think about this tho... setting a fake ref count during
execution of the constructor is safe enough as you know precisely when
construction is done and to restore the ref count back to zero.<o:p></o:p></span></p>
  <p class="MsoNormal"><span
 style="font-size: 11pt; font-family: &quot;Calibri&quot;,&quot;sans-serif&quot;; color: rgb(31, 73, 125);"><o:p>&nbsp;</o:p></span></p>
  <p class="MsoNormal"><span
 style="font-size: 11pt; font-family: &quot;Calibri&quot;,&quot;sans-serif&quot;; color: rgb(31, 73, 125);">Setting
a fake ref count during destruction strikes me as more problematic and
makes me nervous, but I can&#8217;t quite put my finger on why.&nbsp; It might be
nothing.&nbsp; That doesn&#8217;t mean it can&#8217;t be fixed, only that the solution
put in place for construction might not work for destruction and it
wasn&#8217;t felt necessary to do any extra work for a more comprehensive
solution.<o:p></o:p></span></p>
  <p class="MsoNormal"><span
 style="font-size: 11pt; font-family: &quot;Calibri&quot;,&quot;sans-serif&quot;; color: rgb(31, 73, 125);"><o:p><br>
  </o:p></span></p>
  </div>
</blockquote>
I fixed it like this<br>
<br>
<small>procedure TamObject.BeforeDestruction;<br>
begin<br>
&nbsp; //add a reference count, in case an interface is acquired and
released during destruction<br>
&nbsp; InterlockedIncrement(FCount);<br>
&nbsp; inherited BeforeDestruction;<br>
end; <br>
<br>
procedure TamObject.FreeInstance;<br>
begin<br>
&nbsp; //remove the reference count added in </small><small>BeforeDestruction</small><br>
<small>&nbsp; InterlockedDecrement(FCount);<br>
&nbsp; assert(FCount = 0,'Destroying object with non-zero reference count');<br>
&nbsp; inherited FreeInstance;<br>
end;</small><br>
<br>
Of course, an interface can still not be referenced in descendant
BeforeDestruction methods, (since the inherited method is usually
called at the end), but can be safely referenced in the destructor.<br>
<br>
Todd.<br>
<blockquote cite="mid:007501cb8b8c$dcc659a0$96530ce0$@co.nz" type="cite">
  <div class="WordSection1">
  <p class="MsoNormal"><span
 style="font-size: 11pt; font-family: &quot;Calibri&quot;,&quot;sans-serif&quot;; color: rgb(31, 73, 125);"><o:p>&nbsp;</o:p></span></p>
  <p class="MsoNormal"><span
 style="font-size: 11pt; font-family: &quot;Calibri&quot;,&quot;sans-serif&quot;; color: rgb(31, 73, 125);">Certainly
in the case of my code where I fixed this I had specific &#8220;constructing&#8221;
/ &#8220;destructing&#8221; state markers (it wasn&#8217;t a general purpose
interfacedobject class but a base class in a far richer framework that
happened to also implement its own version of IUnknown) &#8211; I know I
didn&#8217;t rely on side effects of a faked ref count.<o:p></o:p></span></p>
  <p class="MsoNormal"><span
 style="font-size: 11pt; font-family: &quot;Calibri&quot;,&quot;sans-serif&quot;; color: rgb(31, 73, 125);"><o:p>&nbsp;</o:p></span></p>
  <p class="MsoNormal"><span
 style="font-size: 11pt; font-family: &quot;Calibri&quot;,&quot;sans-serif&quot;; color: rgb(31, 73, 125);"><o:p>&nbsp;</o:p></span></p>
  <div>
  <div
 style="border-style: solid none none; border-color: rgb(181, 196, 223) -moz-use-text-color -moz-use-text-color; border-width: 1pt medium medium; padding: 3pt 0cm 0cm;">
  <p class="MsoNormal"><b><span
 style="font-size: 10pt; font-family: &quot;Tahoma&quot;,&quot;sans-serif&quot;; color: windowtext;"
 lang="EN-US">From:</span></b><span
 style="font-size: 10pt; font-family: &quot;Tahoma&quot;,&quot;sans-serif&quot;; color: windowtext;"
 lang="EN-US"> <a class="moz-txt-link-abbreviated" href="mailto:delphi-bounces@delphi.org.nz">delphi-bounces@delphi.org.nz</a>
[<a class="moz-txt-link-freetext" href="mailto:delphi-bounces@delphi.org.nz">mailto:delphi-bounces@delphi.org.nz</a>] <b>On Behalf Of </b>Todd<br>
  <b>Sent:</b> Wednesday, 24 November 2010 16:55<br>
  <b>To:</b> NZ Borland Developers Group - Delphi List<br>
  <b>Subject:</b> [DUG] How's this for inconsistent<o:p></o:p></span></p>
  </div>
  </div>
  <p class="MsoNormal"><o:p>&nbsp;</o:p></p>
  <p class="MsoNormal">The Delphi developer who implemented
TInterfacedObject obviously considered the case when an interface
reference is grabbed during construction......<br>
  <br>
  <span style="font-size: 10pt;">// Set an implicit refcount so that
refcounting<br>
// during construction won't destroy the object.<br>
class function TInterfacedObject.NewInstance: TObject;<br>
begin<br>
&nbsp; Result := inherited NewInstance;<br>
&nbsp; TInterfacedObject(Result).FRefCount := 1;<br>
end;<br>
  <br>
procedure TInterfacedObject.AfterConstruction;<br>
begin<br>
// Release the constructor's implicit refcount<br>
&nbsp; InterlockedDecrement(FRefCount);<br>
end;</span><br>
  <br>
but didn't consider applying the same logic during destruction. So
grabing an interface reference during destruction causes all hell to
break loose, as the _Release method tries to free the object again and
again recursively.<br>
  <br>
  <span style="font-size: 10pt;">procedure
TInterfacedObject.BeforeDestruction;<br>
begin<br>
&nbsp; if RefCount &lt;&gt; 0 then<br>
&nbsp;&nbsp;&nbsp; Error(reInvalidPtr);<br>
end;</span><br>
  <br>
  <span style="font-size: 10pt;">function TInterfacedObject._Release:
Integer;<br>
begin<br>
&nbsp; Result := InterlockedDecrement(FRefCount);<br>
&nbsp; if Result = 0 then<br>
&nbsp;&nbsp;&nbsp; Destroy;<br>
end;</span><br>
  <br>
Todd.<o:p></o:p></p>
  </div>
  <pre wrap="">
<fieldset class="mimeAttachmentHeader"></fieldset>
_______________________________________________
NZ Borland Developers Group - Delphi mailing list
Post: <a class="moz-txt-link-abbreviated" href="mailto:delphi@delphi.org.nz">delphi@delphi.org.nz</a>
Admin: <a class="moz-txt-link-freetext" href="http://delphi.org.nz/mailman/listinfo/delphi">http://delphi.org.nz/mailman/listinfo/delphi</a>
Unsubscribe: send an email to <a class="moz-txt-link-abbreviated" href="mailto:delphi-request@delphi.org.nz">delphi-request@delphi.org.nz</a> with Subject: unsubscribe</pre>
</blockquote>
<br>
</body>
</html>