summaryrefslogtreecommitdiff
path: root/lib/igt_aux.h
diff options
context:
space:
mode:
authorLyude <lyude@redhat.com>2016-11-21 13:43:36 -0500
committerChris Wilson <chris@chris-wilson.co.uk>2016-11-29 11:32:44 +0000
commitd57ae360b32c4edfb88e9a0400ec5ec3a3e6959f (patch)
tree70d543ca06bc4208067dcd155adf99bf2009fe16 /lib/igt_aux.h
parentd529a5748f28bafd2aa74a1166e391c9468bf49d (diff)
igt_aux: Add some list helpers from wayland
Since we're going to be using lists for keeping track of EDIDs we've allocated on the chamelium, add some generic list helpers from the wayland project. Signed-off-by: Lyude <lyude@redhat.com> Changes since v1: - Rename list helpers to be more like those from the Linux kernel v2: Make the api compatible with the kernel as well.
Diffstat (limited to 'lib/igt_aux.h')
-rw-r--r--lib/igt_aux.h89
1 files changed, 89 insertions, 0 deletions
diff --git a/lib/igt_aux.h b/lib/igt_aux.h
index d4da499a..177bd1d2 100644
--- a/lib/igt_aux.h
+++ b/lib/igt_aux.h
@@ -30,6 +30,7 @@
#include <intel_bufmgr.h>
#include <stdbool.h>
+#include <stddef.h>
#include <sys/time.h>
extern drm_intel_bo **trash_bos;
@@ -274,4 +275,92 @@ double igt_stop_siglatency(struct igt_mean *result);
void igt_set_module_param(const char *name, const char *val);
void igt_set_module_param_int(const char *name, int val);
+/*
+ * This list data structure is a verbatim copy from wayland-util.h from the
+ * Wayland project; except that wl_ prefix has been removed.
+ */
+
+struct igt_list {
+ struct igt_list *prev;
+ struct igt_list *next;
+};
+
+#define __IGT_INIT_LIST(name) (struct igt_list){ &(name), &(name) }
+#define IGT_LIST(name) struct igt_list name = __IGT_INIT_LIST(name);
+
+static inline void igt_list_init(struct igt_list *list)
+{
+ list->prev = list;
+ list->next = list;
+}
+
+static inline void __igt_list_add(struct igt_list *list,
+ struct igt_list *prev,
+ struct igt_list *next)
+{
+ next->prev = list;
+ list->next = next;
+ list->prev = prev;
+ prev->next = list;
+}
+
+static inline void igt_list_add(struct igt_list *elm, struct igt_list *list)
+{
+ __igt_list_add(elm, list, list->next);
+}
+
+static inline void igt_list_add_tail(struct igt_list *elm,
+ struct igt_list *list)
+{
+ __igt_list_add(elm, list->prev, list);
+}
+
+static inline void __igt_list_del(struct igt_list *prev, struct igt_list *next)
+{
+ next->prev = prev;
+ prev->next = next;
+}
+
+static inline void igt_list_del(struct igt_list *elm)
+{
+ __igt_list_del(elm->prev, elm->next);
+}
+
+static inline void igt_list_move(struct igt_list *elm, struct igt_list *list)
+{
+ igt_list_del(elm);
+ igt_list_add(elm, list);
+}
+
+static inline void igt_list_move_tail(struct igt_list *elm,
+ struct igt_list *list)
+{
+ igt_list_del(elm);
+ igt_list_add_tail(elm, list);
+}
+
+static inline bool igt_list_empty(const struct igt_list *list)
+{
+ return list->next == list;
+}
+
+#define container_of(ptr, sample, member) \
+ (typeof(sample))((char *)(ptr) - offsetof(typeof(*sample), member))
+
+#define igt_list_first_entry(head, pos, member) \
+ container_of((head)->next, (pos), member)
+#define igt_list_next_entry(pos, member) \
+ container_of((pos)->member.next, (pos), member)
+
+#define igt_list_for_each(pos, head, member) \
+ for (pos = igt_list_first_entry(head, pos, member); \
+ &pos->member != (head); \
+ pos = igt_list_next_entry(pos, member))
+
+#define igt_list_for_each_safe(pos, tmp, head, member) \
+ for (pos = igt_list_first_entry(head, pos, member), \
+ tmp = igt_list_next_entry(pos, member); \
+ &pos->member != (head); \
+ pos = tmp, tmp = igt_list_next_entry(pos, member))
+
#endif /* IGT_AUX_H */