<html xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=windows-1255">
<meta name=ProgId content=Word.Document>
<meta name=Generator content="Microsoft Word 10">
<meta name=Originator content="Microsoft Word 10">
<link rel=File-List href="cid:filelist.xml@01C5B986.AAF709C0">
<!--[if gte mso 9]><xml>
<o:OfficeDocumentSettings>
<o:DoNotRelyOnCSS/>
</o:OfficeDocumentSettings>
</xml><![endif]--><!--[if gte mso 9]><xml>
<w:WordDocument>
<w:SpellingState>Clean</w:SpellingState>
<w:DocumentKind>DocumentEmail</w:DocumentKind>
<w:EnvelopeVis/>
<w:Compatibility>
<w:BreakWrappedTables/>
<w:SnapToGridInCell/>
<w:WrapTextWithPunct/>
<w:UseAsianBreakRules/>
</w:Compatibility>
<w:BrowserLevel>MicrosoftInternetExplorer4</w:BrowserLevel>
</w:WordDocument>
</xml><![endif]-->
<style>
<!--
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{mso-style-parent:"";
margin:0in;
margin-bottom:.0001pt;
mso-pagination:widow-orphan;
font-size:12.0pt;
font-family:"Times New Roman";
mso-fareast-font-family:"Times New Roman";}
a:link, span.MsoHyperlink
{color:blue;
text-decoration:underline;
text-underline:single;}
a:visited, span.MsoHyperlinkFollowed
{color:purple;
text-decoration:underline;
text-underline:single;}
span.EmailStyle17
{mso-style-type:personal-compose;
mso-style-noshow:yes;
mso-ansi-font-size:10.0pt;
mso-bidi-font-size:10.0pt;
font-family:Arial;
mso-ascii-font-family:Arial;
mso-hansi-font-family:Arial;
mso-bidi-font-family:Arial;
color:windowtext;}
span.SpellE
{mso-style-name:"";
mso-spl-e:yes;}
@page Section1
{size:8.5in 11.0in;
margin:1.0in 1.25in 1.0in 1.25in;
mso-header-margin:.5in;
mso-footer-margin:.5in;
mso-paper-source:0;}
div.Section1
{page:Section1;}
/* List Definitions */
@list l0
{mso-list-id:926689165;
mso-list-type:hybrid;
mso-list-template-ids:-2038552954 1393855936 67698713 67698715 67698703 67698713 67698715 67698703 67698713 67698715;}
@list l0:level1
{mso-level-text:"%1\)";
mso-level-tab-stop:.5in;
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 10]>
<style>
/* Style Definitions */
table.MsoNormalTable
{mso-style-name:"Table Normal";
mso-tstyle-rowband-size:0;
mso-tstyle-colband-size:0;
mso-style-noshow:yes;
mso-style-parent:"";
mso-padding-alt:0in 5.4pt 0in 5.4pt;
mso-para-margin:0in;
mso-para-margin-bottom:.0001pt;
mso-pagination:widow-orphan;
font-size:10.0pt;
font-family:"Times New Roman";}
</style>
<![endif]-->
</head>
<body lang=EN-US link=blue vlink=purple style='tab-interval:.5in'>
<div class=Section1>
<p class=MsoNormal><font size=2 face=Arial><span style='font-size:10.0pt;
font-family:Arial'>This mail discusses the method of “reference
count” as a solution to the problem of the object life time problem. This
is actually a proposal to where we should try and reach in the future of our
stack.<o:p></o:p></span></font></p>
<p class=MsoNormal><font size=2 face=Arial><span style='font-size:10.0pt;
font-family:Arial'><o:p> </o:p></span></font></p>
<p class=MsoNormal><font size=2 face=Arial><span style='font-size:10.0pt;
font-family:Arial'>Simply speaking, the problem of object life time is how to
delete it on the right time. We have to note that if we fail to allocate an
object at all, this means that we have some memory leak. If a program continues
leaking memory, eventually the system will run out of memory. The fact that
this doesn’t happen immediately makes it even harder to spot this type of
problem. For server side programs this behavior is not acceptable. On the other
hand, if we remove the object from memory, and than use this memory (for
example by some other thread, or by some call back) a different kind of problem
will be introduced. If we are lucky, an immediate access violation exception
will be thrown (we are “lucky”, since we know that we have a
problem with this object), if not that lucky, our memory will be corrupted, and
we will find the problems latter (much harder to debug). <o:p></o:p></span></font></p>
<p class=MsoNormal><font size=2 face=Arial><span style='font-size:10.0pt;
font-family:Arial'><o:p> </o:p></span></font></p>
<p class=MsoNormal><font size=2 face=Arial><span style='font-size:10.0pt;
font-family:Arial'>One approach to solve this problem is to have a “per
problem” logic that solves it. For example, if our object is a
“connection” that holds some kind of “ports” (the ports
might start operations that eventually do call backs on the connection), and is
being hold by a session (that might call the connection) then we should have a
counter of the ports as well as some information about calls that the session
has called us. When the count of ports drops to zero, and our state of the
session is also “good” we might delete the connection. Many flags
are usually involved in holding information about this logic (In shutdown, In
error, waiting for completion and so). <o:p></o:p></span></font></p>
<p class=MsoNormal><font size=2 face=Arial><span style='font-size:10.0pt;
font-family:Arial'>The main problem of this approach is that it is very error
pronoun. This logic is usually complicated, and not documented well. More than
this, any change that is introduced to the code means also changes to this
logic. As a result races are being found out many times (usually just before a
release). When the shutdown of the connection starts because of a different
reason (for example a system/application is being shutdown) a new set of flags
should be introduced. Each change to the program logic also means changes to
the logic of the objects shutdown.<o:p></o:p></span></font></p>
<p class=MsoNormal><font size=2 face=Arial><span style='font-size:10.0pt;
font-family:Arial'><o:p> </o:p></span></font></p>
<p class=MsoNormal><font size=2 face=Arial><span style='font-size:10.0pt;
font-family:Arial'>A different approach to solve this problem is garbage
collection. It is getting more and more popular today, especially due to the
growing popularity of managed code languages such as Java and C#. As the
performance of these languages is far from optimal, these languages (and
actually garbage collection) are not in the InfiniBand game.<o:p></o:p></span></font></p>
<p class=MsoNormal><font size=2 face=Arial><span style='font-size:10.0pt;
font-family:Arial'><o:p> </o:p></span></font></p>
<p class=MsoNormal><font size=2 face=Arial><span style='font-size:10.0pt;
font-family:Arial'>This mail introduces a generic approach to solve this family
of problems. As the subject of this mail suggests this is the method of
reference counting. Reference counting is a very simple yet extremely effective
mechanism for managing objects lifetime in a multithreaded environment<span
lang=AR-SA>ý</span>. It is used in many programs and the most popular of
them is probably in COM.<o:p></o:p></span></font></p>
<p class=MsoNormal><font size=2 face=Arial><span style='font-size:10.0pt;
font-family:Arial'>The big advantage of this method is that in each use of the
object one doesn’t have to think about the entire problem, rather it only
has to think of what he is doing with this object. Following a relatively
simple set of (per-function) rules ensures that the object is destroyed on the
correct place. The idea is similar to the idea of “the last person
leaving the room should turn the off the light”. Since the object is
actually counting the references to it, one should only tell the object when it
starts using it and when it has finished. Once finished, the object destroys it
self. <o:p></o:p></span></font></p>
<p class=MsoNormal><font size=2 face=Arial><span style='font-size:10.0pt;
font-family:Arial'><o:p> </o:p></span></font></p>
<p class=MsoNormal><font size=2 face=Arial><span style='font-size:10.0pt;
font-family:Arial'>Each object should implement three methods: 1) AddRef (), 2)
Release() and 3) <span class=SpellE>DestructMe</span>() (In C++ this is usually
the destructor). Any one who uses an object should call AddRef () before using
the object, and call Release() when he has finished working with the object.
The object has an integer filed that represents it reference count. The one who
creates the object creates it with a reference count of 1. When the reference
goes down to 0 the <span class=SpellE>DestructMe</span>() function is called
(implicitly) and the object is destroyed and it’s memory is being
released. This happens without the caller having nothing to know about the
object. <o:p></o:p></span></font></p>
<p class=MsoNormal><font size=2 face=Arial><span style='font-size:10.0pt;
font-family:Arial'><o:p> </o:p></span></font></p>
<p class=MsoNormal><font size=2 face=Arial><span style='font-size:10.0pt;
font-family:Arial'>In this page <a
href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/com/htm/com_1vxv.asp">http://msdn.microsoft.com/library/default.asp?url=/library/en-us/com/htm/com_1vxv.asp</a>
there are explicit rules of when to call AddRef() and Release(). <o:p></o:p></span></font></p>
<p class=MsoNormal><font size=2 face=Arial><span style='font-size:10.0pt;
font-family:Arial'><o:p> </o:p></span></font></p>
<p class=MsoNormal><font size=2 face=Arial><span style='font-size:10.0pt;
font-family:Arial'>Summery:<o:p></o:p></span></font></p>
<p class=MsoNormal style='margin-left:.5in;text-indent:-.25in;mso-list:l0 level1 lfo1;
tab-stops:list .5in'><![if !supportLists]><font size=2 face=Arial><span
style='font-size:10.0pt;font-family:Arial;mso-fareast-font-family:Arial'><span
style='mso-list:Ignore'>1)<font size=1 face="Times New Roman"><span
style='font:7.0pt "Times New Roman"'> </span></font></span></span></font><![endif]><span
dir=LTR><font size=2 face=Arial><span style='font-size:10.0pt;font-family:Arial'>When
ever an object is being referenced by some threads, consider seriously to use
reference count.<o:p></o:p></span></font></span></p>
<p class=MsoNormal style='margin-left:.5in;text-indent:-.25in;mso-list:l0 level1 lfo1;
tab-stops:list .5in'><![if !supportLists]><font size=2 face=Arial><span
style='font-size:10.0pt;font-family:Arial;mso-fareast-font-family:Arial'><span
style='mso-list:Ignore'>2)<font size=1 face="Times New Roman"><span
style='font:7.0pt "Times New Roman"'> </span></font></span></span></font><![endif]><span
dir=LTR><font size=2 face=Arial><span style='font-size:10.0pt;font-family:Arial'>Many
people have moved one step forward introducing automatic pointers. This
pointers do the AddRef and Release automatically, and therefore the user
doesn’t have to think about them at all. (As we are not working in C++
this is currently not relevant).<o:p></o:p></span></font></span></p>
<p class=MsoNormal style='margin-left:.5in;text-indent:-.25in;mso-list:l0 level1 lfo1;
tab-stops:list .5in'><![if !supportLists]><font size=2 face=Arial><span
style='font-size:10.0pt;font-family:Arial;mso-fareast-font-family:Arial'><span
style='mso-list:Ignore'>3)<font size=1 face="Times New Roman"><span
style='font:7.0pt "Times New Roman"'> </span></font></span></span></font><![endif]><span
dir=LTR><font size=2 face=Arial><span style='font-size:10.0pt;font-family:Arial'>A
good friend of mine used to say that if you don’t use reference counting
your program has a race (go find it!).<o:p></o:p></span></font></span></p>
<p class=MsoNormal><font size=2 face=Arial><span style='font-size:10.0pt;
font-family:Arial'><o:p> </o:p></span></font></p>
<p class=MsoNormal><font size=2 face=Arial><span style='font-size:10.0pt;
font-family:Arial'>Thanks<o:p></o:p></span></font></p>
<p class=MsoNormal><font size=2 face=Arial><span style='font-size:10.0pt;
font-family:Arial'>Tzachi<o:p></o:p></span></font></p>
<p class=MsoNormal><font size=2 face=Arial><span style='font-size:10.0pt;
font-family:Arial'><span style='mso-spacerun:yes'> </span><o:p></o:p></span></font></p>
<p class=MsoNormal><font size=2 face=Arial><span style='font-size:10.0pt;
font-family:Arial'><o:p> </o:p></span></font></p>
<p class=MsoNormal><font size=2 face=Arial><span style='font-size:10.0pt;
font-family:Arial'><o:p> </o:p></span></font></p>
<p class=MsoNormal><font size=2 face=Arial><span style='font-size:10.0pt;
font-family:Arial'><o:p> </o:p></span></font></p>
<p class=MsoNormal><font size=2 face=Arial><span style='font-size:10.0pt;
font-family:Arial'><o:p> </o:p></span></font></p>
<p class=MsoNormal><font size=2 face=Arial><span style='font-size:10.0pt;
font-family:Arial'><o:p> </o:p></span></font></p>
<p class=MsoNormal><font size=2 face=Arial><span style='font-size:10.0pt;
font-family:Arial'><o:p> </o:p></span></font></p>
<p class=MsoNormal><font size=2 face=Arial><span style='font-size:10.0pt;
font-family:Arial'><o:p> </o:p></span></font></p>
<p class=MsoNormal><font size=3 face="Times New Roman"><span style='font-size:
12.0pt'><o:p> </o:p></span></font></p>
<p class=MsoNormal><font size=2 face=Arial><span style='font-size:10.0pt;
font-family:Arial'><o:p> </o:p></span></font></p>
</div>
</body>
</html>