- if(!xbt_swag_belongs(obj, swag)) /* Trying to remove an object that
- was not in this swag */
- return NULL;
-
- if (swag->head == swag->tail) { /* special case */
- if (swag->head != obj) /* Trying to remove an object that was not in this swag */
- return NULL;
- swag->head = NULL;
- swag->tail = NULL;
- NEXT(obj, offset) = PREV(obj, offset) = NULL;
- } else if (obj == swag->head) { /* It's the head */
- swag->head = NEXT(obj, offset);
- PREV(swag->head, offset) = NULL;
- NEXT(obj, offset) = NULL;
- } else if (obj == swag->tail) { /* It's the tail */
- swag->tail = PREV(obj, offset);
- NEXT(swag->tail, offset) = NULL;
- PREV(obj, offset) = NULL;
- } else { /* It's in the middle */
- NEXT(PREV(obj, offset), offset) = NEXT(obj, offset);
- PREV(NEXT(obj, offset), offset) = PREV(obj, offset);
- PREV(obj, offset) = NEXT(obj, offset) = NULL;
+
+ size_t offset = swag->offset;
+ void* prev = xbt_swag_getPrev(obj, offset);
+ void* next = xbt_swag_getNext(obj, offset);
+
+ if (prev) {
+ xbt_swag_getNext(prev, offset) = next;
+ xbt_swag_getPrev(obj, offset) = NULL;
+ if (next) {
+ xbt_swag_getPrev(next, offset) = prev;
+ xbt_swag_getNext(obj, offset) = NULL;
+ } else {
+ swag->tail = prev;
+ }
+ swag->count--;
+ } else if (next) {
+ xbt_swag_getPrev(next, offset) = NULL;
+ xbt_swag_getNext(obj, offset) = NULL;
+ swag->head = next;
+ swag->count--;
+ } else if (obj == swag->head) {
+ swag->head = swag->tail = NULL;
+ swag->count--;