1 /*-------------------------------------------------------------------------
4 * support for integrated/inline doubly- and singly- linked lists
6 * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group
7 * Portions Copyright (c) 1994, Regents of the University of California
11 * src/backend/lib/ilist.c
14 * This file only contains functions that are too big to be considered
15 * for inlining. See ilist.h for most of the goodies.
17 *-------------------------------------------------------------------------
21 #include "lib/ilist.h"
24 * Delete 'node' from list.
26 * It is not allowed to delete a 'node' which is not in the list 'head'
28 * Caution: this is O(n); consider using slist_delete_current() instead.
31 slist_delete(slist_head *head, slist_node *node)
33 slist_node *last = &head->head;
35 bool found PG_USED_FOR_ASSERTS_ONLY = false;
37 while ((cur = last->next) != NULL)
41 last->next = cur->next;
42 #ifdef USE_ASSERT_CHECKING
56 * Verify integrity of a doubly linked list
59 dlist_check(dlist_head *head)
64 elog(ERROR, "doubly linked list head address is NULL");
66 if (head->head.next == NULL && head->head.prev == NULL)
67 return; /* OK, initialized as zeroes */
69 /* iterate in forward direction */
70 for (cur = head->head.next; cur != &head->head; cur = cur->next)
75 cur->prev->next != cur ||
76 cur->next->prev != cur)
77 elog(ERROR, "doubly linked list is corrupted");
80 /* iterate in backward direction */
81 for (cur = head->head.prev; cur != &head->head; cur = cur->prev)
86 cur->prev->next != cur ||
87 cur->next->prev != cur)
88 elog(ERROR, "doubly linked list is corrupted");
93 * Verify integrity of a singly linked list
96 slist_check(slist_head *head)
101 elog(ERROR, "singly linked list head address is NULL");
104 * there isn't much we can test in a singly linked list except that it
105 * actually ends sometime, i.e. hasn't introduced a cycle or similar
107 for (cur = head->head.next; cur != NULL; cur = cur->next)
111 #endif /* ILIST_DEBUG */