>This functionally works, but the TAILQ data structure is not the same as >the CIRCLEQ data structure (i.e. no ABI compatibility, if that matters; >I'm not quite sure why it does) and unnecessarily penalizes applications >which need to traverse the list in the tail->head direction.
I know the data structures aren't the same, but if you're using the macros you don't ever notice this. As for the penalty ... you're talking about: #define CIRCLEQ_PREV(elm,field) ((elm)->field.cqe_prev) versus #define TAILQ_PREV(elm, headname, field) \ (*(((struct headname *)((elm)->field.tqe_prev))->tqh_last)) One extra pointer dereference is what we're talking about; I have to believe that for 99% of applications it wouldn't matter. Also, I see that CIRCLEQ has more complicated logic if you want to insert elements at the end of it. So obviously there are tradeoffs (but again, I don't really think it matters to nearly everybody). --Ken --Ken