]> git.ozlabs.org Git - ccan/blobdiff - ccan/list/list.c
tdb2: try to fit transactions in existing space before we expand.
[ccan] / ccan / list / list.c
index fad40cb80b3e00938ead3ecbe96c415c55a3973d..d876f21e7b06b0bd06a38fdd89b5b35ff6d62d31 100644 (file)
@@ -2,6 +2,20 @@
 #include <stdlib.h>
 #include "list.h"
 
+static void *corrupt(const char *abortstr,
+                    const struct list_node *head,
+                    const struct list_node *node,
+                    unsigned int count)
+{
+       if (abortstr) {
+               fprintf(stderr,
+                       "%s: prev corrupt in node %p (%u) of %p\n",
+                       abortstr, node, count, head);
+               abort();
+       }
+       return NULL;
+}
+
 struct list_node *list_check_node(const struct list_node *node,
                                  const char *abortstr)
 {
@@ -10,31 +24,18 @@ struct list_node *list_check_node(const struct list_node *node,
 
        for (p = node, n = node->next; n != node; p = n, n = n->next) {
                count++;
-               if (n->prev != p) {
-                       if (!abortstr)
-                               return NULL;
-                       fprintf(stderr,
-                               "%s: prev corrupt in node %p (%u) of %p\n",
-                               abortstr, n, count, node);
-                       abort();
-               }
+               if (n->prev != p)
+                       return corrupt(abortstr, node, n, count);
        }
+       /* Check prev on head node. */
+       if (node->prev != p)
+               return corrupt(abortstr, node, node, 0);
+
        return (struct list_node *)node;
 }
 
 struct list_head *list_check(const struct list_head *h, const char *abortstr)
 {
-       if (h->n.next == &h->n) {
-               if (h->n.prev != &h->n) {
-                       if (!abortstr)
-                               return NULL;
-                       fprintf(stderr, "%s: prev corrupt in empty %p\n",
-                               abortstr, h);
-                       abort();
-               }
-               return (struct list_head *)h;
-       }
-
        if (!list_check_node(&h->n, abortstr))
                return NULL;
        return (struct list_head *)h;