<div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote">On Tue, Jun 30, 2015 at 5:22 AM, Hans de Goede <span dir="ltr"><<a href="mailto:hdegoede@redhat.com" target="_blank">hdegoede@redhat.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><br><span class=""><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
+       if (elm->next == NULL && elm->prev == NULL)<br>
+               return;<br>
+<br>
        elm->prev->next = elm->next;<br>
        elm->next->prev = elm->prev;<br>
        elm->next = NULL;<br>
<br>
</blockquote>
<br></span>
I do not think this is a good idea, most list implementations<br>
people are used to do not allow this and consider a double<br>
remove / del a bug.<br></blockquote><div><br></div><div>I don't think he is trying to fix double-remove. What he is trying to fix is "it was never added to a list in the first place".<br><br></div><div>I can see the desirability of this crashing if the caller thinks the element really should be in a list. Maybe a better solution is to add an inline "list_is_inserted(x)" that returns whether the element is in a list (by checking one or both pointers). Then the caller can call this before calling list_remove if it wants this check. I think you could even distinguish double-remove by only clearing one of the pointers on remove, that might help when debugging.<br><br></div></div></div></div>