Review Request 121570: Kill util/spinlock.h, it is actually worse than QMutex in every case
Aleix Pol
aleixpol at kde.org
Wed Dec 17 16:55:08 UTC 2014
On Wed, Dec 17, 2014 at 2:11 PM, Alexander Richardson <
arichardson.kde at gmail.com> wrote:
>
> This is an automatically generated e-mail. To reply, visit:
> https://git.reviewboard.kde.org/r/121570/
> This change has been marked as submitted.
> Review request for KDevelop.
> By Alexander Richardson.
>
> *Updated Dec. 17, 2014, 1:11 p.m.*
> *Repository: * kdevplatform
> Description
>
> Kill util/spinlock.h, it is actually worse than QMutex in every case
>
> QMutex has changed a lot since this code was introduced and now has the
> same kind of logic as SpinLock internally, but implements it a lot more
> efficiently. Instead of requiring a QMutex::lock() call and a call to
> QWaitCondition::wait() (which is two more compare-and-swap instructions)
> it directly uses the futex() syscall.
>
> There are also a few problems with the spinlock code:
>
> -
>
> It spins using testAndSetOrdered() instead of testAndSetRelaxed().
> -
>
> There is also no need to unlock using sequentially consistent order,
> storeRelease() is enough.
> -
>
> Even worse is the fact that it uses compare-and-swap
> (QAtomicInt::testAndSet*()) for the spinlock, instead of test-and-set
> (QAtomicIn::fetchAndStore*()) which would be a lot faster.
> -
>
> For handling locking with timeout Spinlock uses gettimeofday() which is
> not availableon e.g. Windows.
> -
>
> Finally, the class is poorly named, it isn't a spinlock since it
> sleeps in every loop iteration instead of continuously attempting to
> acquire the lock.
>
> A class that actually tries spinning on the lock for a few iterations
> before taking the slow path that sleeps MIGHT improve the throughput.
> However, finding the right count is hard and will decrease performance
> if not chosen correctly.
>
> The easiest way to gain a bit of performance in the locking code would
> be to use QBasicMutex for all non-recursive QMutexes, since that would
> allow inlining of the fast path lock() code. But since the class is not
> documented as public we should probably not do that.
>
> REVIEW: 121570
>
> Testing
>
> Builds
>
> Diffs
>
> - language/backgroundparser/urlparselock.cpp
> (d113b66b3802818805f87c5b68b0b6f0c933f1f0)
> - language/duchain/duchain.h (9180cf13e9970b7dd3347ef757b741adab01b733)
> - util/spinlock.cpp (9b4deeee16ba15e1a9515189a441bc9bd4c1e30f)
> - util/spinlock.h (cbdb904e39679f136348cb5d6aa8af064c811baf)
> - serialization/referencecounting.h
> (3aa0244377f5cbcb128575585beefa98d7f41626)
> - serialization/referencecounting.cpp
> (6091c4003fea3573cef779b08b1d4d187c779a7d)
> - util/CMakeLists.txt (a2287bd2ae10d5e7fa64820e46aa514fa6d18cfe)
> - language/duchain/duchain.cpp
> (7ed779d37bcc7075011a901ab09c24522fb651d4)
>
> View Diff <https://git.reviewboard.kde.org/r/121570/diff/>
>
FWIW, I'm having huge UI freezes since I last upgraded. Have you tried
using it for a while?
Aleix
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.kde.org/pipermail/kdevelop-devel/attachments/20141217/00dd3793/attachment.html>
More information about the KDevelop-devel
mailing list