Skip to content

Commit 83ef91e

Browse files
committed
Fix error of __list_find
The node on the linked list should follow the ordering by its key. However, the function list_insert doesn't actually do this because of the wrong implementation of __list_find. There are three main fixes in this patch. First, once we should do synchronization, we have to iterate the list again but not return from the function. Second, the while loop should iterate until the last node but not the second last one. Finally, under the normal situation that the tail node with key UINTPTR_MAX should not be deleted (unless the end of the program), some codes are never executed which can be removed.
1 parent b34b773 commit 83ef91e

File tree

1 file changed

+5
-10
lines changed

1 file changed

+5
-10
lines changed

hp_list/main.c

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -230,14 +230,14 @@ static bool __list_find(list_t *list,
230230
if (atomic_load(prev) != get_unmarked(curr))
231231
goto try_again;
232232
while (true) {
233-
if (!get_unmarked_node(curr))
234-
return false;
235233
next = (list_node_t *) atomic_load(&get_unmarked_node(curr)->next);
236234
(void) list_hp_protect_ptr(list->hp, HP_NEXT, get_unmarked(next));
235+
/* On a CAS failure, the search function, "__list_find," will simply
236+
* have to go backwards in the list until an unmarked element is found
237+
* from which the search in increasing key order can be started.
238+
*/
237239
if (atomic_load(&get_unmarked_node(curr)->next) != (uintptr_t) next)
238-
break;
239-
if (get_unmarked(next) == atomic_load((atomic_uintptr_t *) &list->tail))
240-
break;
240+
goto try_again;
241241
if (atomic_load(prev) != get_unmarked(curr))
242242
goto try_again;
243243
if (get_unmarked_node(next) == next) {
@@ -259,11 +259,6 @@ static bool __list_find(list_t *list,
259259
curr = next;
260260
(void) list_hp_protect_release(list->hp, HP_CURR, get_unmarked(next));
261261
}
262-
*par_curr = curr;
263-
*par_prev = prev;
264-
*par_next = next;
265-
266-
return false;
267262
}
268263

269264
bool list_insert(list_t *list, list_key_t key)

0 commit comments

Comments
 (0)