]> git.proxmox.com Git - ceph.git/blobdiff - ceph/src/spdk/include/spdk/queue.h
update source to Ceph Pacific 16.2.2
[ceph.git] / ceph / src / spdk / include / spdk / queue.h
index a24dd0070fd1cb92d052eee3d1c3c20df5b255fa..24e2e2e205900c458d623a082a4170c2e504c745 100644 (file)
@@ -50,6 +50,28 @@ extern "C" {
 #include "spdk/queue_extras.h"
 #endif
 
+/*
+ * scan-build can't follow double pointers in queues and often assumes
+ * that removed elements are still on the list. We redefine TAILQ_REMOVE
+ * with extra asserts to silence it.
+ */
+#ifdef __clang_analyzer__
+#undef TAILQ_REMOVE
+#define TAILQ_REMOVE(head, elm, field) do {                            \
+       __typeof__(elm) _elm;                                           \
+       if (((elm)->field.tqe_next) != NULL)                            \
+               (elm)->field.tqe_next->field.tqe_prev =                 \
+                   (elm)->field.tqe_prev;                              \
+       else                                                            \
+               (head)->tqh_last = (elm)->field.tqe_prev;               \
+       *(elm)->field.tqe_prev = (elm)->field.tqe_next;                 \
+       /* make sure the removed elm is not on the list anymore */      \
+       TAILQ_FOREACH(_elm, head, field) {                              \
+               assert(_elm != elm);                                    \
+       }                                                               \
+} while (0)
+#endif
+
 #ifdef __cplusplus
 }
 #endif