]> mj.ucw.cz Git - libucw.git/blobdiff - lib/lists.h
asio: Put a lock around maintenance of use-counts.
[libucw.git] / lib / lists.h
index ce03656b10bc7eedc00d9ef5586ad9b0b1a0e34d..39036913f8d99a3d8eac7bdb0c1c1cce1ace083a 100644 (file)
@@ -1,11 +1,27 @@
 /*
- *     Sherlock Library -- Linked Lists
+ *     UCW Library -- Linked Lists
  *
- *     (c) 1997--1999 Martin Mares <mj@atrey.karlin.mff.cuni.cz>
+ *     (c) 1997--1999 Martin Mares <mj@ucw.cz>
+ *
+ *     This software may be freely distributed and used according to the terms
+ *     of the GNU Lesser General Public License.
  */
 
-#ifndef _SHERLOCK_LISTS_H
-#define _SHERLOCK_LISTS_H
+#ifndef _UCW_LISTS_H
+#define _UCW_LISTS_H
+
+/*
+ * I admit the list structure is very tricky and also somewhat awkward,
+ * but it's both efficient and easy to manipulate once one understands the
+ * basic trick: The list head always contains two synthetic nodes which are
+ * always present in the list: the head and the tail. But as the `next'
+ * entry of the tail and the `prev' entry of the head are both NULL, the
+ * nodes can overlap each other:
+ *
+ *     head    head_node.next
+ *     null    head_node.prev  tail_node.next
+ *     tail                    tail_node.prev
+ */
 
 typedef struct node {
   struct node *next, *prev;
@@ -37,8 +53,8 @@ void add_tail_list(list *, list *);
 void init_list(list *);
 void insert_node(node *, node *);
 
-#if !defined(_SHERLOCK_LISTS_C) && defined(__GNUC__)
-#define LIST_INLINE static inline
+#if !defined(_UCW_LISTS_C) && defined(__GNUC__)
+#define LIST_INLINE extern inline
 #include "lib/lists.c"
 #undef LIST_INLINE
 #else