<span style="font-family:arial, sans-serif;font-size:13px;background-color:rgb(255, 255, 255)">Here is the first thread safety patch. Note that this patch depends on  prior refactoring patches I sent out. If you want to review it, you can go to:<div>


<br></div><div><a href="http://codereview.appspot.com/4667054" style="color:rgb(0, 0, 204)" target="_blank">http://codereview.appspot.com/4667054</a></div><div><br></div><div>Cheers,</div><div><br><font color="#888888">Caitlin</font></div>


</span><br><div class="gmail_quote">On Thu, Jun 30, 2011 at 5:57 PM, Caitlin Sadowski <span dir="ltr"><<a href="mailto:supertri@google.com" target="_blank">supertri@google.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">


The following is a proposal for a project we would like to contribute to Clang. Feel free to discuss.<div><br></div><div>Cheers,</div><div><br>Caitlin Sadowski</div><div>Google & University of California at Santa Cruz<br>



<div style="font-family:'Times New Roman';font-size:medium;background-color:transparent;margin-top:0px;margin-left:0px;margin-bottom:0px;margin-right:0px"><span style="font-size:14pt;font-family:Arial;color:rgb(0, 0, 0);background-color:transparent;font-weight:bold;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap"><br>



</span></div><div style="font-family:'Times New Roman';font-size:medium;background-color:transparent;margin-top:0px;margin-left:0px;margin-bottom:0px;margin-right:0px"><span style="font-size:14pt;font-family:Arial;color:rgb(0, 0, 0);background-color:transparent;font-weight:bold;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">Thread Safety Attributes for Clang</span><br>



<span style="font-size:11pt;font-family:Arial;color:rgb(0, 0, 0);background-color:transparent;font-weight:bold;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap"></span><br>



<span style="font-size:11pt;font-family:Arial;color:rgb(0, 0, 0);background-color:transparent;font-weight:bold;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">Summary</span><br>



<span style="font-size:11pt;font-family:Arial;color:rgb(0, 0, 0);background-color:transparent;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap"></span><br>
<span style="font-size:11pt;font-family:Arial;color:rgb(0, 0, 0);background-color:transparent;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">We would like to add a set of thread safety attributes to Clang. These attributes, based on a prior GCC implementation, will allow for checkable documentation of basic locking policies in multithreaded programs.  </span><br>



<span style="font-size:11pt;font-family:Arial;color:rgb(0, 0, 0);background-color:transparent;font-weight:bold;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap"></span><br>



<span style="font-size:11pt;font-family:Arial;color:rgb(0, 0, 0);background-color:transparent;font-weight:bold;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">Background</span><br>



<span style="font-size:11pt;font-family:Arial;color:rgb(0, 0, 0);background-color:transparent;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">The synchronization policies in modern multithreaded code may be poorly documented, and incorrectly inferred by new developers. Furthermore, when these policies are improperly followed they often lead to bugs which are difficult to reproduce and diagnose. One strategy for avoiding concurrency bugs is formal documentation of these synchronization policies. By writing this documentation using attribute-based annotations, Clang can mechanically check </span><span style="font-size:11pt;font-family:Arial;color:rgb(0, 0, 0);background-color:rgb(255, 255, 255);font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">and warn about issues that could potentially result in race conditions and deadlocks.</span><span style="font-size:11pt;font-family:Arial;color:rgb(0, 0, 0);background-color:transparent;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap"></span><br>



<span style="font-size:11pt;font-family:Arial;color:rgb(0, 0, 0);background-color:transparent;font-weight:bold;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap"></span><br>



<span style="font-size:11pt;font-family:Arial;color:rgb(0, 0, 0);background-color:transparent;font-weight:bold;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">Example</span><br>



<span style="font-size:11pt;font-family:Arial;color:rgb(0, 0, 0);background-color:transparent;font-weight:bold;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap"></span><br>



<span style="font-size:11pt;font-family:Arial;color:rgb(0, 0, 0);background-color:transparent;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">A code sample which demonstrates two of the proposed annotations is below. In this code sample, variables are protected by locks from the Mutex class. This class has been annotated to specify the API used to lock and unlock.</span><br>



<span style="font-size:11pt;font-family:Arial;color:rgb(0, 0, 0);background-color:transparent;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap"></span><br>
<span style="font-size:11pt;font-family:Arial;color:rgb(0, 0, 0);background-color:transparent;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">* </span><span style="font-size:11pt;font-family:'Courier New';color:rgb(0, 96, 0);background-color:rgb(255, 255, 255);font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">GUARDED_BY</span><span style="font-size:11pt;font-family:Arial;color:rgb(0, 0, 0);background-color:rgb(255, 255, 255);font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap"> specifies a particular lock should be held when accessing the annotated variable. Violations of this locking policy may lead to data races. </span><br>



<span style="font-size:11pt;font-family:Arial;color:rgb(0, 0, 0);background-color:rgb(255, 255, 255);font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">* </span><span style="font-size:11pt;font-family:Arial;color:rgb(0, 0, 0);background-color:transparent;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap"> </span><span style="font-size:11pt;font-family:'Courier New';color:rgb(0, 96, 0);background-color:rgb(255, 255, 255);font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">ACQUIRED_AFTER</span><span style="font-size:11pt;font-family:Arial;color:rgb(0, 0, 0);background-color:rgb(255, 255, 255);font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap"> annotations document the acquisition order between locks that can be held simultaneously by a thread, by specify the locks that need to be acquired before the annotated lock. Violations of this locking policy may lead to deadlocks.</span><span style="font-size:11pt;font-family:Arial;color:rgb(0, 0, 0);background-color:transparent;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap"></span><br>



<span style="font-size:11pt;font-family:Arial;color:rgb(0, 0, 0);background-color:transparent;font-weight:bold;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap"></span><br>



<span style="font-size:11pt;font-family:'Courier New';color:rgb(0, 0, 0);background-color:rgb(255, 255, 255);font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">  </span><span style="font-size:11pt;font-family:'Courier New';color:rgb(0, 102, 102);background-color:rgb(255, 255, 255);font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">1</span><span style="font-size:11pt;font-family:'Courier New';color:rgb(0, 0, 0);background-color:rgb(255, 255, 255);font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap"> </span><span style="font-size:11pt;font-family:'Courier New';color:rgb(136, 0, 0);background-color:rgb(255, 255, 255);font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">#include</span><span style="font-size:11pt;font-family:'Courier New';color:rgb(0, 0, 0);background-color:rgb(255, 255, 255);font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap"> </span><span style="font-size:11pt;font-family:'Courier New';color:rgb(0, 136, 0);background-color:rgb(255, 255, 255);font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">"thread_annotations.h"</span><br>



<span style="font-size:11pt;font-family:'Courier New';color:rgb(0, 0, 0);background-color:rgb(255, 255, 255);font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">  </span><span style="font-size:11pt;font-family:'Courier New';color:rgb(0, 102, 102);background-color:rgb(255, 255, 255);font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">2 </span><span style="font-size:11pt;font-family:'Courier New';color:rgb(136, 0, 0);background-color:rgb(255, 255, 255);font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">#define </span><span style="font-size:11pt;font-family:'Courier New';color:rgb(0, 96, 0);background-color:rgb(255, 255, 255);font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">GUARDED_BY</span><span style="font-size:11pt;font-family:'Courier New';color:rgb(102, 102, 0);background-color:rgb(255, 255, 255);font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">(</span><span style="font-size:11pt;font-family:'Courier New';color:rgb(0, 0, 0);background-color:rgb(255, 255, 255);font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">x</span><span style="font-size:11pt;font-family:'Courier New';color:rgb(102, 102, 0);background-color:rgb(255, 255, 255);font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">)</span><span style="font-size:11pt;font-family:'Courier New';color:rgb(0, 96, 0);background-color:rgb(255, 255, 255);font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap"> </span><span style="font-size:11pt;font-family:'Courier New';color:rgb(102, 0, 102);background-color:rgb(255, 255, 255);font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">__attribute__((</span><span style="font-size:11pt;font-family:'Courier New';color:rgb(0, 96, 0);background-color:rgb(255, 255, 255);font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">GUARDED_BY</span><span style="font-size:11pt;font-family:'Courier New';color:rgb(102, 102, 0);background-color:rgb(255, 255, 255);font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">(</span><span style="font-size:11pt;font-family:'Courier New';color:rgb(0, 0, 0);background-color:rgb(255, 255, 255);font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">x</span><span style="font-size:11pt;font-family:'Courier New';color:rgb(102, 102, 0);background-color:rgb(255, 255, 255);font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">)</span><span style="font-size:11pt;font-family:'Courier New';color:rgb(102, 0, 102);background-color:rgb(255, 255, 255);font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">))</span><br>



<span style="font-size:11pt;font-family:'Courier New';color:rgb(102, 0, 102);background-color:rgb(255, 255, 255);font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">  </span><span style="font-size:11pt;font-family:'Courier New';color:rgb(0, 102, 102);background-color:rgb(255, 255, 255);font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">3</span><span style="font-size:11pt;font-family:'Courier New';color:rgb(102, 0, 102);background-color:rgb(255, 255, 255);font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap"> </span><span style="font-size:11pt;font-family:'Courier New';color:rgb(136, 0, 0);background-color:rgb(255, 255, 255);font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">#define </span><span style="font-size:11pt;font-family:'Courier New';color:rgb(0, 96, 0);background-color:rgb(255, 255, 255);font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">ACQUIRED_AFTER</span><span style="font-size:11pt;font-family:'Courier New';color:rgb(102, 102, 0);background-color:rgb(255, 255, 255);font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">(</span><span style="font-size:11pt;font-family:'Courier New';color:rgb(0, 0, 0);background-color:rgb(255, 255, 255);font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">x</span><span style="font-size:11pt;font-family:'Courier New';color:rgb(102, 102, 0);background-color:rgb(255, 255, 255);font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">)</span><span style="font-size:11pt;font-family:'Courier New';color:rgb(0, 96, 0);background-color:rgb(255, 255, 255);font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap"> </span><span style="font-size:11pt;font-family:'Courier New';color:rgb(102, 0, 102);background-color:rgb(255, 255, 255);font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">__attribute__((</span><span style="font-size:11pt;font-family:'Courier New';color:rgb(0, 96, 0);background-color:rgb(255, 255, 255);font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">ACQUIRED_AFTER</span><span style="font-size:11pt;font-family:'Courier New';color:rgb(102, 102, 0);background-color:rgb(255, 255, 255);font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">(</span><span style="font-size:11pt;font-family:'Courier New';color:rgb(0, 0, 0);background-color:rgb(255, 255, 255);font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">x</span><span style="font-size:11pt;font-family:'Courier New';color:rgb(102, 102, 0);background-color:rgb(255, 255, 255);font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">)</span><span style="font-size:11pt;font-family:'Courier New';color:rgb(102, 0, 102);background-color:rgb(255, 255, 255);font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">))</span><span style="font-size:11pt;font-family:'Courier New';color:rgb(0, 102, 102);background-color:rgb(255, 255, 255);font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap"></span><br>



<span style="font-size:11pt;font-family:'Courier New';color:rgb(0, 0, 0);background-color:rgb(255, 255, 255);font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">  </span><span style="font-size:11pt;font-family:'Courier New';color:rgb(0, 102, 102);background-color:rgb(255, 255, 255);font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">4</span><br>



<span style="font-size:11pt;font-family:'Courier New';color:rgb(0, 0, 0);background-color:rgb(255, 255, 255);font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">  </span><span style="font-size:11pt;font-family:'Courier New';color:rgb(0, 102, 102);background-color:rgb(255, 255, 255);font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">5</span><span style="font-size:11pt;font-family:'Courier New';color:rgb(0, 0, 0);background-color:rgb(255, 255, 255);font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap"> </span><span style="font-size:11pt;font-family:'Courier New';color:rgb(102, 0, 102);background-color:rgb(255, 255, 255);font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">Mutex </span><span style="font-size:11pt;font-family:'Courier New';color:rgb(0, 0, 0);background-color:rgb(255, 255, 255);font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">mu1</span><span style="font-size:11pt;font-family:'Courier New';color:rgb(102, 102, 0);background-color:rgb(255, 255, 255);font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">;</span><br>



<span style="font-size:11pt;font-family:'Courier New';color:rgb(0, 0, 0);background-color:rgb(255, 255, 255);font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">  </span><span style="font-size:11pt;font-family:'Courier New';color:rgb(0, 102, 102);background-color:rgb(255, 255, 255);font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">6</span><span style="font-size:11pt;font-family:'Courier New';color:rgb(0, 0, 0);background-color:rgb(255, 255, 255);font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap"> </span><span style="font-size:11pt;font-family:'Courier New';color:rgb(102, 0, 102);background-color:rgb(255, 255, 255);font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">Mutex</span><span style="font-size:11pt;font-family:'Courier New';color:rgb(0, 0, 0);background-color:rgb(255, 255, 255);font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap"> mu2</span><span style="font-size:11pt;font-family:'Courier New';color:rgb(102, 0, 102);background-color:rgb(255, 255, 255);font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap"> </span><span style="font-size:11pt;font-family:'Courier New';color:rgb(0, 96, 0);background-color:rgb(255, 255, 255);font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">ACQUIRED_AFTER</span><span style="font-size:11pt;font-family:'Courier New';color:rgb(102, 102, 0);background-color:rgb(255, 255, 255);font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">(</span><span style="font-size:11pt;font-family:'Courier New';color:rgb(0, 0, 0);background-color:rgb(255, 255, 255);font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">mu1</span><span style="font-size:11pt;font-family:'Courier New';color:rgb(102, 102, 0);background-color:rgb(255, 255, 255);font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">);</span><br>



<span style="font-size:11pt;font-family:'Courier New';color:rgb(0, 0, 0);background-color:rgb(255, 255, 255);font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">  </span><span style="font-size:11pt;font-family:'Courier New';color:rgb(0, 102, 102);background-color:rgb(255, 255, 255);font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">7</span><br>



<span style="font-size:11pt;font-family:'Courier New';color:rgb(0, 0, 0);background-color:rgb(255, 255, 255);font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">  </span><span style="font-size:11pt;font-family:'Courier New';color:rgb(0, 102, 102);background-color:rgb(255, 255, 255);font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">8</span><span style="font-size:11pt;font-family:'Courier New';color:rgb(0, 0, 0);background-color:rgb(255, 255, 255);font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap"> </span><span style="font-size:11pt;font-family:'Courier New';color:rgb(0, 0, 136);background-color:rgb(255, 255, 255);font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">int</span><span style="font-size:11pt;font-family:'Courier New';color:rgb(0, 0, 0);background-color:rgb(255, 255, 255);font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap"> x</span><span style="font-size:11pt;font-family:'Courier New';color:rgb(102, 0, 102);background-color:rgb(255, 255, 255);font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap"> </span><span style="font-size:11pt;font-family:'Courier New';color:rgb(0, 96, 0);background-color:rgb(255, 255, 255);font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">GUARDED_BY</span><span style="font-size:11pt;font-family:'Courier New';color:rgb(102, 102, 0);background-color:rgb(255, 255, 255);font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">(</span><span style="font-size:11pt;font-family:'Courier New';color:rgb(0, 0, 0);background-color:rgb(255, 255, 255);font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">mu1</span><span style="font-size:11pt;font-family:'Courier New';color:rgb(102, 102, 0);background-color:rgb(255, 255, 255);font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">);</span><br>



<span style="font-size:11pt;font-family:'Courier New';color:rgb(0, 0, 0);background-color:rgb(255, 255, 255);font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">  </span><span style="font-size:11pt;font-family:'Courier New';color:rgb(0, 102, 102);background-color:rgb(255, 255, 255);font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">9</span><span style="font-size:11pt;font-family:'Courier New';color:rgb(0, 0, 0);background-color:rgb(255, 255, 255);font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap"> </span><span style="font-size:11pt;font-family:'Courier New';color:rgb(0, 0, 136);background-color:rgb(255, 255, 255);font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">int</span><span style="font-size:11pt;font-family:'Courier New';color:rgb(0, 0, 0);background-color:rgb(255, 255, 255);font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap"> a </span><span style="font-size:11pt;font-family:'Courier New';color:rgb(0, 96, 0);background-color:rgb(255, 255, 255);font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">GUARDED_BY</span><span style="font-size:11pt;font-family:'Courier New';color:rgb(102, 102, 0);background-color:rgb(255, 255, 255);font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">(</span><span style="font-size:11pt;font-family:'Courier New';color:rgb(0, 0, 0);background-color:rgb(255, 255, 255);font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">mu2</span><span style="font-size:11pt;font-family:'Courier New';color:rgb(102, 102, 0);background-color:rgb(255, 255, 255);font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">);</span><br>



<span style="font-size:11pt;font-family:'Courier New';color:rgb(0, 0, 0);background-color:rgb(255, 255, 255);font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">  </span><span style="font-size:11pt;font-family:'Courier New';color:rgb(0, 102, 102);background-color:rgb(255, 255, 255);font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">10</span><br>



<span style="font-size:11pt;font-family:'Courier New';color:rgb(0, 0, 0);background-color:rgb(255, 255, 255);font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">  </span><span style="font-size:11pt;font-family:'Courier New';color:rgb(0, 102, 102);background-color:rgb(255, 255, 255);font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">11</span><span style="font-size:11pt;font-family:'Courier New';color:rgb(0, 0, 0);background-color:rgb(255, 255, 255);font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap"> </span><span style="font-size:11pt;font-family:'Courier New';color:rgb(0, 0, 136);background-color:rgb(255, 255, 255);font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">void</span><span style="font-size:11pt;font-family:'Courier New';color:rgb(0, 0, 0);background-color:rgb(255, 255, 255);font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap"> foo</span><span style="font-size:11pt;font-family:'Courier New';color:rgb(102, 102, 0);background-color:rgb(255, 255, 255);font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">()</span><br>



<span style="font-size:11pt;font-family:'Courier New';color:rgb(0, 0, 0);background-color:rgb(255, 255, 255);font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap"> </span><span style="font-size:11pt;font-family:'Courier New';color:rgb(0, 102, 102);background-color:rgb(255, 255, 255);font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap"> 12</span><span style="font-size:11pt;font-family:'Courier New';color:rgb(0, 0, 0);background-color:rgb(255, 255, 255);font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap"> </span><span style="font-size:11pt;font-family:'Courier New';color:rgb(102, 102, 0);background-color:rgb(255, 255, 255);font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">{</span><br>



<span style="font-size:11pt;font-family:'Courier New';color:rgb(0, 0, 0);background-color:rgb(255, 255, 255);font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap"> </span><span style="font-size:11pt;font-family:'Courier New';color:rgb(0, 102, 102);background-color:rgb(255, 255, 255);font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">13</span><span style="font-size:11pt;font-family:'Courier New';color:rgb(0, 0, 0);background-color:rgb(255, 255, 255);font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">   mu2</span><span style="font-size:11pt;font-family:'Courier New';color:rgb(102, 102, 0);background-color:rgb(255, 255, 255);font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">.</span><span style="font-size:11pt;font-family:'Courier New';color:rgb(102, 0, 102);background-color:rgb(255, 255, 255);font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">Lock</span><span style="font-size:11pt;font-family:'Courier New';color:rgb(102, 102, 0);background-color:rgb(255, 255, 255);font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">();</span><br>



<span style="font-size:11pt;font-family:'Courier New';color:rgb(0, 0, 0);background-color:rgb(255, 255, 255);font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap"> </span><span style="font-size:11pt;font-family:'Courier New';color:rgb(0, 102, 102);background-color:rgb(255, 255, 255);font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">14</span><span style="font-size:11pt;font-family:'Courier New';color:rgb(0, 0, 0);background-color:rgb(255, 255, 255);font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">   mu1</span><span style="font-size:11pt;font-family:'Courier New';color:rgb(102, 102, 0);background-color:rgb(255, 255, 255);font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">.</span><span style="font-size:11pt;font-family:'Courier New';color:rgb(102, 0, 102);background-color:rgb(255, 255, 255);font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">Lock</span><span style="font-size:11pt;font-family:'Courier New';color:rgb(102, 102, 0);background-color:rgb(255, 255, 255);font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">();</span><br>



<span style="font-size:11pt;font-family:'Courier New';color:rgb(0, 0, 0);background-color:rgb(255, 255, 255);font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap"> </span><span style="font-size:11pt;font-family:'Courier New';color:rgb(0, 102, 102);background-color:rgb(255, 255, 255);font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">15</span><span style="font-size:11pt;font-family:'Courier New';color:rgb(0, 0, 0);background-color:rgb(255, 255, 255);font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">   </span><span style="font-size:11pt;font-family:'Courier New';color:rgb(0, 0, 136);background-color:rgb(255, 255, 255);font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">if</span><span style="font-size:11pt;font-family:'Courier New';color:rgb(0, 0, 0);background-color:rgb(255, 255, 255);font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap"> </span><span style="font-size:11pt;font-family:'Courier New';color:rgb(102, 102, 0);background-color:rgb(255, 255, 255);font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">(</span><span style="font-size:11pt;font-family:'Courier New';color:rgb(0, 0, 0);background-color:rgb(255, 255, 255);font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">x </span><span style="font-size:11pt;font-family:'Courier New';color:rgb(102, 102, 0);background-color:rgb(255, 255, 255);font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">></span><span style="font-size:11pt;font-family:'Courier New';color:rgb(0, 0, 0);background-color:rgb(255, 255, 255);font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap"> </span><span style="font-size:11pt;font-family:'Courier New';color:rgb(0, 102, 102);background-color:rgb(255, 255, 255);font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">2</span><span style="font-size:11pt;font-family:'Courier New';color:rgb(102, 102, 0);background-color:rgb(255, 255, 255);font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">)</span><br>



<span style="font-size:11pt;font-family:'Courier New';color:rgb(0, 0, 0);background-color:rgb(255, 255, 255);font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap"> </span><span style="font-size:11pt;font-family:'Courier New';color:rgb(0, 102, 102);background-color:rgb(255, 255, 255);font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">16</span><span style="font-size:11pt;font-family:'Courier New';color:rgb(0, 0, 0);background-color:rgb(255, 255, 255);font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">     a </span><span style="font-size:11pt;font-family:'Courier New';color:rgb(102, 102, 0);background-color:rgb(255, 255, 255);font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">=</span><span style="font-size:11pt;font-family:'Courier New';color:rgb(0, 0, 0);background-color:rgb(255, 255, 255);font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap"> x </span><span style="font-size:11pt;font-family:'Courier New';color:rgb(102, 102, 0);background-color:rgb(255, 255, 255);font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">+</span><span style="font-size:11pt;font-family:'Courier New';color:rgb(0, 0, 0);background-color:rgb(255, 255, 255);font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap"> </span><span style="font-size:11pt;font-family:'Courier New';color:rgb(0, 102, 102);background-color:rgb(255, 255, 255);font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">1</span><span style="font-size:11pt;font-family:'Courier New';color:rgb(102, 102, 0);background-color:rgb(255, 255, 255);font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">;</span><br>



<span style="font-size:11pt;font-family:'Courier New';color:rgb(0, 0, 0);background-color:rgb(255, 255, 255);font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap"> </span><span style="font-size:11pt;font-family:'Courier New';color:rgb(0, 102, 102);background-color:rgb(255, 255, 255);font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">17</span><span style="font-size:11pt;font-family:'Courier New';color:rgb(0, 0, 0);background-color:rgb(255, 255, 255);font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">   </span><span style="font-size:11pt;font-family:'Courier New';color:rgb(0, 0, 136);background-color:rgb(255, 255, 255);font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">else</span><br>



<span style="font-size:11pt;font-family:'Courier New';color:rgb(0, 0, 0);background-color:rgb(255, 255, 255);font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap"> </span><span style="font-size:11pt;font-family:'Courier New';color:rgb(0, 102, 102);background-color:rgb(255, 255, 255);font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">18</span><span style="font-size:11pt;font-family:'Courier New';color:rgb(0, 0, 0);background-color:rgb(255, 255, 255);font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">     a </span><span style="font-size:11pt;font-family:'Courier New';color:rgb(102, 102, 0);background-color:rgb(255, 255, 255);font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">=</span><span style="font-size:11pt;font-family:'Courier New';color:rgb(0, 0, 0);background-color:rgb(255, 255, 255);font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap"> x </span><span style="font-size:11pt;font-family:'Courier New';color:rgb(102, 102, 0);background-color:rgb(255, 255, 255);font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">-</span><span style="font-size:11pt;font-family:'Courier New';color:rgb(0, 0, 0);background-color:rgb(255, 255, 255);font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap"> </span><span style="font-size:11pt;font-family:'Courier New';color:rgb(0, 102, 102);background-color:rgb(255, 255, 255);font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">1</span><span style="font-size:11pt;font-family:'Courier New';color:rgb(102, 102, 0);background-color:rgb(255, 255, 255);font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">;</span><br>



<span style="font-size:11pt;font-family:'Courier New';color:rgb(0, 0, 0);background-color:rgb(255, 255, 255);font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap"> </span><span style="font-size:11pt;font-family:'Courier New';color:rgb(0, 102, 102);background-color:rgb(255, 255, 255);font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">19</span><span style="font-size:11pt;font-family:'Courier New';color:rgb(0, 0, 0);background-color:rgb(255, 255, 255);font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">   mu1</span><span style="font-size:11pt;font-family:'Courier New';color:rgb(102, 102, 0);background-color:rgb(255, 255, 255);font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">.</span><span style="font-size:11pt;font-family:'Courier New';color:rgb(102, 0, 102);background-color:rgb(255, 255, 255);font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">Unlock</span><span style="font-size:11pt;font-family:'Courier New';color:rgb(102, 102, 0);background-color:rgb(255, 255, 255);font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">();</span><br>



<span style="font-size:11pt;font-family:'Courier New';color:rgb(0, 0, 0);background-color:rgb(255, 255, 255);font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap"> </span><span style="font-size:11pt;font-family:'Courier New';color:rgb(0, 102, 102);background-color:rgb(255, 255, 255);font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">20</span><span style="font-size:11pt;font-family:'Courier New';color:rgb(0, 0, 0);background-color:rgb(255, 255, 255);font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">   mu2</span><span style="font-size:11pt;font-family:'Courier New';color:rgb(102, 102, 0);background-color:rgb(255, 255, 255);font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">.</span><span style="font-size:11pt;font-family:'Courier New';color:rgb(102, 0, 102);background-color:rgb(255, 255, 255);font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">Unlock</span><span style="font-size:11pt;font-family:'Courier New';color:rgb(102, 102, 0);background-color:rgb(255, 255, 255);font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">();</span><br>



<span style="font-size:11pt;font-family:'Courier New';color:rgb(0, 0, 0);background-color:rgb(255, 255, 255);font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap"> </span><span style="font-size:11pt;font-family:'Courier New';color:rgb(0, 102, 102);background-color:rgb(255, 255, 255);font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">21</span><span style="font-size:11pt;font-family:'Courier New';color:rgb(0, 0, 0);background-color:rgb(255, 255, 255);font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap"> </span><span style="font-size:11pt;font-family:'Courier New';color:rgb(102, 102, 0);background-color:rgb(255, 255, 255);font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">}</span><span style="font-size:11pt;font-family:Arial;color:rgb(102, 102, 0);background-color:rgb(255, 255, 255);font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap"></span><br>



<span style="font-size:11pt;font-family:Arial;color:rgb(102, 102, 0);background-color:rgb(255, 255, 255);font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap"></span><br>



<span style="font-size:11pt;font-family:Arial;color:rgb(0, 0, 0);background-color:rgb(255, 255, 255);font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">Sample compiler output:</span><br>



<span style="font-size:11pt;font-family:'Courier New';color:rgb(0, 0, 0);background-color:rgb(255, 255, 255);font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">ex</span><span style="font-size:11pt;font-family:'Courier New';color:rgb(102, 102, 0);background-color:rgb(255, 255, 255);font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">.</span><span style="font-size:11pt;font-family:'Courier New';color:rgb(0, 0, 0);background-color:rgb(255, 255, 255);font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">cc</span><span style="font-size:11pt;font-family:'Courier New';color:rgb(102, 102, 0);background-color:rgb(255, 255, 255);font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">:</span><span style="font-size:11pt;font-family:'Courier New';color:rgb(0, 0, 0);background-color:rgb(255, 255, 255);font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap"> </span><span style="font-size:11pt;font-family:'Courier New';color:rgb(102, 0, 102);background-color:rgb(255, 255, 255);font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">In</span><span style="font-size:11pt;font-family:'Courier New';color:rgb(0, 0, 0);background-color:rgb(255, 255, 255);font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap"> </span><span style="font-size:11pt;font-family:'Courier New';color:rgb(0, 0, 136);background-color:rgb(255, 255, 255);font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">function</span><span style="font-size:11pt;font-family:'Courier New';color:rgb(0, 0, 0);background-color:rgb(255, 255, 255);font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap"> </span><span style="font-size:11pt;font-family:'Courier New';color:rgb(0, 136, 0);background-color:rgb(255, 255, 255);font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">'void foo()'</span><span style="font-size:11pt;font-family:'Courier New';color:rgb(102, 102, 0);background-color:rgb(255, 255, 255);font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">:</span><br>



<span style="font-size:11pt;font-family:'Courier New';color:rgb(0, 0, 0);background-color:rgb(255, 255, 255);font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">ex</span><span style="font-size:11pt;font-family:'Courier New';color:rgb(102, 102, 0);background-color:rgb(255, 255, 255);font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">.</span><span style="font-size:11pt;font-family:'Courier New';color:rgb(0, 0, 0);background-color:rgb(255, 255, 255);font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">cc</span><span style="font-size:11pt;font-family:'Courier New';color:rgb(102, 102, 0);background-color:rgb(255, 255, 255);font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">:</span><span style="font-size:11pt;font-family:'Courier New';color:rgb(0, 102, 102);background-color:rgb(255, 255, 255);font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">12</span><span style="font-size:11pt;font-family:'Courier New';color:rgb(102, 102, 0);background-color:rgb(255, 255, 255);font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">:</span><span style="font-size:11pt;font-family:'Courier New';color:rgb(0, 0, 0);background-color:rgb(255, 255, 255);font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap"> warning</span><span style="font-size:11pt;font-family:'Courier New';color:rgb(102, 102, 0);background-color:rgb(255, 255, 255);font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">:</span><span style="font-size:11pt;font-family:'Courier New';color:rgb(0, 0, 0);background-color:rgb(255, 255, 255);font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap"> </span><span style="font-size:11pt;font-family:'Courier New';color:rgb(102, 0, 102);background-color:rgb(255, 255, 255);font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">Lock</span><span style="font-size:11pt;font-family:'Courier New';color:rgb(0, 0, 0);background-color:rgb(255, 255, 255);font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap"> </span><span style="font-size:11pt;font-family:'Courier New';color:rgb(0, 136, 0);background-color:rgb(255, 255, 255);font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">'mu1'</span><span style="font-size:11pt;font-family:'Courier New';color:rgb(0, 0, 0);background-color:rgb(255, 255, 255);font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap"> </span><span style="font-size:11pt;font-family:'Courier New';color:rgb(0, 0, 136);background-color:rgb(255, 255, 255);font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">is</span><span style="font-size:11pt;font-family:'Courier New';color:rgb(0, 0, 0);background-color:rgb(255, 255, 255);font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap"> acquired after </span><span style="font-size:11pt;font-family:'Courier New';color:rgb(0, 0, 136);background-color:rgb(255, 255, 255);font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">lock</span><span style="font-size:11pt;font-family:'Courier New';color:rgb(0, 0, 0);background-color:rgb(255, 255, 255);font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap"> </span><span style="font-size:11pt;font-family:'Courier New';color:rgb(0, 136, 0);background-color:rgb(255, 255, 255);font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">'mu2'</span><span style="font-size:11pt;font-family:'Courier New';color:rgb(0, 0, 0);background-color:rgb(255, 255, 255);font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap"> </span><span style="font-size:11pt;font-family:'Courier New';color:rgb(102, 102, 0);background-color:rgb(255, 255, 255);font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">(</span><span style="font-size:11pt;font-family:'Courier New';color:rgb(0, 0, 0);background-color:rgb(255, 255, 255);font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">acquired at line </span><span style="font-size:11pt;font-family:'Courier New';color:rgb(0, 102, 102);background-color:rgb(255, 255, 255);font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">14</span><span style="font-size:11pt;font-family:'Courier New';color:rgb(102, 102, 0);background-color:rgb(255, 255, 255);font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">)</span><span style="font-size:11pt;font-family:'Courier New';color:rgb(0, 0, 0);background-color:rgb(255, 255, 255);font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap"> but </span><span style="font-size:11pt;font-family:'Courier New';color:rgb(0, 0, 136);background-color:rgb(255, 255, 255);font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">is</span><span style="font-size:11pt;font-family:'Courier New';color:rgb(0, 0, 0);background-color:rgb(255, 255, 255);font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap"> annotated otherwise</span><span style="font-size:11pt;font-family:Arial;color:rgb(0, 0, 0);background-color:rgb(255, 255, 255);font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap"></span><br>



<span style="font-size:11pt;font-family:Arial;color:rgb(0, 0, 0);background-color:transparent;font-weight:bold;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap"></span><br>



<span style="font-size:11pt;font-family:Arial;color:rgb(0, 0, 0);background-color:transparent;font-weight:bold;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">Previous Work</span><br>



<span style="font-size:11pt;font-family:Arial;color:rgb(0, 0, 0);background-color:transparent;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap"></span><br>
<span style="font-size:11pt;font-family:Arial;color:rgb(0, 0, 0);background-color:transparent;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">As mentioned, thread safety annotations have been implemented in GCC. A full list of the annotations and descriptions for them can be found here:</span><br>



<span style="font-size:11pt;font-family:Arial;color:rgb(0, 0, 0);background-color:transparent;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap"></span><br>
<a href="http://gcc.gnu.org/wiki/ThreadSafetyAnnotation" target="_blank"><span style="font-size:11pt;font-family:Arial;color:rgb(0, 0, 153);background-color:transparent;font-style:normal;font-variant:normal;text-decoration:underline;vertical-align:baseline;white-space:pre-wrap">http://gcc.gnu.org/wiki/ThreadSafetyAnnotation</span></a><span style="font-size:11pt;font-family:Arial;color:rgb(0, 0, 0);background-color:transparent;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap"></span><br>



<a href="https://docs.google.com/a/google.com/Doc?id=ddqtfwhb_0c49t6zgr" target="_blank"><span style="font-size:11pt;font-family:Arial;color:rgb(0, 0, 153);background-color:transparent;font-style:normal;font-variant:normal;text-decoration:underline;vertical-align:baseline;white-space:pre-wrap">https://docs.google.com/a/google.com/Doc?id=ddqtfwhb_0c49t6zgr</span></a><span style="font-size:11pt;font-family:Arial;color:rgb(0, 0, 0);background-color:transparent;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap"></span><br>



<span style="font-size:11pt;font-family:Arial;color:rgb(0, 0, 0);background-color:transparent;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap"></span><br>
<span style="font-size:11pt;font-family:Arial;color:rgb(0, 0, 0);background-color:transparent;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">These annotations have been in active use in Google’s C++ codebase for a couple of years, so there is a large informal case study of their usefulness. The ideas behind many of these annotations come originally from a research paper [1].</span><span style="font-size:11pt;font-family:Arial;color:rgb(0, 0, 0);background-color:transparent;font-weight:bold;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap"></span><br>



<span style="font-size:11pt;font-family:Arial;color:rgb(0, 0, 0);background-color:transparent;font-weight:bold;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap"></span><br>



<span style="font-size:11pt;font-family:Arial;color:rgb(0, 0, 0);background-color:transparent;font-weight:bold;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">Plan</span><span style="font-size:11pt;font-family:Arial;color:rgb(0, 0, 0);background-color:transparent;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap"></span><br>



<span style="font-size:11pt;font-family:Arial;color:rgb(0, 0, 0);background-color:transparent;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap"></span><br>
<span style="font-size:11pt;font-family:Arial;color:rgb(0, 0, 0);background-color:transparent;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">We are planning to re-implement the GCC thread safety attributes in Clang. We will submit a series of patches to the cfe-commits mailing list. Our current plan for this serie is as follows:</span><br>



<span style="font-size:11pt;font-family:Arial;color:rgb(0, 0, 0);background-color:transparent;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap"></span><br>
<span style="font-size:11pt;font-family:Arial;color:rgb(0, 0, 0);background-color:transparent;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">1) Basic parsing and semantic checking of the attributes which do not take arguments. In other words, checking whether the attribute is applied in the appropriate context (e.g. to a field, with no arguments).</span><br>



<span style="font-size:11pt;font-family:Arial;color:rgb(0, 0, 0);background-color:transparent;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">2) Basic parsing and semantic checking of the attributes which do take arguments, but without parsing or checking the arguments themselves. At this point, we will simply discard the tokens making up the arguments. </span><br>



<span style="font-size:11pt;font-family:Arial;color:rgb(0, 0, 0);background-color:transparent;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">3) Attribute argument parsing.</span><br>



<span style="font-size:11pt;font-family:Arial;color:rgb(0, 0, 0);background-color:transparent;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">4) Adding the thread safety analysis checks. We will teach the static analysis-based warnings layer to warn for violations of the annotations discussed on the links above. </span><br>



<span style="font-size:11pt;font-family:Arial;color:rgb(0, 0, 0);background-color:transparent;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap"></span><span style="font-size:11pt;font-family:Arial;color:rgb(0, 0, 0);background-color:transparent;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap"></span><br>



<span style="font-size:11pt;font-family:Arial;color:rgb(0, 0, 0);background-color:transparent;font-weight:bold;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">Future Projects</span><br>



<span style="font-size:11pt;font-family:Arial;color:rgb(0, 0, 0);background-color:transparent;font-weight:bold;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap"></span><br>



<span style="font-size:11pt;font-family:Arial;color:rgb(0, 0, 0);background-color:transparent;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">Once we have this core set of thread safety annotations implemented, we have several directions for future work we would like to pursue. These include supporting additional types of annotations. For example, we would like to extend the system to support annotations for functions which only touch thread-local data and atomic functions which always execute as if they are not interleaved with operations of other threads. We would also like to build an annotation inference system; this system would enable application of the thread safety analysis to large amounts of legacy code.</span><br>



<span style="font-size:11pt;font-family:Arial;color:rgb(0, 0, 0);background-color:transparent;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap"></span><br>
<span style="font-size:11pt;font-family:Arial;color:rgb(0, 0, 0);background-color:transparent;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">[1] C. Flanagan and S. N. Freund. Type-based race detection for Java. In Programming Language Design and Implementation (PLDI), June 2000.</span></div>



</div>
</blockquote></div><br>