<div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote">On Tue, Nov 8, 2016 at 10:54 AM, christoph@ruediger.engineering via cfe-dev <span dir="ltr"><<a href="mailto:cfe-dev@lists.llvm.org" target="_blank">cfe-dev@lists.llvm.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Sorry for the incomplete mail; hit the wrong shortcut. The mail continues down below.<br>
<br>
Am 08.11.16, 19:38 schrieb "cfe-dev im Auftrag von <a href="mailto:cfe-dev@lists.llvm.org">cfe-dev@lists.llvm.org</a>" <<a href="mailto:cfe-dev-bounces@lists.llvm.org">cfe-dev-bounces@lists.llvm.<wbr>org</a> im Auftrag von <a href="mailto:cfe-dev@lists.llvm.org">cfe-dev@lists.llvm.org</a>>:<br>
<div><div class="h5"><br>
>Hi everyone,<br>
><br>
>this is my first post to this list, so please remind me if I’m violating your netiquette in some way.<br>
><br>
>I’m trying to introduce the thread safety analysis to one of our projects and stumble upon the missing thread safety annotations for unique_lock. I thought this might be easy, so let’s provide a patch. But now I’m stuck with correctly annotating the move constructor and the lock() and unlock() methods of unique_lock.<br>
><br>
>Here is a very basic implementation of my annotated unique_lock:<br>
><br>
>class SCOPED_CAPABILITY unique_lock {<br>
>  ::bluebox::mutex *mu;<br>
>  bool lock_held;<br>
>public:<br>
>  unique_lock() = delete;<br>
>  unique_lock(unique_lock &&) = delete;   // We cannot annotate move semantics<br>
><br>
>  explicit unique_lock(::bluebox::mutex &m) ACQUIRE(m) : mu(&m), lock_held(true) { m.lock(); }<br>
>  explicit unique_lock(::bluebox::mutex *m) ACQUIRE(m) : mu(m), lock_held(true) { m->lock(); }<br></div></div></blockquote><div><br></div><div>Change this to ACQUIRE(mu) instead of ACQUIRE(m).  The ACQUIRE and RELEASE annotations need to refer to the same variable for the thread safety analysis to work.</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div><div class="h5">
><br>
>  void unlock() RELEASE(mu) NO_THREAD_SAFETY_ANALYSIS {<br>
>    if (lock_held) {<br>
>      lock_held = false;<br>
>      mu->unlock();<br>
>    }<br>
>  }<br>
><br>
>  void lock() ACQUIRE(mu) NO_THREAD_SAFETY_ANALYSIS {<br>
>    if (!lock_held) {<br>
>      mu->lock();<br>
>      lock_held = true;<br>
>    }<br>
>  }<br>
><br>
>  ~unique_lock() RELEASE() NO_THREAD_SAFETY_ANALYSIS {<br>
>    if (lock_held)<br>
>      mu->unlock();<br>
>  }<br>
>};<br>
><br>
><br>
>And this is my test case:<br>
><br>
>static std::mutex mtx;<br>
>void someFunction() {<br>
>  my::unique_lock lock(mtx);<br>
>  // … Here you would normally do something meaningful<br>
>  lock.unlock();<br>
>  // … Call a method that might modify your protected data<br>
>  lock.lock();<br>
>  // … Continue with super important work<br>
>}<br>
><br>
>And here is my list of issues I can’t get around with:<br>
>1. How can I correctly annotate the unlock and lock methods? When using unlock() in the above example, clang throws this error: fatal error: releasing mutex<br>
>      '<a href="http://lock.mu" rel="noreferrer" target="_blank">lock.mu</a>' that was not held [-Wthread-safety-analysis]<br>
>2. How can I correctly annotate the move constructor of unique_lock?<br>
<br>
</div></div>3. I couldn’t find really that much valuable information about the annotations except for the one page in the clang documentation and a talk from DeLesly Hutchins. Plus the information, that the guys at Google are making heavy use of the thread safety analyzer. But are you really limiting yourself to std::mutex and std::lock_guard? You can’t even use std::condition_variable. Maybe one of the Google engineers on this list can shade some light without revealing confidential information.<br>
<br>
With these first tests in mind, I’m having troubles to use this really helpful feature in my projects. Anybody who wants to share some experience is appreciated. I will try to update the documentation accordingly or provide any other help.<br>
<br>
Thanks and regards,<br>
Christoph<br>
<div class="HOEnZb"><div class="h5"><br>
--<br>
rüdiger.engineering<br>
Christoph Rüdiger<br>
Düsseldorfer Str. 12<br>
45145 Essen<br>
Germany<br>
<br>
phone: <a href="tel:%2B49%20201%20458%20478%2058" value="+4920145847858">+49 201 458 478 58</a><br>
VAT ID/Ust. ID: DE304572498<br>
<br>
<br>
______________________________<wbr>_________________<br>
cfe-dev mailing list<br>
<a href="mailto:cfe-dev@lists.llvm.org">cfe-dev@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/<wbr>mailman/listinfo/cfe-dev</a><br>
<br>
______________________________<wbr>_________________<br>
cfe-dev mailing list<br>
<a href="mailto:cfe-dev@lists.llvm.org">cfe-dev@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/<wbr>mailman/listinfo/cfe-dev</a><br>
</div></div></blockquote></div><br></div></div>