[ros-dev] VOTE: List loop macros in ntoskrnl?

KJKHyperion hackbunny at reactos.com
Sun Oct 2 15:19:16 CEST 2005


Gunnar Dalsnes wrote:

>> Additional proposal: invariant ASSERTs in list manipulation routines, 
>
> What does invariant mean?

invariant = something that doesn't vary. All algorithms have invariants 
of some sort, and they are usually assumed (i.e. checking the invariants 
isn't part of the algorithm, and checks, if expressed in code, are 
usually only compiled in debug builds - see ASSERT). The invariant of 
all helper functions manipulating LIST_ENTRYs is that the LIST_ENTRYs 
are valid, i.e.:

ASSERT(ListEntry && ListEntry->Flink && ListEntry->Blink && 
ListEntry->Flink->Blink == ListEntry && ListEntry->Blink->Flink == 
ListEntry)

You need to ensure this is always true: before manipulating the object 
and (especially!) after you're done with it (i.e. it should be the first 
and last line of every LIST_ENTRY helper function)

>> especially the precondition that inputs are valid LIST_ENTRYs. Saved 
>> my ass so many times
>
> Yeah. I miss those. I think we had something like that before(?). If 
> noone objects lets readd list asserts (and no, not the "insane" 
> variant that walks and validated the entire list, allthou that is very 
> handy sometimes too;-)

the "insane" checks can be performed once in N times, if they are too 
much of a performance hit. And please don't hardcode calls to 
KeBugCheckEx in ASSERT - RtlAssert is where you're supposed to implement 
assertion failure logic, the ASSERT macro is just candy coating on it


More information about the Ros-dev mailing list