On Tue 2020-05-05 15:51:16, Andy Shevchenko wrote: > On Tue, May 5, 2020 at 3:37 PM Pavel Machek 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? - while (!kthread_should_stop() - && !(params->iterations && total_tests >= - params->iterations)) { + while (!(kthread_should_stop() || + (params->iterations && total_tests >= params->iterations))) { Pavel -- DENX Software Engineering GmbH, Managing Director: Wolfgang Denk HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany