<html>
<body>
<div style="font-family: Verdana, Arial, Helvetica, Sans-Serif;">
<table bgcolor="#f9f3c9" width="100%" cellpadding="8" style="border: 1px #c9c399 solid;">
<tr>
<td>
This is an automatically generated e-mail. To reply, visit:
<a href="https://reviewboard.asterisk.org/r/3716/">https://reviewboard.asterisk.org/r/3716/</a>
</td>
</tr>
</table>
<br />
<blockquote style="margin-left: 1em; border-left: 2px solid #d0d0d0; padding-left: 10px;">
<p style="margin-top: 0;">On July 15th, 2014, 2 p.m. MDT, <b>Corey Farrell</b> wrote:</p>
<blockquote style="margin-left: 1em; border-left: 2px solid #d0d0d0; padding-left: 10px;">
<pre style="white-space: pre-wrap; white-space: -moz-pre-wrap; white-space: -pre-wrap; white-space: -o-pre-wrap; word-wrap: break-word;">The ability to add an object to multiple weak reference containers is concerning to me. I think this adds unnecessary complexity/risk to astobj2. If you could tell me a use case where this amount of freedom is required I might be convinced otherwise. Otherwise I'd feel much better with a more limited ability to use weak reference containers:
1. Only allow the caller of ao2_alloc to add the object to a weak container, and only one container.
2. Insertion to the weak container should only happen before the object is reachable outside the local scope.
3. The weak container would be a private detail to the unit that owns it. All other code would use a method to retrieve references from that container.
These two rules would greatly reduce the possibility of races, which reduces the amount of work needed to avoid races. In particular rule #2 would allow ao2_ref to only perform locking during ao2_ref(obj, -1). I had started work on this in r3463 but discarded it when you started splitting astobj2.c.</pre>
</blockquote>
</blockquote>
<pre style="white-space: pre-wrap; white-space: -moz-pre-wrap; white-space: -pre-wrap; white-space: -o-pre-wrap; word-wrap: break-word;">We're going to disgree. :) I think this is a pretty severe restriction and it would be more complex to enforce the restriction than to safely allow it. How about this... If you can break it and I can't reasonably fix it, I'll back off. I know you're busy so just write a pseudo code test case, or just give me an idea for one and I'll create a unit test for it.</pre>
<br />
<p>- George</p>
<br />
<p>On July 7th, 2014, 10:43 p.m. MDT, George Joseph wrote:</p>
<table bgcolor="#fefadf" width="100%" cellspacing="0" cellpadding="8" style="background-image: url('https://reviewboard.asterisk.org/static/rb/images/review_request_box_top_bg.ab6f3b1072c9.png'); background-position: left top; background-repeat: repeat-x; border: 1px black solid;">
<tr>
<td>
<div>Review request for Asterisk Developers, Corey Farrell and rmudgett.</div>
<div>By George Joseph.</div>
<p style="color: grey;"><i>Updated July 7, 2014, 10:43 p.m.</i></p>
<div style="margin-top: 1.5em;">
<b style="color: #575012; font-size: 10pt;">Repository: </b>
Asterisk
</div>
<h1 style="color: #575012; font-size: 10pt; margin-top: 1.5em;">Description </h1>
<table width="100%" bgcolor="#ffffff" cellspacing="0" cellpadding="10" style="border: 1px solid #b8b5a0">
<tr>
<td>
<pre style="margin: 0; padding: 0; white-space: pre-wrap; white-space: -moz-pre-wrap; white-space: -pre-wrap; white-space: -o-pre-wrap; word-wrap: break-word;">Weak Reference Containers are hash containers that don't maintain references to the objects they contain.
Basically, ao2_link() doesn't increase the ref count and ao2_unlink() doesn't decrease it.
Sounds simple but because the container doesn't have a reference to the object, it's entirely possible that the objects could be destroyed while still in the container. Therefore much of the work in this patch is making sure that if the object is destroyed, it's properly cleaned out of any weak reference containers that it may have been in.
This patch is almost 6000 lines but half of it is units tests...functional, performance, and stress.
Richard: I apologize in advance...I undid some of the refactor undos you had me do earlier. :)</pre>
</td>
</tr>
</table>
<h1 style="color: #575012; font-size: 10pt; margin-top: 1.5em;">Testing </h1>
<table width="100%" bgcolor="#ffffff" cellspacing="0" cellpadding="10" style="border: 1px solid #b8b5a0">
<tr>
<td>
<pre style="margin: 0; padding: 0; white-space: pre-wrap; white-space: -moz-pre-wrap; white-space: -pre-wrap; white-space: -o-pre-wrap; word-wrap: break-word;">A whole slew of unit tests were added and the existing astobj2 tests were modified to also test weak containers. All passed.
A torture test was added that tests multiple threads accessing multiple containers for weak, hash and rbtree containers. All passed.
The full Testsuite was run with the same number of tests passing that passed before the patch.
</pre>
</td>
</tr>
</table>
<h1 style="color: #575012; font-size: 10pt; margin-top: 1.5em;">Diffs</b> </h1>
<ul style="margin-left: 3em; padding-left: 0;">
<li>branches/12/utils/Makefile <span style="color: grey">(418136)</span></li>
<li>branches/12/tests/test_astobj2_weak.c <span style="color: grey">(PRE-CREATION)</span></li>
<li>branches/12/tests/test_astobj2_torture.c <span style="color: grey">(PRE-CREATION)</span></li>
<li>branches/12/tests/test_astobj2_thrash.c <span style="color: grey">(418136)</span></li>
<li>branches/12/tests/test_astobj2.c <span style="color: grey">(418136)</span></li>
<li>branches/12/main/astobj2_weak.c <span style="color: grey">(PRE-CREATION)</span></li>
<li>branches/12/main/astobj2_rbtree.c <span style="color: grey">(418136)</span></li>
<li>branches/12/main/astobj2_private.h <span style="color: grey">(418136)</span></li>
<li>branches/12/main/astobj2_hash_private.h <span style="color: grey">(PRE-CREATION)</span></li>
<li>branches/12/main/astobj2_hash.c <span style="color: grey">(418136)</span></li>
<li>branches/12/main/astobj2_container_private.h <span style="color: grey">(418136)</span></li>
<li>branches/12/main/astobj2_container.c <span style="color: grey">(418136)</span></li>
<li>branches/12/main/astobj2.c <span style="color: grey">(418136)</span></li>
<li>branches/12/include/asterisk/astobj2.h <span style="color: grey">(418136)</span></li>
</ul>
<p><a href="https://reviewboard.asterisk.org/r/3716/diff/" style="margin-left: 3em;">View Diff</a></p>
</td>
</tr>
</table>
</div>
</body>
</html>