On Tue, May 5, 2020 at 3:58 PM Pavel Machek pavel@denx.de wrote:
On Tue 2020-05-05 15:51:16, Andy Shevchenko wrote:
On Tue, May 5, 2020 at 3:37 PM Pavel Machek pavel@denx.de wrote:
So, to the point, the conditional of checking the thread to be stopped being first part of conjunction logic prevents to check iterations. Thus, we have to always check both conditions to be able to stop after given iterations.
I ... don't understand. AFAICT the code is equivalent. Both && and || operators permit "short" execution... but second part of expression has no sideeffects, so...
..
You are changing !a & !b into !(a | b). But that's equivalent expression. I hate to admit, but I had to draw truth table to prove that.
...
What am I missing?
Basic stuff. Compiler doesn't consider second part of conjunction when first one (see operator precedence) is already false, so, it means:
a & b 0 x -> false 1 0 -> false 1 1 -> true
x is not being considered at all. So, logically it's equivalent, run-time it's not.
Yeah, I pointed that out above. Both && and || permit short execution. But that does not matter, as neither "params->iterations" nor "total_tests >= params->iterations" have side effects.
Where is the runtime difference?
We have to check *both* conditions. If we don't check iterations, we just wait indefinitely until somebody tells us to stop. Everything in the commit message and mentioned there commit IDs which you may check.
while (!kthread_should_stop()
&& !(params->iterations && total_tests >=
params->iterations)) {
while (!(kthread_should_stop() ||
(params->iterations && total_tests >= params->iterations))) {