struct pe_ring { void *self; pe_ring *next, *prev; }; #define PE_RING_INIT(LNK, SELF) \ STMT_START { \ (LNK)->next = LNK; \ (LNK)->prev = LNK; \ (LNK)->self = SELF; \ } STMT_END #define PE_RING_EMPTY(LNK) ((LNK)->next == LNK) #define PE_RING_UNSHIFT(LNK, ALL) \ STMT_START { \ assert((LNK)->next==LNK); \ (LNK)->next = (ALL)->next; \ (LNK)->prev = ALL; \ (LNK)->next->prev = LNK; \ (LNK)->prev->next = LNK; \ } STMT_END #define PE_RING_ADD_BEFORE(L1,L2) \ STMT_START { \ assert((L1)->next==L1); \ (L1)->next = L2; \ (L1)->prev = (L2)->prev; \ (L1)->next->prev = L1; \ (L1)->prev->next = L1; \ } STMT_END #define PE_RING_DETACH(LNK) \ STMT_START { \ if ((LNK)->next != LNK) { \ (LNK)->next->prev = (LNK)->prev; \ (LNK)->prev->next = (LNK)->next; \ (LNK)->next = LNK; \ } \ } STMT_END