]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
temporarily move ISC_QUEUE to list.h
authorEvan Hunt <each@isc.org>
Tue, 5 Nov 2019 21:18:37 +0000 (13:18 -0800)
committerEvan Hunt <each@isc.org>
Thu, 7 Nov 2019 19:55:37 +0000 (11:55 -0800)
The double-locked queue implementation is still currently in use
in ns_client, but will be replaced by a fetch-and-add array queue.
This commit moves it from queue.h to list.h so that queue.h can be
used for the new data structure, and clean up dependencies between
list.h and types.h. Later, when the ISC_QUEUE is no longer is use,
it will be removed completely.

14 files changed:
lib/dns/include/dns/fixedname.h
lib/isc/app.c
lib/isc/include/isc/buffer.h
lib/isc/include/isc/event.h
lib/isc/include/isc/list.h
lib/isc/include/isc/queue.h
lib/isc/include/isc/result.h
lib/isc/include/isc/sockaddr.h
lib/isc/include/isc/types.h
lib/isc/include/pk11/result.h
lib/isc/tests/queue_test.c
lib/ns/client.c
lib/ns/include/ns/client.h
lib/ns/notify.c

index 6a9b5551050dcfacfba687c5dabac5701016ed7c..623313439cb419dd02e4b588b50876d3d4cf8250 100644 (file)
@@ -51,6 +51,7 @@
 
 #include <isc/buffer.h>
 #include <isc/lang.h>
+#include <isc/list.h>
 
 #include <dns/name.h>
 
index 1a013f1f01174d9b910591ef54f30b4794b1ca59..9f228278bb554b9f41679c3a299c8ee41a4c14ab 100644 (file)
@@ -29,6 +29,7 @@
 #include <isc/atomic.h>
 #include <isc/app.h>
 #include <isc/condition.h>
+#include <isc/list.h>
 #include <isc/mem.h>
 #include <isc/mutex.h>
 #include <isc/event.h>
index 07d259956c884bed01e54c57ba614912aff2e771..6dec61ef6412104420ec4c1499b04e04346c86b3 100644 (file)
 #include <isc/assertions.h>
 #include <isc/formatcheck.h>
 #include <isc/lang.h>
+#include <isc/list.h>
 #include <isc/likely.h>
 #include <isc/magic.h>
 #include <isc/types.h>
index 99d867cd5a3f7020f30a843205367f83ba42dd83..3e9fe19c8a66c982a05a486e5ea958e0d7267648 100644 (file)
@@ -16,6 +16,7 @@
 /*! \file isc/event.h */
 
 #include <isc/lang.h>
+#include <isc/list.h>
 #include <isc/types.h>
 
 /*****
index bc90bb974ef345e5b947fdf74a50b035286f1cf3..b7b245c1bd92c75db41eea739343bfa4f75be7d5 100644 (file)
@@ -9,11 +9,14 @@
  * information regarding copyright ownership.
  */
 
-
 #ifndef ISC_LIST_H
 #define ISC_LIST_H 1
 
+#include <stdbool.h>
+
 #include <isc/assertions.h>
+#include <isc/mutex.h>
+#include <isc/types.h>
 
 #ifdef ISC_LIST_CHECKINIT
 #define ISC_LINK_INSIST(x) ISC_INSIST(x)
@@ -21,7 +24,6 @@
 #define ISC_LINK_INSIST(x)
 #endif
 
-#define ISC_LIST(type) struct { type *head, *tail; }
 #define ISC_LIST_INIT(list) \
        do { (list).head = NULL; (list).tail = NULL; } while (0)
 
 #define __ISC_LIST_DEQUEUEUNSAFE_TYPE(list, elt, link, type) \
        __ISC_LIST_UNLINKUNSAFE_TYPE(list, elt, link, type)
 
+/*
+ * This is a generic implementation of a two-lock concurrent queue.
+ * There are built-in mutex locks for the head and tail of the queue,
+ * allowing elements to be safely added and removed at the same time.
+ *
+ * NULL is "end of list"
+ * -1 is "not linked"
+ */
+
+#ifdef ISC_QUEUE_CHECKINIT
+#define ISC_QLINK_INSIST(x) ISC_INSIST(x)
+#else
+#define ISC_QLINK_INSIST(x) (void)0
+#endif
+
+#define ISC_QLINK(type) struct { type *prev, *next; }
+
+#define ISC_QLINK_INIT(elt, link) \
+       do { \
+               (elt)->link.next = (elt)->link.prev = (void *)(-1); \
+       } while(0)
+
+#define ISC_QLINK_LINKED(elt, link) ((void*)(elt)->link.next != (void*)(-1))
+
+#define ISC_QUEUE(type) struct { \
+       type *head, *tail; \
+       isc_mutex_t headlock, taillock; \
+}
+
+#define ISC_QUEUE_INIT(queue, link) \
+       do { \
+               isc_mutex_init(&(queue).taillock); \
+               isc_mutex_init(&(queue).headlock); \
+               (queue).tail = (queue).head = NULL; \
+       } while (0)
+
+#define ISC_QUEUE_EMPTY(queue) ((queue).head == NULL)
+
+#define ISC_QUEUE_DESTROY(queue) \
+       do { \
+               ISC_QLINK_INSIST(ISC_QUEUE_EMPTY(queue)); \
+               isc_mutex_destroy(&(queue).taillock); \
+               isc_mutex_destroy(&(queue).headlock); \
+       } while (0)
+
+/*
+ * queues are meant to separate the locks at either end.  For best effect, that
+ * means keeping the ends separate - i.e. non-empty queues work best.
+ *
+ * a push to an empty queue has to take the pop lock to update
+ * the pop side of the queue.
+ * Popping the last entry has to take the push lock to update
+ * the push side of the queue.
+ *
+ * The order is (pop, push), because a pop is presumably in the
+ * latency path and a push is when we're done.
+ *
+ * We do an MT hot test in push to see if we need both locks, so we can
+ * acquire them in order.  Hopefully that makes the case where we get
+ * the push lock and find we need the pop lock (and have to release it) rare.
+ *
+ * > 1 entry - no collision, push works on one end, pop on the other
+ *   0 entry - headlock race
+ *     pop wins - return(NULL), push adds new as both head/tail
+ *     push wins - updates head/tail, becomes 1 entry case.
+ *   1 entry - taillock race
+ *     pop wins - return(pop) sets head/tail NULL, becomes 0 entry case
+ *     push wins - updates {head,tail}->link.next, pop updates head
+ *                 with new ->link.next and doesn't update tail
+ *
+ */
+#define ISC_QUEUE_PUSH(queue, elt, link) \
+       do { \
+               bool headlocked = false; \
+               ISC_QLINK_INSIST(!ISC_QLINK_LINKED(elt, link)); \
+               if ((queue).head == NULL) { \
+                       LOCK(&(queue).headlock); \
+                       headlocked = true; \
+               } \
+               LOCK(&(queue).taillock); \
+               if ((queue).tail == NULL && !headlocked) { \
+                       UNLOCK(&(queue).taillock); \
+                       LOCK(&(queue).headlock); \
+                       LOCK(&(queue).taillock); \
+                       headlocked = true; \
+               } \
+               (elt)->link.prev = (queue).tail; \
+               (elt)->link.next = NULL; \
+               if ((queue).tail != NULL) \
+                       (queue).tail->link.next = (elt); \
+               (queue).tail = (elt); \
+               UNLOCK(&(queue).taillock); \
+               if (headlocked) { \
+                       if ((queue).head == NULL) \
+                               (queue).head = (elt); \
+                       UNLOCK(&(queue).headlock); \
+               } \
+       } while (0)
+
+#define ISC_QUEUE_POP(queue, link, ret) \
+       do { \
+               LOCK(&(queue).headlock); \
+               ret = (queue).head; \
+               while (ret != NULL) { \
+                       if (ret->link.next == NULL) { \
+                               LOCK(&(queue).taillock); \
+                               if (ret->link.next == NULL) { \
+                                       (queue).head = (queue).tail = NULL; \
+                                       UNLOCK(&(queue).taillock); \
+                                       break; \
+                               }\
+                               UNLOCK(&(queue).taillock); \
+                       } \
+                       (queue).head = ret->link.next; \
+                       (queue).head->link.prev = NULL; \
+                       break; \
+               } \
+               UNLOCK(&(queue).headlock); \
+               if (ret != NULL) \
+                       (ret)->link.next = (ret)->link.prev = (void *)(-1); \
+       } while(0)
+
+#define ISC_QUEUE_UNLINK(queue, elt, link) \
+       do { \
+               ISC_QLINK_INSIST(ISC_QLINK_LINKED(elt, link)); \
+               LOCK(&(queue).headlock); \
+               LOCK(&(queue).taillock); \
+               if ((elt)->link.prev == NULL) \
+                       (queue).head = (elt)->link.next; \
+               else \
+                       (elt)->link.prev->link.next = (elt)->link.next; \
+               if ((elt)->link.next == NULL) \
+                       (queue).tail = (elt)->link.prev; \
+               else \
+                       (elt)->link.next->link.prev = (elt)->link.prev; \
+               UNLOCK(&(queue).taillock); \
+               UNLOCK(&(queue).headlock); \
+               (elt)->link.next = (elt)->link.prev = (void *)(-1); \
+       } while(0)
+
 #endif /* ISC_LIST_H */
index 43080a81340fbeba45a0603ede6f2520f7b3672c..a23f7c5da07f2419be914d4c2b1517802463f796 100644 (file)
@@ -9,153 +9,7 @@
  * information regarding copyright ownership.
  */
 
-
-/*
- * This is a generic implementation of a two-lock concurrent queue.
- * There are built-in mutex locks for the head and tail of the queue,
- * allowing elements to be safely added and removed at the same time.
- *
- * NULL is "end of list"
- * -1 is "not linked"
- */
-
 #ifndef ISC_QUEUE_H
 #define ISC_QUEUE_H 1
 
-#include <stdbool.h>
-
-#include <isc/assertions.h>
-#include <isc/mutex.h>
-
-#ifdef ISC_QUEUE_CHECKINIT
-#define ISC_QLINK_INSIST(x) ISC_INSIST(x)
-#else
-#define ISC_QLINK_INSIST(x) (void)0
-#endif
-
-#define ISC_QLINK(type) struct { type *prev, *next; }
-
-#define ISC_QLINK_INIT(elt, link) \
-       do { \
-               (elt)->link.next = (elt)->link.prev = (void *)(-1); \
-       } while(0)
-
-#define ISC_QLINK_LINKED(elt, link) ((void*)(elt)->link.next != (void*)(-1))
-
-#define ISC_QUEUE(type) struct { \
-       type *head, *tail; \
-       isc_mutex_t headlock, taillock; \
-}
-
-#define ISC_QUEUE_INIT(queue, link) \
-       do { \
-               isc_mutex_init(&(queue).taillock); \
-               isc_mutex_init(&(queue).headlock); \
-               (queue).tail = (queue).head = NULL; \
-       } while (0)
-
-#define ISC_QUEUE_EMPTY(queue) ((queue).head == NULL)
-
-#define ISC_QUEUE_DESTROY(queue) \
-       do { \
-               ISC_QLINK_INSIST(ISC_QUEUE_EMPTY(queue)); \
-               isc_mutex_destroy(&(queue).taillock); \
-               isc_mutex_destroy(&(queue).headlock); \
-       } while (0)
-
-/*
- * queues are meant to separate the locks at either end.  For best effect, that
- * means keeping the ends separate - i.e. non-empty queues work best.
- *
- * a push to an empty queue has to take the pop lock to update
- * the pop side of the queue.
- * Popping the last entry has to take the push lock to update
- * the push side of the queue.
- *
- * The order is (pop, push), because a pop is presumably in the
- * latency path and a push is when we're done.
- *
- * We do an MT hot test in push to see if we need both locks, so we can
- * acquire them in order.  Hopefully that makes the case where we get
- * the push lock and find we need the pop lock (and have to release it) rare.
- *
- * > 1 entry - no collision, push works on one end, pop on the other
- *   0 entry - headlock race
- *     pop wins - return(NULL), push adds new as both head/tail
- *     push wins - updates head/tail, becomes 1 entry case.
- *   1 entry - taillock race
- *     pop wins - return(pop) sets head/tail NULL, becomes 0 entry case
- *     push wins - updates {head,tail}->link.next, pop updates head
- *                 with new ->link.next and doesn't update tail
- *
- */
-#define ISC_QUEUE_PUSH(queue, elt, link) \
-       do { \
-               bool headlocked = false; \
-               ISC_QLINK_INSIST(!ISC_QLINK_LINKED(elt, link)); \
-               if ((queue).head == NULL) { \
-                       LOCK(&(queue).headlock); \
-                       headlocked = true; \
-               } \
-               LOCK(&(queue).taillock); \
-               if ((queue).tail == NULL && !headlocked) { \
-                       UNLOCK(&(queue).taillock); \
-                       LOCK(&(queue).headlock); \
-                       LOCK(&(queue).taillock); \
-                       headlocked = true; \
-               } \
-               (elt)->link.prev = (queue).tail; \
-               (elt)->link.next = NULL; \
-               if ((queue).tail != NULL) \
-                       (queue).tail->link.next = (elt); \
-               (queue).tail = (elt); \
-               UNLOCK(&(queue).taillock); \
-               if (headlocked) { \
-                       if ((queue).head == NULL) \
-                               (queue).head = (elt); \
-                       UNLOCK(&(queue).headlock); \
-               } \
-       } while (0)
-
-#define ISC_QUEUE_POP(queue, link, ret) \
-       do { \
-               LOCK(&(queue).headlock); \
-               ret = (queue).head; \
-               while (ret != NULL) { \
-                       if (ret->link.next == NULL) { \
-                               LOCK(&(queue).taillock); \
-                               if (ret->link.next == NULL) { \
-                                       (queue).head = (queue).tail = NULL; \
-                                       UNLOCK(&(queue).taillock); \
-                                       break; \
-                               }\
-                               UNLOCK(&(queue).taillock); \
-                       } \
-                       (queue).head = ret->link.next; \
-                       (queue).head->link.prev = NULL; \
-                       break; \
-               } \
-               UNLOCK(&(queue).headlock); \
-               if (ret != NULL) \
-                       (ret)->link.next = (ret)->link.prev = (void *)(-1); \
-       } while(0)
-
-#define ISC_QUEUE_UNLINK(queue, elt, link) \
-       do { \
-               ISC_QLINK_INSIST(ISC_QLINK_LINKED(elt, link)); \
-               LOCK(&(queue).headlock); \
-               LOCK(&(queue).taillock); \
-               if ((elt)->link.prev == NULL) \
-                       (queue).head = (elt)->link.next; \
-               else \
-                       (elt)->link.prev->link.next = (elt)->link.next; \
-               if ((elt)->link.next == NULL) \
-                       (queue).tail = (elt)->link.prev; \
-               else \
-                       (elt)->link.next->link.prev = (elt)->link.prev; \
-               UNLOCK(&(queue).taillock); \
-               UNLOCK(&(queue).headlock); \
-               (elt)->link.next = (elt)->link.prev = (void *)(-1); \
-       } while(0)
-
 #endif /* ISC_QUEUE_H */
index 96f5f2bdff77db663e9fe8b5733842cd012120e0..a3fbeb047ac59233b2a03decf3e9d5445b20b233 100644 (file)
@@ -9,7 +9,6 @@
  * information regarding copyright ownership.
  */
 
-
 #ifndef ISC_RESULT_H
 #define ISC_RESULT_H 1
 
index 1588ba9645e57a9fcbbcda34b92e2783c056ee97..a1d50808813b10c712fed581cc37b2a1b30aefcf 100644 (file)
@@ -18,6 +18,7 @@
 #include <stdbool.h>
 
 #include <isc/lang.h>
+#include <isc/list.h>
 #include <isc/net.h>
 #include <isc/types.h>
 #ifdef ISC_PLATFORM_HAVESYSUNH
index 8b0401987774582a190536fe850c39042c9f731c..6520d23711127556e88cc5baa71331312cae3478 100644 (file)
  */
 #include <inttypes.h>
 #include <stdbool.h>
+
+#include <isc/lang.h>
 #include <isc/offset.h>
 
+/* Core Types.  Alphabetized by defined type. */
+
 /*
- * XXXDCL This is just for ISC_LIST and ISC_LINK, but gets all of the other
- * list macros too.
+ * Defined here so we don't need to include list.h.
  */
-#include <isc/list.h>
-
-/* Core Types.  Alphabetized by defined type. */
+#define ISC_LIST(type) struct { type *head, *tail; }
 
 typedef struct isc_appctx              isc_appctx_t;           /*%< Application context */
 typedef struct isc_backtrace_symmap    isc_backtrace_symmap_t; /*%< Symbol Table Entry */
@@ -44,7 +45,7 @@ typedef unsigned int                  isc_eventtype_t;        /*%< Event Type */
 typedef uint32_t                       isc_fsaccess_t;         /*%< FS Access */
 typedef struct isc_hash                        isc_hash_t;             /*%< Hash */
 typedef struct isc_hp                  isc_hp_t;               /*%< Hazard
-                                                                 pointer */
+                                                                    pointer */
 typedef struct isc_httpd               isc_httpd_t;            /*%< HTTP client */
 typedef void (isc_httpdfree_t)(isc_buffer_t *, void *);                /*%< HTTP free function */
 typedef struct isc_httpdmgr            isc_httpdmgr_t;         /*%< HTTP manager */
index 21f4a37529733eacda4060b6a4242fc423cc20f0..e5f8102dbad29e6bcd8e853e90b6e3ee56b298b6 100644 (file)
@@ -16,6 +16,7 @@
 
 #include <isc/lang.h>
 #include <isc/resultclass.h>
+#include <isc/types.h>
 
 /*
  * Nothing in this file truly depends on <isc/result.h>, but the
index 89ed2d4e239adf6e5de2e11c87b23277f5c08fde..73025776cdca54b42f95aed93c90241f42624c71 100644 (file)
@@ -24,7 +24,7 @@
 #define UNIT_TESTING
 #include <cmocka.h>
 
-#include <isc/queue.h>
+#include <isc/list.h>
 #include <isc/util.h>
 
 #include "isctest.h"
index 598e41179ec38ed4b3b7a48679aa867f982ff0e7..ceccec6e0e7a76470e44bc664c25dc49d7f8b4e8 100644 (file)
 #include <isc/formatcheck.h>
 #include <isc/fuzz.h>
 #include <isc/hmac.h>
+#include <isc/list.h>
 #include <isc/mutex.h>
 #include <isc/once.h>
 #include <isc/nonce.h>
 #include <isc/platform.h>
 #include <isc/print.h>
-#include <isc/queue.h>
 #include <isc/random.h>
 #include <isc/safe.h>
 #include <isc/serial.h>
index 02531f21180092d98bf2e9cbd89d9d093f38ea38..c75eafb6559e2c2750188df40f82b2e531919642 100644 (file)
 #include <stdbool.h>
 
 #include <isc/buffer.h>
+#include <isc/list.h>
 #include <isc/magic.h>
 #include <isc/stdtime.h>
 #include <isc/quota.h>
-#include <isc/queue.h>
 #include <isc/platform.h>
 
 #include <dns/db.h>
index 0eee750ae3514c463eede903c0542d70659e0d40..714819d69be47b99514ae7363396caaa61d290f2 100644 (file)
@@ -9,6 +9,7 @@
  * information regarding copyright ownership.
  */
 
+#include <isc/list.h>
 #include <isc/log.h>
 #include <isc/print.h>