<html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; line-break: after-white-space;" class=""><h1 id="clang-thread-safety-analysis" style="-webkit-print-color-adjust: exact; margin: 20px 0px 10px; padding: 0px; -webkit-font-smoothing: antialiased; cursor: text; position: relative; font-size: 28px; color: black; font-family: Helvetica, arial, sans-serif;" class="">Clang Thread Safety Analysis</h1><p style="-webkit-print-color-adjust: exact; margin: 15px 0px; caret-color: rgb(0, 0, 0); color: rgb(0, 0, 0); font-family: Helvetica, arial, sans-serif; font-size: 14px;" class=""><code style="-webkit-print-color-adjust: exact; position: relative; display: inline; margin: 0px 2px; padding: 0px 5px; white-space: pre-wrap; border: 1px solid rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;" class="">WTF::Lock</code> now supports <a href="https://clang.llvm.org/docs/ThreadSafetyAnalysis.html" style="-webkit-print-color-adjust: exact; color: rgb(65, 131, 196);" class="">Clang Thread Safety Analysis</a>. It is a C++ language extension which warns about potential race conditions in code, at compile time. It is the same great Lock, but with some extra help from clang to make our multi-threaded code safer by giving out compilation errors when thread unsafe code is detected.</p><h2 id="annotations" style="-webkit-print-color-adjust: exact; margin: 20px 0px 10px; padding: 0px; -webkit-font-smoothing: antialiased; cursor: text; position: relative; font-size: 24px; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: rgb(204, 204, 204); color: black; font-family: Helvetica, arial, sans-serif;" class="">Annotations</h2><p style="-webkit-print-color-adjust: exact; margin: 15px 0px; caret-color: rgb(0, 0, 0); color: rgb(0, 0, 0); font-family: Helvetica, arial, sans-serif; font-size: 14px;" class="">Just by using WTF::Lock, Clang will already be able to do some basic validation. However, to take full advantage of it, there are a few annotations you should know about. Note that you'll see those annotations throughout the code base already as a few of us have been busy adopting them. All these annotations are declared in <a href="http://trac.webkit.org/browser/webkit/trunk/Source/WTF/wtf/ThreadSafetyAnalysis.h" style="-webkit-print-color-adjust: exact; color: rgb(65, 131, 196);" class="">wtf/ThreadSafetyAnalysis.h</a>.</p><h3 id="wtf_guarded_by_lock" style="-webkit-print-color-adjust: exact; margin: 20px 0px 10px; padding: 0px; -webkit-font-smoothing: antialiased; cursor: text; position: relative; font-size: 18px; caret-color: rgb(0, 0, 0); color: rgb(0, 0, 0); font-family: Helvetica, arial, sans-serif;" class="">WTF_GUARDED_BY_LOCK()</h3><p style="-webkit-print-color-adjust: exact; margin: 15px 0px; caret-color: rgb(0, 0, 0); color: rgb(0, 0, 0); font-family: Helvetica, arial, sans-serif; font-size: 14px;" class=""><code style="-webkit-print-color-adjust: exact; position: relative; display: inline; margin: 0px 2px; padding: 0px 5px; white-space: pre-wrap; border: 1px solid rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;" class="">WTF_GUARDED_BY_LOCK</code> is an attribute on data members, which declares that the data member is protected by the given lock. Read operations on the data require shared access, while write operations require exclusive access.</p><p style="-webkit-print-color-adjust: exact; margin: 15px 0px; caret-color: rgb(0, 0, 0); color: rgb(0, 0, 0); font-family: Helvetica, arial, sans-serif; font-size: 14px;" class=""><code style="-webkit-print-color-adjust: exact; position: relative; display: inline; margin: 0px 2px; padding: 0px 5px; white-space: pre-wrap; border: 1px solid rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;" class="">WTF_POINTEE_GUARDED_BY_LOCK</code> is similar, but is intended for use on pointers and smart pointers. There is no constraint on the data member itself, but the data that it points to is protected by the given lock.</p><pre style="-webkit-print-color-adjust: exact; margin-top: 15px; margin-bottom: 15px; background-color: rgb(248, 248, 248); border: 1px solid rgb(204, 204, 204); font-size: 13px; line-height: 19px; white-space: pre-wrap; overflow: auto; padding: 6px 10px; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; caret-color: rgb(0, 0, 0); color: rgb(0, 0, 0);" class=""><code class="c++ language-c++" style="-webkit-print-color-adjust: exact; position: relative; display: inline; margin: 0px; padding: 0px; border: none; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; text-shadow: white 0px 1px; font-family: Consolas, Monaco, "Andale Mono", "Ubuntu Mono", monospace; direction: ltr; word-spacing: normal; word-break: normal; word-wrap: normal; line-height: 1.5; tab-size: 4; -webkit-hyphens: none;"><span class="hljs-class" style="-webkit-print-color-adjust: exact;"><span class="hljs-keyword" style="-webkit-print-color-adjust: exact; color: rgb(170, 13, 145);">class</span> <span class="hljs-title" style="-webkit-print-color-adjust: exact; color: rgb(92, 38, 153);">Foo</span> {</span>
    Vector<String> <span class="hljs-function" style="-webkit-print-color-adjust: exact;">m_strings <span class="hljs-title" style="-webkit-print-color-adjust: exact; color: rgb(28, 0, 207);">WTF_GUARDED_BY_LOCK</span><span class="hljs-params" style="-webkit-print-color-adjust: exact; color: rgb(92, 38, 153);">(m_stringsLock)</span></span>;
    Lock m_stringsLock;
};</code></pre><p style="-webkit-print-color-adjust: exact; margin: 15px 0px; caret-color: rgb(0, 0, 0); color: rgb(0, 0, 0); font-family: Helvetica, arial, sans-serif; font-size: 14px;" class="">You will get a compiler error if you try to access or modify <code style="-webkit-print-color-adjust: exact; position: relative; display: inline; margin: 0px 2px; padding: 0px 5px; white-space: pre-wrap; border: 1px solid rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;" class="">m_strings</code> without grabbing the <code style="-webkit-print-color-adjust: exact; position: relative; display: inline; margin: 0px 2px; padding: 0px 5px; white-space: pre-wrap; border: 1px solid rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;" class="">m_stringsLock</code> lock first.</p><h3 id="wtf_requires_lock" style="-webkit-print-color-adjust: exact; margin: 20px 0px 10px; padding: 0px; -webkit-font-smoothing: antialiased; cursor: text; position: relative; font-size: 18px; caret-color: rgb(0, 0, 0); color: rgb(0, 0, 0); font-family: Helvetica, arial, sans-serif;" class="">WTF_REQUIRES_LOCK()</h3><p style="-webkit-print-color-adjust: exact; margin: 15px 0px; caret-color: rgb(0, 0, 0); color: rgb(0, 0, 0); font-family: Helvetica, arial, sans-serif; font-size: 14px;" class=""><code style="-webkit-print-color-adjust: exact; position: relative; display: inline; margin: 0px 2px; padding: 0px 5px; white-space: pre-wrap; border: 1px solid rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;" class="">WTF_REQUIRES_LOCK</code> is an attribute on functions or methods, which declares that the calling thread must have exclusive access to the given locks. More than one lock may be specified. The locks must be held on entry to the function, and must still be held on exit.</p><pre style="-webkit-print-color-adjust: exact; margin-top: 15px; margin-bottom: 15px; background-color: rgb(248, 248, 248); border: 1px solid rgb(204, 204, 204); font-size: 13px; line-height: 19px; white-space: pre-wrap; overflow: auto; padding: 6px 10px; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; caret-color: rgb(0, 0, 0); color: rgb(0, 0, 0);" class=""><code class="c++ language-c++" style="-webkit-print-color-adjust: exact; position: relative; display: inline; margin: 0px; padding: 0px; border: none; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; text-shadow: white 0px 1px; font-family: Consolas, Monaco, "Andale Mono", "Ubuntu Mono", monospace; direction: ltr; word-spacing: normal; word-break: normal; word-wrap: normal; line-height: 1.5; tab-size: 4; -webkit-hyphens: none;"><span class="hljs-class" style="-webkit-print-color-adjust: exact;"><span class="hljs-keyword" style="-webkit-print-color-adjust: exact; color: rgb(170, 13, 145);">class</span> <span class="hljs-title" style="-webkit-print-color-adjust: exact; color: rgb(92, 38, 153);">Foo</span> {</span>
    <span class="hljs-function" style="-webkit-print-color-adjust: exact;"><span class="hljs-keyword" style="-webkit-print-color-adjust: exact; color: rgb(170, 13, 145);">void</span> <span class="hljs-title" style="-webkit-print-color-adjust: exact; color: rgb(28, 0, 207);">addString</span><span class="hljs-params" style="-webkit-print-color-adjust: exact; color: rgb(92, 38, 153);">(String&&)</span> <span class="hljs-title" style="-webkit-print-color-adjust: exact; color: rgb(28, 0, 207);">WTF_REQUIRES_LOCK</span><span class="hljs-params" style="-webkit-print-color-adjust: exact; color: rgb(92, 38, 153);">(m_stringsLock)</span></span>;

    Vector<String> <span class="hljs-function" style="-webkit-print-color-adjust: exact;">m_strings <span class="hljs-title" style="-webkit-print-color-adjust: exact; color: rgb(28, 0, 207);">WTF_GUARDED_BY_LOCK</span><span class="hljs-params" style="-webkit-print-color-adjust: exact; color: rgb(92, 38, 153);">(m_stringsLock)</span></span>;
    Lock m_stringsLock;
};</code></pre><p style="-webkit-print-color-adjust: exact; margin: 15px 0px; caret-color: rgb(0, 0, 0); color: rgb(0, 0, 0); font-family: Helvetica, arial, sans-serif; font-size: 14px;" class="">You will get a compiler error if you try to call <code style="-webkit-print-color-adjust: exact; position: relative; display: inline; margin: 0px 2px; padding: 0px 5px; white-space: pre-wrap; border: 1px solid rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;" class="">addString()</code> without grabbing the <code style="-webkit-print-color-adjust: exact; position: relative; display: inline; margin: 0px 2px; padding: 0px 5px; white-space: pre-wrap; border: 1px solid rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;" class="">m_stringsLock</code> lock first. This also allows to compiler to know that the <code style="-webkit-print-color-adjust: exact; position: relative; display: inline; margin: 0px 2px; padding: 0px 5px; white-space: pre-wrap; border: 1px solid rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;" class="">addString()</code> implementation can modify the <code style="-webkit-print-color-adjust: exact; position: relative; display: inline; margin: 0px 2px; padding: 0px 5px; white-space: pre-wrap; border: 1px solid rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;" class="">m_strings</code> data member without grabbing the lock first.</p><p style="-webkit-print-color-adjust: exact; margin: 15px 0px; caret-color: rgb(0, 0, 0); color: rgb(0, 0, 0); font-family: Helvetica, arial, sans-serif; font-size: 14px;" class="">Another good use case:</p><pre style="-webkit-print-color-adjust: exact; margin-top: 15px; margin-bottom: 15px; background-color: rgb(248, 248, 248); border: 1px solid rgb(204, 204, 204); font-size: 13px; line-height: 19px; white-space: pre-wrap; overflow: auto; padding: 6px 10px; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; caret-color: rgb(0, 0, 0); color: rgb(0, 0, 0);" class=""><code class="c++ language-c++" style="-webkit-print-color-adjust: exact; position: relative; display: inline; margin: 0px; padding: 0px; border: none; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; text-shadow: white 0px 1px; font-family: Consolas, Monaco, "Andale Mono", "Ubuntu Mono", monospace; direction: ltr; word-spacing: normal; word-break: normal; word-wrap: normal; line-height: 1.5; tab-size: 4; -webkit-hyphens: none;"><span class="hljs-keyword" style="-webkit-print-color-adjust: exact; color: rgb(170, 13, 145);">static</span> Lock globalCacheLock;
<span class="hljs-keyword" style="-webkit-print-color-adjust: exact; color: rgb(170, 13, 145);">static</span> HashMap<String, String>& globalCache() WTF_REQUIRES_LOCK(globalCacheLock)
{
    <span class="hljs-keyword" style="-webkit-print-color-adjust: exact; color: rgb(170, 13, 145);">static</span> NeverDestroyed<HashMap<String, String>> globalCache;
    <span class="hljs-keyword" style="-webkit-print-color-adjust: exact; color: rgb(170, 13, 145);">return</span> globalCache;
}</code></pre><p style="-webkit-print-color-adjust: exact; margin: 15px 0px; caret-color: rgb(0, 0, 0); color: rgb(0, 0, 0); font-family: Helvetica, arial, sans-serif; font-size: 14px;" class="">This will force all call sites to grab the <code style="-webkit-print-color-adjust: exact; position: relative; display: inline; margin: 0px 2px; padding: 0px 5px; white-space: pre-wrap; border: 1px solid rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;" class="">globalCacheLock</code> lock before calling <code style="-webkit-print-color-adjust: exact; position: relative; display: inline; margin: 0px 2px; padding: 0px 5px; white-space: pre-wrap; border: 1px solid rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;" class="">globalCache()</code>.</p><p style="-webkit-print-color-adjust: exact; margin: 15px 0px; caret-color: rgb(0, 0, 0); color: rgb(0, 0, 0); font-family: Helvetica, arial, sans-serif; font-size: 14px;" class=""><strong style="-webkit-print-color-adjust: exact;" class="">Previously, we may have passed a <code style="-webkit-print-color-adjust: exact; position: relative; display: inline; margin: 0px 2px; padding: 0px 5px; white-space: pre-wrap; border: 1px solid rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;" class="">LockHolder&</code> as parameter to try and convey that. We have been updating code to stop passing such parameters though as it is no longer useful.</strong></p><h3 id="wtf_acquires_lock--wtf_releases_lock" style="-webkit-print-color-adjust: exact; margin: 20px 0px 10px; padding: 0px; -webkit-font-smoothing: antialiased; cursor: text; position: relative; font-size: 18px; caret-color: rgb(0, 0, 0); color: rgb(0, 0, 0); font-family: Helvetica, arial, sans-serif;" class="">WTF_ACQUIRES_LOCK() / WTF_RELEASES_LOCK()</h3><p style="-webkit-print-color-adjust: exact; margin: 15px 0px; caret-color: rgb(0, 0, 0); color: rgb(0, 0, 0); font-family: Helvetica, arial, sans-serif; font-size: 14px;" class=""><code style="-webkit-print-color-adjust: exact; position: relative; display: inline; margin: 0px 2px; padding: 0px 5px; white-space: pre-wrap; border: 1px solid rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;" class="">WTF_ACQUIRES_LOCK</code> is an attribute on functions or methods declaring that the function acquires a lock, but does not release it. The given lock must not be held on entry, and will be held on exit.</p><p style="-webkit-print-color-adjust: exact; margin: 15px 0px; caret-color: rgb(0, 0, 0); color: rgb(0, 0, 0); font-family: Helvetica, arial, sans-serif; font-size: 14px;" class=""><code style="-webkit-print-color-adjust: exact; position: relative; display: inline; margin: 0px 2px; padding: 0px 5px; white-space: pre-wrap; border: 1px solid rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;" class="">WTF_RELEASES_LOCK</code> declares that the function releases the given lock. The lock must be held on entry, and will no longer be held on exit.</p><pre style="-webkit-print-color-adjust: exact; margin-top: 15px; margin-bottom: 15px; background-color: rgb(248, 248, 248); border: 1px solid rgb(204, 204, 204); font-size: 13px; line-height: 19px; white-space: pre-wrap; overflow: auto; padding: 6px 10px; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; caret-color: rgb(0, 0, 0); color: rgb(0, 0, 0);" class=""><code class="c++ language-c++" style="-webkit-print-color-adjust: exact; position: relative; display: inline; margin: 0px; padding: 0px; border: none; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; text-shadow: white 0px 1px; font-family: Consolas, Monaco, "Andale Mono", "Ubuntu Mono", monospace; direction: ltr; word-spacing: normal; word-break: normal; word-wrap: normal; line-height: 1.5; tab-size: 4; -webkit-hyphens: none;"><span class="hljs-class" style="-webkit-print-color-adjust: exact;"><span class="hljs-keyword" style="-webkit-print-color-adjust: exact; color: rgb(170, 13, 145);">class</span> <span class="hljs-title" style="-webkit-print-color-adjust: exact; color: rgb(92, 38, 153);">Foo</span> {</span>
<span class="hljs-keyword" style="-webkit-print-color-adjust: exact; color: rgb(170, 13, 145);">public</span>:
    <span class="hljs-function" style="-webkit-print-color-adjust: exact;"><span class="hljs-keyword" style="-webkit-print-color-adjust: exact; color: rgb(170, 13, 145);">void</span> <span class="hljs-title" style="-webkit-print-color-adjust: exact; color: rgb(28, 0, 207);">suspend</span><span class="hljs-params" style="-webkit-print-color-adjust: exact; color: rgb(92, 38, 153);">()</span> <span class="hljs-title" style="-webkit-print-color-adjust: exact; color: rgb(28, 0, 207);">WTF_ACQUIRES_LOCK</span><span class="hljs-params" style="-webkit-print-color-adjust: exact; color: rgb(92, 38, 153);">(m_suspensionLock)</span>
    </span>{
        m_suspensionLock.lock();
        m_isSuspended = <span class="hljs-literal" style="-webkit-print-color-adjust: exact; color: rgb(170, 13, 145);">true</span>;
    }
    <span class="hljs-function" style="-webkit-print-color-adjust: exact;"><span class="hljs-keyword" style="-webkit-print-color-adjust: exact; color: rgb(170, 13, 145);">void</span> <span class="hljs-title" style="-webkit-print-color-adjust: exact; color: rgb(28, 0, 207);">resume</span><span class="hljs-params" style="-webkit-print-color-adjust: exact; color: rgb(92, 38, 153);">()</span> <span class="hljs-title" style="-webkit-print-color-adjust: exact; color: rgb(28, 0, 207);">WTF_RELEASE_LOCK</span><span class="hljs-params" style="-webkit-print-color-adjust: exact; color: rgb(92, 38, 153);">(m_suspensionLock)</span>
    </span>{
        m_isSuspended = <span class="hljs-literal" style="-webkit-print-color-adjust: exact; color: rgb(170, 13, 145);">false</span>;
        m_suspensionLock.unlock();
    }

<span class="hljs-keyword" style="-webkit-print-color-adjust: exact; color: rgb(170, 13, 145);">private</span>:
    Lock m_suspensionLock;
    <span class="hljs-keyword" style="-webkit-print-color-adjust: exact; color: rgb(170, 13, 145);">bool</span> m_isSuspended;
};</code></pre><p style="-webkit-print-color-adjust: exact; margin: 15px 0px; caret-color: rgb(0, 0, 0); color: rgb(0, 0, 0); font-family: Helvetica, arial, sans-serif; font-size: 14px;" class="">Without these annotations, you'd get a compiler error stating that you failed to unlock <code style="-webkit-print-color-adjust: exact; position: relative; display: inline; margin: 0px 2px; padding: 0px 5px; white-space: pre-wrap; border: 1px solid rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;" class="">m_suspensionLock</code> before returning in <code style="-webkit-print-color-adjust: exact; position: relative; display: inline; margin: 0px 2px; padding: 0px 5px; white-space: pre-wrap; border: 1px solid rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;" class="">suspend()</code> and that you unlocked <code style="-webkit-print-color-adjust: exact; position: relative; display: inline; margin: 0px 2px; padding: 0px 5px; white-space: pre-wrap; border: 1px solid rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;" class="">m_suspensionLock</code> in <code style="-webkit-print-color-adjust: exact; position: relative; display: inline; margin: 0px 2px; padding: 0px 5px; white-space: pre-wrap; border: 1px solid rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;" class="">resume()</code> even though it was not previously locked.</p><h3 id="wtf_returns_lock" style="-webkit-print-color-adjust: exact; margin: 20px 0px 10px; padding: 0px; -webkit-font-smoothing: antialiased; cursor: text; position: relative; font-size: 18px; caret-color: rgb(0, 0, 0); color: rgb(0, 0, 0); font-family: Helvetica, arial, sans-serif;" class="">WTF_RETURNS_LOCK()</h3><p style="-webkit-print-color-adjust: exact; margin: 15px 0px; caret-color: rgb(0, 0, 0); color: rgb(0, 0, 0); font-family: Helvetica, arial, sans-serif; font-size: 14px;" class=""><code style="-webkit-print-color-adjust: exact; position: relative; display: inline; margin: 0px 2px; padding: 0px 5px; white-space: pre-wrap; border: 1px solid rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;" class="">WTF_RETURNS_LOCK</code> is an attribute on functions or methods, which declares that the function returns a reference to the given lock.</p><pre style="-webkit-print-color-adjust: exact; margin-top: 15px; margin-bottom: 15px; background-color: rgb(248, 248, 248); border: 1px solid rgb(204, 204, 204); font-size: 13px; line-height: 19px; white-space: pre-wrap; overflow: auto; padding: 6px 10px; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; caret-color: rgb(0, 0, 0); color: rgb(0, 0, 0);" class=""><code class="c++ language-c++" style="-webkit-print-color-adjust: exact; position: relative; display: inline; margin: 0px; padding: 0px; border: none; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; text-shadow: white 0px 1px; font-family: Consolas, Monaco, "Andale Mono", "Ubuntu Mono", monospace; direction: ltr; word-spacing: normal; word-break: normal; word-wrap: normal; line-height: 1.5; tab-size: 4; -webkit-hyphens: none;"><span class="hljs-class" style="-webkit-print-color-adjust: exact;"><span class="hljs-keyword" style="-webkit-print-color-adjust: exact; color: rgb(170, 13, 145);">class</span> <span class="hljs-title" style="-webkit-print-color-adjust: exact; color: rgb(92, 38, 153);">Foo</span> {</span>
<span class="hljs-keyword" style="-webkit-print-color-adjust: exact; color: rgb(170, 13, 145);">public</span>:
    <span class="hljs-function" style="-webkit-print-color-adjust: exact;">Lock& <span class="hljs-title" style="-webkit-print-color-adjust: exact; color: rgb(28, 0, 207);">lock</span><span class="hljs-params" style="-webkit-print-color-adjust: exact; color: rgb(92, 38, 153);">()</span> <span class="hljs-title" style="-webkit-print-color-adjust: exact; color: rgb(28, 0, 207);">WTF_RETURNS_LOCK</span><span class="hljs-params" style="-webkit-print-color-adjust: exact; color: rgb(92, 38, 153);">(m_lock)</span> </span>{ <span class="hljs-keyword" style="-webkit-print-color-adjust: exact; color: rgb(170, 13, 145);">return</span> m_lock; }
<span class="hljs-keyword" style="-webkit-print-color-adjust: exact; color: rgb(170, 13, 145);">private</span>:
    Lock m_lock;    
};</code></pre><h3 id="wtf_excludes_lock" style="-webkit-print-color-adjust: exact; margin: 20px 0px 10px; padding: 0px; -webkit-font-smoothing: antialiased; cursor: text; position: relative; font-size: 18px; caret-color: rgb(0, 0, 0); color: rgb(0, 0, 0); font-family: Helvetica, arial, sans-serif;" class="">WTF_EXCLUDES_LOCK()</h3><p style="-webkit-print-color-adjust: exact; margin: 15px 0px; caret-color: rgb(0, 0, 0); color: rgb(0, 0, 0); font-family: Helvetica, arial, sans-serif; font-size: 14px;" class=""><code style="-webkit-print-color-adjust: exact; position: relative; display: inline; margin: 0px 2px; padding: 0px 5px; white-space: pre-wrap; border: 1px solid rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;" class="">WTF_EXCLUDES_LOCK</code> is an attribute on functions or methods, which declares that the caller must not hold the given lock. This annotation is used to prevent deadlock. Many mutex implementations are not re-entrant, so deadlock can occur if the function acquires the mutex a second time.</p><pre style="-webkit-print-color-adjust: exact; margin-top: 15px; margin-bottom: 15px; background-color: rgb(248, 248, 248); border: 1px solid rgb(204, 204, 204); font-size: 13px; line-height: 19px; white-space: pre-wrap; overflow: auto; padding: 6px 10px; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; caret-color: rgb(0, 0, 0); color: rgb(0, 0, 0);" class=""><code class="c++ language-c++" style="-webkit-print-color-adjust: exact; position: relative; display: inline; margin: 0px; padding: 0px; border: none; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; text-shadow: white 0px 1px; font-family: Consolas, Monaco, "Andale Mono", "Ubuntu Mono", monospace; direction: ltr; word-spacing: normal; word-break: normal; word-wrap: normal; line-height: 1.5; tab-size: 4; -webkit-hyphens: none;"><span class="hljs-class" style="-webkit-print-color-adjust: exact;"><span class="hljs-keyword" style="-webkit-print-color-adjust: exact; color: rgb(170, 13, 145);">class</span> <span class="hljs-title" style="-webkit-print-color-adjust: exact; color: rgb(92, 38, 153);">Foo</span> {</span>
    <span class="hljs-function" style="-webkit-print-color-adjust: exact;"><span class="hljs-keyword" style="-webkit-print-color-adjust: exact; color: rgb(170, 13, 145);">void</span> <span class="hljs-title" style="-webkit-print-color-adjust: exact; color: rgb(28, 0, 207);">addString</span><span class="hljs-params" style="-webkit-print-color-adjust: exact; color: rgb(92, 38, 153);">(String&& <span class="hljs-built_in" style="-webkit-print-color-adjust: exact;">string</span>)</span> <span class="hljs-title" style="-webkit-print-color-adjust: exact; color: rgb(28, 0, 207);">WTF_EXCLUDES_LOCK</span><span class="hljs-params" style="-webkit-print-color-adjust: exact; color: rgb(92, 38, 153);">(m_stringsLock)</span>
    </span>{
        Locker locker { m_stringsLock };
        m_string.append(WTFMove(<span class="hljs-built_in" style="-webkit-print-color-adjust: exact; color: rgb(92, 38, 153);">string</span>));
    }
    Vector<String> <span class="hljs-function" style="-webkit-print-color-adjust: exact;">m_strings <span class="hljs-title" style="-webkit-print-color-adjust: exact; color: rgb(28, 0, 207);">WTF_GUARDED_BY_LOCK</span><span class="hljs-params" style="-webkit-print-color-adjust: exact; color: rgb(92, 38, 153);">(m_stringsLock)</span></span>;
    Lock m_stringsLock;
};</code></pre><h3 id="wtf_ignores_thread_safety_analysis" style="-webkit-print-color-adjust: exact; margin: 20px 0px 10px; padding: 0px; -webkit-font-smoothing: antialiased; cursor: text; position: relative; font-size: 18px; caret-color: rgb(0, 0, 0); color: rgb(0, 0, 0); font-family: Helvetica, arial, sans-serif;" class="">WTF_IGNORES_THREAD_SAFETY_ANALYSIS</h3><p style="-webkit-print-color-adjust: exact; margin: 15px 0px; caret-color: rgb(0, 0, 0); color: rgb(0, 0, 0); font-family: Helvetica, arial, sans-serif; font-size: 14px;" class=""><code style="-webkit-print-color-adjust: exact; position: relative; display: inline; margin: 0px 2px; padding: 0px 5px; white-space: pre-wrap; border: 1px solid rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;" class="">WTF_IGNORES_THREAD_SAFETY_ANALYSIS</code> is an attribute on functions or methods, which turns off thread safety checking for that method. It provides an escape hatch for functions which are either (1) deliberately thread-unsafe, or (2) are thread-safe, but too complicated for the analysis to understand. Reasons for (2) are be described in the <a href="https://clang.llvm.org/docs/ThreadSafetyAnalysis.html#limitations" style="-webkit-print-color-adjust: exact; color: rgb(65, 131, 196);" class="">Known Limitations</a>.</p><pre style="-webkit-print-color-adjust: exact; margin-top: 15px; margin-bottom: 15px; background-color: rgb(248, 248, 248); border: 1px solid rgb(204, 204, 204); font-size: 13px; line-height: 19px; white-space: pre-wrap; overflow: auto; padding: 6px 10px; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; caret-color: rgb(0, 0, 0); color: rgb(0, 0, 0);" class=""><code class="c++ language-c++" style="-webkit-print-color-adjust: exact; position: relative; display: inline; margin: 0px; padding: 0px; border: none; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; text-shadow: white 0px 1px; font-family: Consolas, Monaco, "Andale Mono", "Ubuntu Mono", monospace; direction: ltr; word-spacing: normal; word-break: normal; word-wrap: normal; line-height: 1.5; tab-size: 4; -webkit-hyphens: none;"><span class="hljs-class" style="-webkit-print-color-adjust: exact;"><span class="hljs-keyword" style="-webkit-print-color-adjust: exact; color: rgb(170, 13, 145);">class</span> <span class="hljs-title" style="-webkit-print-color-adjust: exact; color: rgb(92, 38, 153);">Foo</span> {</span>
    <span class="hljs-function" style="-webkit-print-color-adjust: exact;"><span class="hljs-keyword" style="-webkit-print-color-adjust: exact; color: rgb(170, 13, 145);">void</span> <span class="hljs-title" style="-webkit-print-color-adjust: exact; color: rgb(28, 0, 207);">unsafeIncrement</span><span class="hljs-params" style="-webkit-print-color-adjust: exact; color: rgb(92, 38, 153);">()</span> WTF_IGNORES_THREAD_SAFETY_ANALYSIS
    </span>{
        ++m_counter;
    }
    <span class="hljs-function" style="-webkit-print-color-adjust: exact;"><span class="hljs-keyword" style="-webkit-print-color-adjust: exact; color: rgb(170, 13, 145);">unsigned</span> m_counter <span class="hljs-title" style="-webkit-print-color-adjust: exact; color: rgb(28, 0, 207);">WTF_GUARDED_BY_LOCK</span><span class="hljs-params" style="-webkit-print-color-adjust: exact; color: rgb(92, 38, 153);">(m_counterLock)</span> </span>{ <span class="hljs-number" style="-webkit-print-color-adjust: exact; color: rgb(28, 0, 207);">0</span> };
    Lock m_counterLock;
};</code></pre><p style="-webkit-print-color-adjust: exact; margin: 15px 0px; caret-color: rgb(0, 0, 0); color: rgb(0, 0, 0); font-family: Helvetica, arial, sans-serif; font-size: 14px;" class=""><strong style="-webkit-print-color-adjust: exact;" class="">Unlike the other attributes, <code style="-webkit-print-color-adjust: exact; position: relative; display: inline; margin: 0px 2px; padding: 0px 5px; white-space: pre-wrap; border: 1px solid rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;" class="">WTF_IGNORES_THREAD_SAFETY_ANALYSIS</code> is not part of the interface of a function, and should thus be placed on the function definition (in the .cpp file) rather than on the function declaration (in the header).</strong></p><h3 id="assertisheld" style="-webkit-print-color-adjust: exact; margin: 20px 0px 10px; padding: 0px; -webkit-font-smoothing: antialiased; cursor: text; position: relative; font-size: 18px; caret-color: rgb(0, 0, 0); color: rgb(0, 0, 0); font-family: Helvetica, arial, sans-serif;" class="">assertIsHeld()</h3><p style="-webkit-print-color-adjust: exact; margin: 15px 0px; caret-color: rgb(0, 0, 0); color: rgb(0, 0, 0); font-family: Helvetica, arial, sans-serif; font-size: 14px;" class="">These are attributes on a function or method which asserts the calling thread already holds the given lock, for example by performing a run-time test and terminating if the lock is not held. Presence of this annotation causes the analysis to assume the lock is held after calls to the annotated function.</p><pre style="-webkit-print-color-adjust: exact; margin-top: 15px; margin-bottom: 15px; background-color: rgb(248, 248, 248); border: 1px solid rgb(204, 204, 204); font-size: 13px; line-height: 19px; white-space: pre-wrap; overflow: auto; padding: 6px 10px; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; caret-color: rgb(0, 0, 0); color: rgb(0, 0, 0);" class=""><code class="c++ language-c++" style="-webkit-print-color-adjust: exact; position: relative; display: inline; margin: 0px; padding: 0px; border: none; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; text-shadow: white 0px 1px; font-family: Consolas, Monaco, "Andale Mono", "Ubuntu Mono", monospace; direction: ltr; word-spacing: normal; word-break: normal; word-wrap: normal; line-height: 1.5; tab-size: 4; -webkit-hyphens: none;"><span class="hljs-class" style="-webkit-print-color-adjust: exact;"><span class="hljs-keyword" style="-webkit-print-color-adjust: exact; color: rgb(170, 13, 145);">class</span> <span class="hljs-title" style="-webkit-print-color-adjust: exact; color: rgb(92, 38, 153);">Foo</span> {</span>
    <span class="hljs-function" style="-webkit-print-color-adjust: exact;"><span class="hljs-keyword" style="-webkit-print-color-adjust: exact; color: rgb(170, 13, 145);">void</span> <span class="hljs-title" style="-webkit-print-color-adjust: exact; color: rgb(28, 0, 207);">waitForString</span><span class="hljs-params" style="-webkit-print-color-adjust: exact; color: rgb(92, 38, 153);">()</span>
    </span>{
        Locker locker { m_stringsLock };
        m_stringsCondition.wait(m_stringsLock, [&] {
            assertIsHeld(m_stringsLock); <span class="hljs-comment" style="-webkit-print-color-adjust: exact; color: rgb(0, 116, 0);">// Needed as the compiler is not able to tell we have the lock.</span>
            <span class="hljs-keyword" style="-webkit-print-color-adjust: exact; color: rgb(170, 13, 145);">return</span> !m_strings.isEmpty();
        });
    }

    <span class="hljs-function" style="-webkit-print-color-adjust: exact;"><span class="hljs-keyword" style="-webkit-print-color-adjust: exact; color: rgb(170, 13, 145);">void</span> <span class="hljs-title" style="-webkit-print-color-adjust: exact; color: rgb(28, 0, 207);">populateFromProviders</span><span class="hljs-params" style="-webkit-print-color-adjust: exact; color: rgb(92, 38, 153);">()</span>
    </span>{
        Locker locker { m_stringsLock };
        forEachProvider([&](Provider& provider) {
            assertIsHeld(m_stringsLock); <span class="hljs-comment" style="-webkit-print-color-adjust: exact; color: rgb(0, 116, 0);">// Needed as the compiler is not able to tell we have the lock.</span>
            m_strings.append(provider.pullStrings());
        });
    }

    Vector<String> <span class="hljs-function" style="-webkit-print-color-adjust: exact;">m_strings <span class="hljs-title" style="-webkit-print-color-adjust: exact; color: rgb(28, 0, 207);">WTF_GUARDED_BY_LOCK</span><span class="hljs-params" style="-webkit-print-color-adjust: exact; color: rgb(92, 38, 153);">(m_stringsLock)</span></span>;
    Lock m_stringsLock;
    Condition m_stringsCondition;
};</code></pre><p style="-webkit-print-color-adjust: exact; margin: 15px 0px; caret-color: rgb(0, 0, 0); color: rgb(0, 0, 0); font-family: Helvetica, arial, sans-serif; font-size: 14px;" class="">The most common case in WebKit is when you hold a lock in a function then have a lambda in this function that runs synchronously. Even though the lambda runs synchronously and you're holding the lock, the compiler doesn't know that. As a result, if the lambda tries to access a protected data member, you will get a compiler error unless you use <code style="-webkit-print-color-adjust: exact; position: relative; display: inline; margin: 0px 2px; padding: 0px 5px; white-space: pre-wrap; border: 1px solid rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;" class="">assertIsHeld()</code> at the beginning of the lambda.</p><h2 id="limitations" style="-webkit-print-color-adjust: exact; margin: 20px 0px 10px; padding: 0px; -webkit-font-smoothing: antialiased; cursor: text; position: relative; font-size: 24px; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: rgb(204, 204, 204); color: black; font-family: Helvetica, arial, sans-serif;" class="">Limitations</h2><p style="-webkit-print-color-adjust: exact; margin: 15px 0px; caret-color: rgb(0, 0, 0); color: rgb(0, 0, 0); font-family: Helvetica, arial, sans-serif; font-size: 14px;" class="">There are a few things Clang thread safety analysis is not able to do. You can find examples of these <a href="https://clang.llvm.org/docs/ThreadSafetyAnalysis.html#known-limitations" style="-webkit-print-color-adjust: exact; color: rgb(65, 131, 196);" class="">here</a>. I am also documenting below a few things that had to change in WebKit as a result.</p><h3 id="no-more-holdlock--tryholdlock" style="-webkit-print-color-adjust: exact; margin: 20px 0px 10px; padding: 0px; -webkit-font-smoothing: antialiased; cursor: text; position: relative; font-size: 18px; caret-color: rgb(0, 0, 0); color: rgb(0, 0, 0); font-family: Helvetica, arial, sans-serif;" class="">No more holdLock() / tryHoldLock()</h3><p style="-webkit-print-color-adjust: exact; margin: 15px 0px; caret-color: rgb(0, 0, 0); color: rgb(0, 0, 0); font-family: Helvetica, arial, sans-serif; font-size: 14px;" class=""><code style="-webkit-print-color-adjust: exact; position: relative; display: inline; margin: 0px 2px; padding: 0px 5px; white-space: pre-wrap; border: 1px solid rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;" class="">holdLock()</code> / <code style="-webkit-print-color-adjust: exact; position: relative; display: inline; margin: 0px 2px; padding: 0px 5px; white-space: pre-wrap; border: 1px solid rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;" class="">tryHoldLock()</code> were not compatible with Clang Thread Safety Analysis so we removed them. Instead, the following patterns are now recommended:</p><pre style="-webkit-print-color-adjust: exact; margin-top: 15px; margin-bottom: 15px; background-color: rgb(248, 248, 248); border: 1px solid rgb(204, 204, 204); font-size: 13px; line-height: 19px; white-space: pre-wrap; overflow: auto; padding: 6px 10px; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; caret-color: rgb(0, 0, 0); color: rgb(0, 0, 0);" class=""><code class="c++ language-c++" style="-webkit-print-color-adjust: exact; position: relative; display: inline; margin: 0px; padding: 0px; border: none; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; text-shadow: white 0px 1px; font-family: Consolas, Monaco, "Andale Mono", "Ubuntu Mono", monospace; direction: ltr; word-spacing: normal; word-break: normal; word-wrap: normal; line-height: 1.5; tab-size: 4; -webkit-hyphens: none;">    <span class="hljs-function" style="-webkit-print-color-adjust: exact;"><span class="hljs-keyword" style="-webkit-print-color-adjust: exact; color: rgb(170, 13, 145);">void</span> <span class="hljs-title" style="-webkit-print-color-adjust: exact; color: rgb(28, 0, 207);">foo</span><span class="hljs-params" style="-webkit-print-color-adjust: exact; color: rgb(92, 38, 153);">()</span>
    </span>{
        <span class="hljs-comment" style="-webkit-print-color-adjust: exact; color: rgb(0, 116, 0);">// Previously:</span>
        <span class="hljs-comment" style="-webkit-print-color-adjust: exact; color: rgb(0, 116, 0);">// auto locker = holdLock(m_lock);</span>
        Locker locker { m_lock }; <span class="hljs-comment" style="-webkit-print-color-adjust: exact; color: rgb(0, 116, 0);">// With C++17 the type of the Locker<T> is deduced based on type of m_lock.</span>
    }

    <span class="hljs-function" style="-webkit-print-color-adjust: exact;"><span class="hljs-keyword" style="-webkit-print-color-adjust: exact; color: rgb(170, 13, 145);">void</span> <span class="hljs-title" style="-webkit-print-color-adjust: exact; color: rgb(28, 0, 207);">bar</span><span class="hljs-params" style="-webkit-print-color-adjust: exact; color: rgb(92, 38, 153);">()</span>
    </span>{
        <span class="hljs-comment" style="-webkit-print-color-adjust: exact; color: rgb(0, 116, 0);">/*
        Previously:
        auto locker = tryHoldLock(m_lock);
        if (!locker)
            return;
        */</span>
        <span class="hljs-keyword" style="-webkit-print-color-adjust: exact; color: rgb(170, 13, 145);">if</span> (!m_lock.tryLock())
            <span class="hljs-keyword" style="-webkit-print-color-adjust: exact; color: rgb(170, 13, 145);">return</span>;
        Locker locker { AdoptLock, m_lock };
    }
}</code></pre><p style="-webkit-print-color-adjust: exact; margin: 15px 0px; caret-color: rgb(0, 0, 0); color: rgb(0, 0, 0); font-family: Helvetica, arial, sans-serif; font-size: 14px;" class="">In my opinion, the <code style="-webkit-print-color-adjust: exact; position: relative; display: inline; margin: 0px 2px; padding: 0px 5px; white-space: pre-wrap; border: 1px solid rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;" class="">tryHoldLock()</code> alternative is not as nice but it enables the safety analysis and we don't use <code style="-webkit-print-color-adjust: exact; position: relative; display: inline; margin: 0px 2px; padding: 0px 5px; white-space: pre-wrap; border: 1px solid rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;" class="">tryHoldLock()</code>very often in the code base. In the future, I believe we should be able to make something like this work:</p><pre style="-webkit-print-color-adjust: exact; margin-top: 15px; margin-bottom: 15px; background-color: rgb(248, 248, 248); border: 1px solid rgb(204, 204, 204); font-size: 13px; line-height: 19px; white-space: pre-wrap; overflow: auto; padding: 6px 10px; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; caret-color: rgb(0, 0, 0); color: rgb(0, 0, 0);" class=""><code class="c++ language-c++" style="-webkit-print-color-adjust: exact; position: relative; display: inline; margin: 0px; padding: 0px; border: none; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; text-shadow: white 0px 1px; font-family: Consolas, Monaco, "Andale Mono", "Ubuntu Mono", monospace; direction: ltr; word-spacing: normal; word-break: normal; word-wrap: normal; line-height: 1.5; tab-size: 4; -webkit-hyphens: none;">    <span class="hljs-function" style="-webkit-print-color-adjust: exact;"><span class="hljs-keyword" style="-webkit-print-color-adjust: exact; color: rgb(170, 13, 145);">void</span> <span class="hljs-title" style="-webkit-print-color-adjust: exact; color: rgb(28, 0, 207);">bar</span><span class="hljs-params" style="-webkit-print-color-adjust: exact; color: rgb(92, 38, 153);">()</span>
    </span>{
        Locker locker { DeferLock, m_lock };
        <span class="hljs-keyword" style="-webkit-print-color-adjust: exact; color: rgb(170, 13, 145);">if</span> (!locker.tryLock())
            <span class="hljs-keyword" style="-webkit-print-color-adjust: exact; color: rgb(170, 13, 145);">return</span>;
    }</code></pre><h3 id="lockerlock-is-no-longer-movable" style="-webkit-print-color-adjust: exact; margin: 20px 0px 10px; padding: 0px; -webkit-font-smoothing: antialiased; cursor: text; position: relative; font-size: 18px; caret-color: rgb(0, 0, 0); color: rgb(0, 0, 0); font-family: Helvetica, arial, sans-serif;" class=""><code style="-webkit-print-color-adjust: exact; position: relative; display: inline; margin: 0px 2px; padding: 0px 5px; white-space: pre-wrap; border: 1px solid rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; font-size: inherit;" class="">Locker<Lock></code> is no longer movable</h3><p style="-webkit-print-color-adjust: exact; margin: 15px 0px; caret-color: rgb(0, 0, 0); color: rgb(0, 0, 0); font-family: Helvetica, arial, sans-serif; font-size: 14px;" class="">To support Clang thread safety analysis, <code style="-webkit-print-color-adjust: exact; position: relative; display: inline; margin: 0px 2px; padding: 0px 5px; white-space: pre-wrap; border: 1px solid rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;" class="">Locker<Lock></code> no longer has a move constructor.</p><h3 id="lockerlock-can-no-longer-wrap-a-null-lock" style="-webkit-print-color-adjust: exact; margin: 20px 0px 10px; padding: 0px; -webkit-font-smoothing: antialiased; cursor: text; position: relative; font-size: 18px; caret-color: rgb(0, 0, 0); color: rgb(0, 0, 0); font-family: Helvetica, arial, sans-serif;" class=""><code style="-webkit-print-color-adjust: exact; position: relative; display: inline; margin: 0px 2px; padding: 0px 5px; white-space: pre-wrap; border: 1px solid rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; font-size: inherit;" class="">Locker<Lock></code> can no longer wrap a null Lock</h3><p style="-webkit-print-color-adjust: exact; margin: 15px 0px; caret-color: rgb(0, 0, 0); color: rgb(0, 0, 0); font-family: Helvetica, arial, sans-serif; font-size: 14px;" class="">This was used for conditional locking like so:</p><pre style="-webkit-print-color-adjust: exact; margin-top: 15px; margin-bottom: 15px; background-color: rgb(248, 248, 248); border: 1px solid rgb(204, 204, 204); font-size: 13px; line-height: 19px; white-space: pre-wrap; overflow: auto; padding: 6px 10px; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; caret-color: rgb(0, 0, 0); color: rgb(0, 0, 0);" class=""><code class="c++ language-c++" style="-webkit-print-color-adjust: exact; position: relative; display: inline; margin: 0px; padding: 0px; border: none; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; text-shadow: white 0px 1px; font-family: Consolas, Monaco, "Andale Mono", "Ubuntu Mono", monospace; direction: ltr; word-spacing: normal; word-break: normal; word-wrap: normal; line-height: 1.5; tab-size: 4; -webkit-hyphens: none;">Locker locker { shouldLock ? &m_lock : <span class="hljs-literal" style="-webkit-print-color-adjust: exact; color: rgb(170, 13, 145);">nullptr</span> };</code></pre><h2 id="whats-next" style="-webkit-print-color-adjust: exact; margin: 20px 0px 10px; padding: 0px; -webkit-font-smoothing: antialiased; cursor: text; position: relative; font-size: 24px; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: rgb(204, 204, 204); color: black; font-family: Helvetica, arial, sans-serif;" class="">What's next?</h2><p style="-webkit-print-color-adjust: exact; margin: 15px 0px; caret-color: rgb(0, 0, 0); color: rgb(0, 0, 0); font-family: Helvetica, arial, sans-serif; font-size: 14px;" class="">Please adopt annotations above in new code to improve thread safety in our code base. If you run into trouble adopting them or modifying code that already uses the annotations, please feel free to ask me or Kimmo for help as we've been porting a lot of the existing code. Hopefully this email is a good reference too.</p><p style="-webkit-print-color-adjust: exact; margin: 15px 0px; caret-color: rgb(0, 0, 0); color: rgb(0, 0, 0); font-family: Helvetica, arial, sans-serif; font-size: 14px;" class="">It was a fairly large project to adopt Clang thread safety analysis in WebKit and some things still need work / clean up:</p><ul style="-webkit-print-color-adjust: exact; margin: 15px 0px; padding-left: 30px; caret-color: rgb(0, 0, 0); color: rgb(0, 0, 0); font-family: Helvetica, arial, sans-serif; font-size: 14px;" class=""><li style="-webkit-print-color-adjust: exact; margin: 0px;" class=""><code style="-webkit-print-color-adjust: exact; position: relative; display: inline; margin: 0px 2px; padding: 0px 5px; white-space: pre-wrap; border: 1px solid rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;" class="">WTF::CheckedLock</code> is currently an alias to <code style="-webkit-print-color-adjust: exact; position: relative; display: inline; margin: 0px 2px; padding: 0px 5px; white-space: pre-wrap; border: 1px solid rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;" class="">WTF::Lock</code> and will go away very soon once no code is referencing it.</li><li style="-webkit-print-color-adjust: exact; margin: 0px;" class=""><code style="-webkit-print-color-adjust: exact; position: relative; display: inline; margin: 0px 2px; padding: 0px 5px; white-space: pre-wrap; border: 1px solid rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;" class="">WTF::UncheckedLock</code> is the previous version of the lock that did not support thread safety analysis and with its previous Locker. It is still used in WebKit in some places for now because code using it was either not trivial to port or we just did not have time to update it. Please avoid avoid using <code style="-webkit-print-color-adjust: exact; position: relative; display: inline; margin: 0px 2px; padding: 0px 5px; white-space: pre-wrap; border: 1px solid rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;" class="">WTF::UncheckedLock</code> in new code if you can. For now, the plan is to work towards moving all code from <code style="-webkit-print-color-adjust: exact; position: relative; display: inline; margin: 0px 2px; padding: 0px 5px; white-space: pre-wrap; border: 1px solid rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;" class="">WTF::UncheckedLock</code> to <code style="-webkit-print-color-adjust: exact; position: relative; display: inline; margin: 0px 2px; padding: 0px 5px; white-space: pre-wrap; border: 1px solid rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;" class="">WTF::Lock</code> but it may take some time, discussion and possibly some <code style="-webkit-print-color-adjust: exact; position: relative; display: inline; margin: 0px 2px; padding: 0px 5px; white-space: pre-wrap; border: 1px solid rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;" class="">Locker<Lock></code> changes. The main issue really has been the Locker API differences documented above. JavaScriptCore is by far the biggest user of <code style="-webkit-print-color-adjust: exact; position: relative; display: inline; margin: 0px 2px; padding: 0px 5px; white-space: pre-wrap; border: 1px solid rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;" class="">WTF::UncheckedLock</code> right now.</li><li style="-webkit-print-color-adjust: exact; margin: 0px;" class="">Even though we adopted annotations in many places already, more code can adopt it to improve thread safety.</li><li style="-webkit-print-color-adjust: exact; margin: 0px;" class="">Some code uses <code style="-webkit-print-color-adjust: exact; position: relative; display: inline; margin: 0px 2px; padding: 0px 5px; white-space: pre-wrap; border: 1px solid rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;" class="">WTF_IGNORES_THREAD_SAFETY_ANALYSIS</code> with FIXME comments indicating that it is likely not thread-safe. We need to review those and either make them thread-safe or clarify why it is OK as is.</li><li style="-webkit-print-color-adjust: exact; margin: 0px;" class="">We will likely try and make the <code style="-webkit-print-color-adjust: exact; position: relative; display: inline; margin: 0px 2px; padding: 0px 5px; white-space: pre-wrap; border: 1px solid rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;" class="">Locker<Lock></code> more flexible to support more use cases. We are a bit limited by what clang supports but I believe there is room of improvement.</li></ul><h2 id="credits" style="-webkit-print-color-adjust: exact; margin: 20px 0px 10px; padding: 0px; -webkit-font-smoothing: antialiased; cursor: text; position: relative; font-size: 24px; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: rgb(204, 204, 204); color: black; font-family: Helvetica, arial, sans-serif;" class="">Credits</h2><p style="-webkit-print-color-adjust: exact; margin-top: 15px; margin-right: 0px; margin-left: 0px; caret-color: rgb(0, 0, 0); color: rgb(0, 0, 0); font-family: Helvetica, arial, sans-serif; font-size: 14px; margin-bottom: 0px !important;" class="">Credits to Kimmo for introducing the checked Lock to WebKit and helping with the adoption!<br style="-webkit-print-color-adjust: exact;" class="">Big thanks to everyone who helped with reviews and feedback as well.</p><div class=""><br class=""></div><div class="">
<div style="color: rgb(0, 0, 0); letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><div style="color: rgb(0, 0, 0); letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><div style="color: rgb(0, 0, 0); letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><div style="color: rgb(0, 0, 0); letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><div class="">--</div><div class=""><span style="font-size: 13px;" class=""> </span>Chris Dumez</div></div></div></div><br class="Apple-interchange-newline"></div><br class="Apple-interchange-newline"><br class="Apple-interchange-newline">
</div>

<br class=""></body></html>