]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/commit
Implement LIST_PREV().
authorEd Schouten <ed@FreeBSD.org>
Wed, 12 Sep 2012 21:03:48 +0000 (21:03 +0000)
committerEd Schouten <ed@FreeBSD.org>
Wed, 12 Sep 2012 21:03:48 +0000 (21:03 +0000)
commit4170b08388cd81d4db30aa38ff59108e88eab33c
tree21ddf8747134de5ee163c996ea89454f7b339af6
parenta5174f1fb6eee7df99b5feddec15e8a05edf09c5
Implement LIST_PREV().

Regular LISTs have been implemented in such a way that the prev-pointer
does not point to the previous element, but to the next-pointer stored
in the previous element. This is done to simplify LIST_REMOVE(). This
macro can be implemented without knowing the address of the list head.

Unfortunately this makes it harder to implement LIST_PREV(), which is
why this macro was never here. Still, it is possible to implement this
macro. If the prev-pointer points to the list head, we return NULL.
Otherwise we simply subtract the offset of the prev-pointer within the
structure.

It's not as efficient as traversing forward of course, but in practice
it shouldn't be that bad. In almost all use cases, people will want to
compare the value returned by LIST_PREV() against NULL, so an optimizing
compiler will not emit code that does more branching than TAILQs.

While there, make the code a bit more readable by introducing
__member2struct(). This makes STAILQ_LAST() far more readable.

MFC after: 1 month
share/man/man3/Makefile
share/man/man3/queue.3
sys/sys/cdefs.h
sys/sys/param.h
sys/sys/queue.h