-static void sl_unlink (skiplist_t *sl, map_key_t key) {
- node_t *pred = sl->head;
- node_t *item = NULL;
- TRACE("s2", "sl_unlink: unlinking marked item with key %p", key, 0);
- int d = 0;
-
- // Traverse the levels of <sl>
- for (int level = sl->high_water; level >= 0; --level) {
- node_t *next = pred->next[level];
- if (next == DOES_NOT_EXIST)
- continue;
- TRACE("s3", "sl_unlink: traversing level %p starting at %p", level, pred);
- item = next;
- while (item != NULL) {
- next = item->next[level];
-
- if (EXPECT_TRUE(sl->key_type == NULL)) {
- d = item->key - key;
- } else {
- d = sl->key_type->cmp((void *)item->key, (void *)key);
- }
-
- if (d == 0) {
- pred->next[level] = next;
- TRACE("s3", "sl_unlink: unlinked item from pred %p", pred, 0);
- item = next;
- next = (item != NULL) ? item->next[level] : DOES_NOT_EXIST;
- break;
- }
- if (d > 0)
- break;
-
- pred = item;
- item = next;
- }
-
- TRACE("s3", "sl_unlink: at pred %p next %p", pred, item);
- }
-}
-