glsl/list: Add an exec_list_validate function
authorJason Ekstrand <jason.ekstrand@intel.com>
Wed, 5 Nov 2014 21:57:09 +0000 (13:57 -0800)
committerJason Ekstrand <jason.ekstrand@intel.com>
Fri, 7 Nov 2014 22:53:40 +0000 (14:53 -0800)
This can be very useful for trying to debug list corruptions.

Signed-off-by: Jason Ekstrand <jason.ekstrand@intel.com>
Reviewed-by: Matt Turner <mattst88@gmail.com>
src/glsl/list.h

index b6c32bcccaf5b8569d748fb5b8ca6867c9048732..e4b063cab589fdc6523777178ea476e7f4b172b9 100644 (file)
@@ -521,6 +521,25 @@ exec_node_insert_list_before(struct exec_node *n, struct exec_list *before)
    exec_list_make_empty(before);
 }
 
+static inline void
+exec_list_validate(const struct exec_list *list)
+{
+   assert(list->head->prev == (const struct exec_node *) &list->head);
+   assert(list->tail == NULL);
+   assert(list->tail_pred->next == (const struct exec_node *) &list->tail);
+
+   /* We could try to use one of the interators below for this but they all
+    * either require C++ or assume the exec_node is embedded in a structure
+    * which is not the case for this function.
+    */
+   for (const struct exec_node *node = exec_list_get_head_const(list);
+        !exec_node_is_tail_sentinel(node);
+        node = exec_node_get_next_const(node)) {
+      assert(node->next->prev == node);
+      assert(node->prev->next == node);
+   }
+}
+
 #ifdef __cplusplus
 inline void exec_list::make_empty()
 {