> On Sept. 6, 2012, 12:29 p.m., David Faure wrote:
> > 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).
> 
> Simeon Bird wrote:
>     Thanks for the review. 
>     
>     I agree that this is a slightly weird thing to do, but, as you surmise, 
> it was the only way I could think of to make the feature work properly. 
>     
>     As far as I understand it (from reading the documentation), the way 
> krunner works is to call Plasma::AbstractRunner::match in a new thread for 
> every runner every time input is entered. 
>     
>     So if I enter:
>     
>     "spell hello"
>     
>     I will be called with 's' 'sp' 'spe'...and so on until I get the whole 
> match, without waiting for the previous threads to return. Thus match has to 
> be thread-safe.
>     
>     The feature I'm trying to fix here is to be able to enter "spell french 
> bonjour" and have it spell something. 
>     The runner is responsible for parsing the input and checking whether it 
> should do anything else.
>     So we don't actually post spellchecking requests, we just post some 
> input, and detect that we should spell-check, and change the language, by 
> parsing strings. So I couldn't see a way to do this except to call 
> Sonnet::Speller::setLanguage() in Plasma::AbstractRunner::match, 
>     which meant that for it to work I had to make match thread-safe. 
>     
>     Sorry. I'm open to suggestions if you have a better idea. 
>     
>     I've fixed your other comments in v2 of the diff, let me know if there is 
> anything else.
> 
> Thomas Lübking wrote:
>     would it not make more sense to just kill the pending (and now 
> worthless?) thread instead (no idea how expensive this spellchecking is to be 
> threaded) to not waste cpu on a result that will be ignored anyway?
> 
> David Faure wrote:
>     Forcefully killing threads (QThread::terminate()) is a big no-no, it 
> leaks memory, potentially worse: it can leave a mutex locked, so any further 
> thread trying to lock it, will hang for ever.
>     
>     The only way to terminate a thread is to ask it nicely to terminate from 
> within (i.e. to exit run()), which means it has to finish what it's currently 
> doing, first, before it looks up for the next command or posted event which 
> tells it to quit.
> 
> Thomas Lübking wrote:
>     That is generally true and i admit to not know how the plasma spell 
> checker is implemented (or even "where" ;-), but would expect some sort of ro 
> non-joinable threading, operating on shared data (as the only purpose seems 
> to prevent blocking the main event loop - not running two checks at the same  
> time and merge their results)  ... or does QThread alone bring structures to 
> forbid such approach (The API doc does not mention inevitable leaks for 
> QThread itself on ::terminate())?
>     
>     (PS: I just start to wonder whether the speller threads are then tagged 
> to catch 2,1 exits...)
> 
> Simeon Bird wrote:
>     I don't entirely follow what you mean in the last comment; what do you 
> mean 'tagged to catch 2,1 exits'?
>     
>     The spellchecking runner is, I think, very cheap compared to some of the 
> other runners (eg, the nepomuk search), all of which are called at once.
>     
>     But, be that as it may, the spell-check has no control over the threading 
> model of krunner, which it just inherits from Plasma::AbstractRunner, and 
> changing that model for everything seems a bit overkill for this, even if we 
> understood fully how it works (I certainly don't; I just took the 
> documentation at face value, which may or may not be a good idea).
>     
>     A reasonable alternative, if you don't like doing the commit in principle 
> (the mutex might well slow down the spell-check), is to just remove the 
> problematic feature (which has never worked anyway). If krunner only 
> spell-checked words in the default dictionary, we wouldn't need to call 
> setLanguage(), and everything would be fine, as it was before 2010.
> 
> Thomas Lübking wrote:
>     Thread execution is not predictable so in general it's possible that you 
> start a thread (1), then start another thread (2) and thread 2 finishes 
> before thread 1
>     Since i assume that in this case the last exiting thread will determine 
> the sanity of the token, this would eg. mean that if you spellcheck "threa" 
> and then "thread" but "threa" finishes last, the token "thread" would be 
> determined misspelled.
>     
>     A common approach to handle this is to "tag" (basically with an 
> increment) the threads/results so that if you get a result from thread "1" 
> and already got a result from thread "2" before, you know that the result 
> from thread "1" is already irrelevant and simply drop it instead of polluting 
> your result.
>     
>     I have no particular opinion on this patch or the krunner spell checker 
> in general (except assuming that threading it will likely be overhead anyway 
> - esp. if one sequentially navigated through a tree structure - and given the 
> type rate a normal human being can achieve ;-)

Ah, I see. This is getting somewhat educational for me :)


- Simeon


-----------------------------------------------------------
This is an automatically generated e-mail. To reply, visit:
http://git.reviewboard.kde.org/r/106242/#review18623
-----------------------------------------------------------


On Sept. 9, 2012, 10:06 p.m., Simeon Bird wrote:
> 
> -----------------------------------------------------------
> This is an automatically generated e-mail. To reply, visit:
> http://git.reviewboard.kde.org/r/106242/
> -----------------------------------------------------------
> 
> (Updated Sept. 9, 2012, 10:06 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
> 
>

_______________________________________________
Plasma-devel mailing list
Plasma-devel@kde.org
https://mail.kde.org/mailman/listinfo/plasma-devel

Reply via email to