From 34dc8b32cbbe6e4c128e311b0c8fce2553c92fd1 Mon Sep 17 00:00:00 2001 From: Patrick Pelissier Date: Sat, 2 Jun 2018 21:26:20 +0200 Subject: [PATCH] Fix broken _swap --- m-i-list.h | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/m-i-list.h b/m-i-list.h index adb931b7..32e79f94 100644 --- a/m-i-list.h +++ b/m-i-list.h @@ -498,10 +498,18 @@ typedef struct ilist_head_s { { \ ILISTI_CONTRACT(name, d); \ ILISTI_CONTRACT(name, e); \ - M_SWAP(struct ilist_head_s *, d->name.next, e->name.next); \ - M_SWAP(struct ilist_head_s *, d->name.prev, e->name.prev); \ - M_SWAP(struct ilist_head_s *, d->name.next->prev, e->name.next->prev); \ - M_SWAP(struct ilist_head_s *, d->name.prev->next, e->name.prev->next); \ + struct ilist_head_s *d_item = d->name.next; \ + struct ilist_head_s *e_item = e->name.next; \ + d->name.next = e_item == &e->name ? &d->name : e_item; \ + e->name.next = d_item == &d->name ? &e->name : d_item; \ + d_item = d->name.prev; \ + e_item = e->name.prev; \ + d->name.prev = e_item == &e->name ? &d->name : e_item; \ + e->name.prev = d_item == &d->name ? &e->name : d_item; \ + d->name.next->prev = &d->name; \ + d->name.prev->next = &d->name; \ + e->name.next->prev = &e->name; \ + e->name.prev->next = &e->name; \ ILISTI_CONTRACT(name, d); \ ILISTI_CONTRACT(name, e); \ } \