<table><tr><td style="">mswan added a comment.
</td><a style="text-decoration: none; padding: 4px 8px; margin: 0 8px 8px; float: right; color: #464C5C; font-weight: bold; border-radius: 3px; background-color: #F7F7F9; background-image: linear-gradient(to bottom,#fff,#f1f0f1); display: inline-block; border: 1px solid rgba(71,87,120,.2);" href="https://phabricator.kde.org/D22182">View Revision</a></tr></table><br /><div><div><blockquote style="border-left: 3px solid #8C98B8;
color: #6B748C;
font-style: italic;
margin: 4px 0 12px 0;
padding: 8px 12px;
background-color: #F8F9FC;">
<div style="font-style: normal;
padding-bottom: 4px;">In <a href="https://phabricator.kde.org/D22182#489868" style="background-color: #e7e7e7;
border-color: #e7e7e7;
border-radius: 3px;
padding: 0 4px;
font-weight: bold;
color: black;text-decoration: none;">D22182#489868</a>, <a href="https://phabricator.kde.org/p/aaronpuchert/" style="
border-color: #f1f7ff;
color: #19558d;
background-color: #f1f7ff;
border: 1px solid transparent;
border-radius: 3px;
font-weight: bold;
padding: 0 4px;">@aaronpuchert</a> wrote:</div>
<div style="margin: 0;
padding: 0;
border: 0;
color: rgb(107, 116, 140);"><blockquote style="border-left: 3px solid #a7b5bf; color: #464c5c; font-style: italic; margin: 4px 0 12px 0; padding: 4px 12px; background-color: #f8f9fc;"><p>I looked through all of the paths to the failed assertion discussed in that latter ticket and it appears that all but the invocation in PotentialBuddyCollector::accept is verified to have the reader lock held prior to invocation. There were two paths which needed a lock added given my change, so this change set should not cause any regression on bug #386901.</p></blockquote>
<p>I've always wondered whether Clang's <a href="https://clang.llvm.org/docs/ThreadSafetyAnalysis.html" class="remarkup-link" target="_blank" rel="noreferrer">Thread Safety Analysis</a> could be of any help in KDevelop, perhaps it is.</p></div>
</blockquote>
<p>I have never seen that and it seems pretty interesting. All that work I just did to find which paths to that <tt style="background: #ebebeb; font-size: 13px;">declaration</tt> function do not have adequate locking seemed like a fairly mechanical task that could have been automated. This should definitely be tried and I would be interested in the task. There is definitely quite alot of stuff that needs to be annotated to make this work so it might need several hands working on it. The one problem with adopting that system in KDevelop is that we copy <tt style="background: #ebebeb; font-size: 13px;">DUChain::lock()</tt> into each instance of <tt style="background: #ebebeb; font-size: 13px;">DUChain{Read,Write}Locker</tt> which means that our annotations wouldn't see the <tt style="background: #ebebeb; font-size: 13px;">DUChainReadLocker</tt> in one instance as the same lock in another instance. That said, I think this copying of <tt style="background: #ebebeb; font-size: 13px;">DUChain::lock()</tt> is actually a flaw with the DUChain locking system right now. The reason we do this copying of <tt style="background: #ebebeb; font-size: 13px;">DUChain::lock()</tt> instead of just making it a global variable or something is because <tt style="background: #ebebeb; font-size: 13px;">DUChain::lock()</tt> is stored in the static global variable <tt style="background: #ebebeb; font-size: 13px;">sdDUChainPrivate</tt> which is defined with <tt style="background: #ebebeb; font-size: 13px;">Q_GLOBAL_STATIC(DUChainPrivate, sdDUChainPrivate)</tt>. The aim of which is to reduce startup load time by not initializing <tt style="background: #ebebeb; font-size: 13px;">sdDUChainPrivate</tt> (i.e. the global object which contains this lock) until it is used for the first time, e.g. the first use of <tt style="background: #ebebeb; font-size: 13px;">DUChain::lock()</tt>. The reason we hide this lock in a private class in the first place is just to maintain a "separation of concerns." Several things can be done about this. We could keep this global static <tt style="background: #ebebeb; font-size: 13px;">DUChainPrivate</tt> thing as it is and create a fake global, like <tt style="background: #ebebeb; font-size: 13px;">g_DUChainLock</tt> or whatever and annotate all of these <tt style="background: #ebebeb; font-size: 13px;">DUChain{Read,Write}Locker</tt> instance method declarations with those Clang Thread Safety annotations, but don't actually ever use that global variable. Since I have never seen <tt style="background: #ebebeb; font-size: 13px;">DUChain{Read,Write}Locker</tt> used with anything other than <tt style="background: #ebebeb; font-size: 13px;">DUChain::lock()</tt> this shouldn't be cause for false positive deadlock detection. An alternative to this is to actually make our DUChain lock a global variable and keep it separate from this <tt style="background: #ebebeb; font-size: 13px;">DUChainPrivate</tt> state. This would eliminate some minuscule overhead in instantiation of our <tt style="background: #ebebeb; font-size: 13px;">DUChain{Read,Write}Lock</tt>'s and their respective locking and unlocking methods, but does make this lock a publicly visible entity.</p></div></div><br /><div><strong>REPOSITORY</strong><div><div>R32 KDevelop</div></div></div><br /><div><strong>REVISION DETAIL</strong><div><a href="https://phabricator.kde.org/D22182">https://phabricator.kde.org/D22182</a></div></div><br /><div><strong>To: </strong>mswan, KDevelop<br /><strong>Cc: </strong>aaronpuchert, kdevelop-devel, hmitonneau, christiant, glebaccon, domson, antismap, iodelay, alexeymin, geetamc, Pilzschaf, akshaydeo, surgenight, arrowd<br /></div>