Review Request: Make Sonnet::Speller::setLanguage threadsafe, fixing segfaults in krunner
David Faure
faure at kde.org
Thu Sep 6 13:29:39 BST 2012
-----------------------------------------------------------
This is an automatically generated e-mail. To reply, visit:
http://git.reviewboard.kde.org/r/106242/#review18623
-----------------------------------------------------------
A number of comments on the implementation, but also a more general comment: does it even make sense to use a Speller in multiple threads, and to change the language from one thread while another one is using the speller for spell-checking? It sounds like, even if a mutex/lock can prevent crashes, this is a weird thing to do anyway, since you have no idea at which point the spell-checking will switch to another language... could happen in the very middle of a sentence...
Maybe it would make more sense to "post" the language change operation to the spell-checking thread using the same mechanism as the one used to "post" spellchecking requests to it? (Disclaimer: I know nothing of the krunner architecture).
kdecore/sonnet/speller.cpp
<http://git.reviewboard.kde.org/r/106242/#comment14723>
if() before delete is unnecessary, please revert this change.
kdecore/sonnet/speller.cpp
<http://git.reviewboard.kde.org/r/106242/#comment14726>
That line is racy, if called from two different threads (copying a pointer is not atomic). If anything else, "helgrind" will warn for sure.
Move it inside the lock.
kdecore/sonnet/speller.cpp
<http://git.reviewboard.kde.org/r/106242/#comment14727>
This line is a no-op, remove it.
kdecore/sonnet/speller.cpp
<http://git.reviewboard.kde.org/r/106242/#comment14729>
const QString& lang = QString()
(missing const ref, missing spaces)
kdecore/sonnet/speller.cpp
<http://git.reviewboard.kde.org/r/106242/#comment14728>
coding style: if (lang.isEmpty()) {
(space after if, space before brace). Same thing on other lines below.
kdecore/sonnet/speller.cpp
<http://git.reviewboard.kde.org/r/106242/#comment14730>
If setLanguage is called from another thread as the thread using "lang", then this creates a race on "lang".
Protect it with a mutex.
More generally, it seems that all member variables here need mutex protection, not just dict. So I'd rename dictLock to lock, and use it for all members.
kdecore/sonnet/speller.cpp
<http://git.reviewboard.kde.org/r/106242/#comment14724>
See above. Delete NULL is perfectly valid (and no-op) in C++.
kdecore/sonnet/speller.cpp
<http://git.reviewboard.kde.org/r/106242/#comment14731>
spaces around =
kdecore/sonnet/speller.cpp
<http://git.reviewboard.kde.org/r/106242/#comment14725>
Please use QReadLocker instead. This will simplify the code, no need for the 3-liner return at the end of the method.
- David Faure
On Aug. 27, 2012, 9:33 p.m., Simeon Bird wrote:
>
> -----------------------------------------------------------
> This is an automatically generated e-mail. To reply, visit:
> http://git.reviewboard.kde.org/r/106242/
> -----------------------------------------------------------
>
> (Updated Aug. 27, 2012, 9:33 p.m.)
>
>
> Review request for kdelibs and Plasma.
>
>
> Description
> -------
>
> Krunner's spellcheck plugin has been pretty broken since bd291d21f096a714a171e7af3a534ba345ca5659 (about two years ago) because it called Sonnet::Speller::setLanguage every time the spellchecker was invoked, which was (very much) not thread-safe.
>
> This patch makes Sonnet::Speller::setLanguage threadsafe by protecting all access to the internal dict pointer using QReadWriteLock.
>
> A related review request is 106244, which adds more fixes to the spellcheck feature.
>
>
> This addresses bugs 264779 and 303831.
> http://bugs.kde.org/show_bug.cgi?id=264779
> http://bugs.kde.org/show_bug.cgi?id=303831
>
>
> Diffs
> -----
>
> kdecore/sonnet/speller.cpp b19e74d
>
> Diff: http://git.reviewboard.kde.org/r/106242/diff/
>
>
> Testing
> -------
>
> Compiled, installed, used for a week or so, spellchecked a bunch of things.
>
>
> Thanks,
>
> Simeon Bird
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.kde.org/pipermail/kde-core-devel/attachments/20120906/e81443d2/attachment.htm>
More information about the kde-core-devel
mailing list