On Tue, 2012-09-04 at 22:51 +0100, Pedro Alves wrote: > On 09/04/2012 09:59 PM, Steven Rostedt wrote: > > On Tue, 2012-09-04 at 18:21 +0100, Pedro Alves wrote: > >> On 09/04/2012 06:17 PM, Steven Rostedt wrote: > >>> On Tue, 2012-09-04 at 17:40 +0100, Pedro Alves wrote: > >>> > >>>> BTW, you can also go a step further and remove the need to close with double }}, > >>>> with something like: > >>>> > >>>> #define do_for_each_ftrace_rec(pg, rec) \ > >>>> for (pg = ftrace_pages_start, rec = &pg->records[pg->index]; \ > >>>> pg && rec == &pg->records[pg->index]; \ > >>>> pg = pg->next) \ > >>>> for (rec = pg->records; rec < &pg->records[pg->index]; rec++) > >>>> > >>> > >>> Yeah, but why bother? It's hidden in a macro, and the extra '{ }' shows > >>> that this is something "special". > >> > >> The point of both changes is that there's nothing special in the end > >> at all. It all just works... > >> > > > > It would still fail on a 'break'. The 'while' macro tells us that it is > > special, because in the end, it wont work. > > Please explain why it would fail on a 'break'. > Ah, I missed the condition with the rec == &pg->records[pg->index]. But if ftrace_pages_start is NULL, the rec = &pg->records[pg->index] will fault. You could do something like rec = pg ? &pg->records[pg->index] : NULL, but IIRC, the comma operator does not guarantee order evaluation. That is, the compiler is allowed to process "a , b" as "b; a;" and not "a; b;". -- Steve -- dm-devel mailing list dm-devel@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/dm-devel