+ // advance iterator to next item; skip items that have been removed
+ markable_t item;
+#ifdef LIST_USE_HAZARD_POINTER
+ haz_t *hp0 = haz_get_static(0);
+#endif
+ do {
+#ifndef LIST_USE_HAZARD_POINTER
+ item = iter->pred->next;
+#else //LIST_USE_HAZARD_POINTER
+ do {
+ item = iter->pred->next;
+ haz_set(hp0, STRIP_MARK(item));
+ } while (item != ((volatile node_t *)iter->pred)->next);
+#endif//LIST_USE_HAZARD_POINTER
+ iter->pred = STRIP_MARK(item);
+ if (iter->pred == NULL)
+ return DOES_NOT_EXIST;
+ } while (HAS_MARK(item));