Skip to content

Commit ff84bd5

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 ff84bd5

File tree

1 file changed

+1
-10
lines changed

1 file changed

+1
-10
lines changed

hp_list/main.c

Lines changed: 1 addition & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -230,14 +230,10 @@ 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));
237235
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;
236+
goto try_again;
241237
if (atomic_load(prev) != get_unmarked(curr))
242238
goto try_again;
243239
if (get_unmarked_node(next) == next) {
@@ -259,11 +255,6 @@ static bool __list_find(list_t *list,
259255
curr = next;
260256
(void) list_hp_protect_release(list->hp, HP_CURR, get_unmarked(next));
261257
}
262-
*par_curr = curr;
263-
*par_prev = prev;
264-
*par_next = next;
265-
266-
return false;
267258
}
268259

269260
bool list_insert(list_t *list, list_key_t key)

0 commit comments

Comments
 (0)