> On Jan. 13, 2013, 6:45 p.m., Oswald Buddenhagen wrote:
> > and why exactly do you sleep instead of looping with waitforreadyread?
> 
> Jon Severinsson wrote:
>     Because that would be an (almost) busy-loop (there are already *some* 
> data, so waitForReadyRead could return before the timeout).
> 
> Oswald Buddenhagen wrote:
>     right. my (kpty) implementation waits for *any* data to be available 
> (which is (or was) consistent with something i don't remember), while 
> thiago's (qsocket & co.) implementations wait for *more* data to be 
> available. this really should be made consistent at some point ... at this 
> point i think thiago's interpretation is more useful, even if it means 
> writing more code in the common case.
> 
> Jon Severinsson wrote:
>     I have not looked too closely at either implementation, and can't say I 
> really understand how either actually work, so this might be pointless, but I 
> would still want to give a warning about the whole "waiting for *more* data" 
> (as opposed to "waiting for *some* data") concept, as that immediately brings 
> to question "more since *when*?".
>     
>     More data since the waitForReadyRead() call *can* *not* be used 
> correctly. Never under any circumstance!  Every call would be a race 
> condition (all data that is ever going to come might have come just before 
> you made the call), and would at best result in an unnecessary sleep of 
> "timeout" ms, and at worst result in a complete deadlock, or if the rest of 
> the system conspires against you, an infinite loop.
>     
>     More data since last "relevant" API call prior to waitForReadyRead() 
> could work, but defining "relevant", and getting both the implementation and 
> documentation right would likely be a nightmare, and chances a API consumer 
> makes a mistake is still possible, even likely, so this is not something I 
> would recommend.
>     
>     So imho "waiting for *some* data" is the only right thing to do, even 
> though it results in this ugly code in some cases...

no. the actual querying of the data source is synchronous as far as threading 
is concerned: you either do it via waitFor*() or by returning to the event 
loop. consequently, code like "if (!dev->bytesAvailable()) 
dev->waitForReadyRead();" is entirely well-defined. the waitFor*() functions 
are thus defined to mean "synchronously wait for the emission of the likewise 
named signal".


- Oswald


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


On Jan. 13, 2013, 1:03 p.m., Jon Severinsson wrote:
> 
> -----------------------------------------------------------
> This is an automatically generated e-mail. To reply, visit:
> http://git.reviewboard.kde.org/r/108385/
> -----------------------------------------------------------
> 
> (Updated Jan. 13, 2013, 1:03 p.m.)
> 
> 
> Review request for KDE Frameworks.
> 
> 
> Description
> -------
> 
> Increase timeout, and sleep a while after waitForReadyRead() returns,
> as it only guarantees that *some* data is available to read, while
> the test assumes that a full line of data is available to read...
> 
> This reduces failure rate from 10% to 2% on my setup.
> 
> 
> Diffs
> -----
> 
>   kpty/tests/kptyprocesstest.cpp b95ae26 
> 
> Diff: http://git.reviewboard.kde.org/r/108385/diff/
> 
> 
> Testing
> -------
> 
> 
> Thanks,
> 
> Jon Severinsson
> 
>

_______________________________________________
Kde-frameworks-devel mailing list
Kde-frameworks-devel@kde.org
https://mail.kde.org/mailman/listinfo/kde-frameworks-devel

Reply via email to