libmdb: Improved top-level assertion checking preprocessor switch.
authorSimon Gerber <simon.gerber@inf.ethz.ch>
Fri, 5 Dec 2014 15:42:39 +0000 (16:42 +0100)
committerSimon Gerber <simon.gerber@inf.ethz.ch>
Fri, 5 Dec 2014 15:42:39 +0000 (16:42 +0100)
* Moved assertions about reachability of nodes being inserted/removed inside
  toplevel invariant checking macros

lib/mdb/mdb_tree.c

index 4779a81..79a4e42 100644 (file)
@@ -51,9 +51,13 @@ mdb_dump_and_fail(struct cte *cte, enum mdb_invariant failure)
 
 // PP switch to toggle top-level checking of invariants
 #ifdef MDB_CHECK_INVARIANTS
-#define CHECK_INVARIANTS(cte) mdb_check_subtree_invariants(cte)
+#define CHECK_INVARIANTS(cte, assertion) \
+do { \
+    assert(assertion); \
+    mdb_check_subtree_invariants(cte) \
+} while(0)
 #else
-#define CHECK_INVARIANTS(cte) ((void)0)
+#define CHECK_INVARIANTS(cte, assertion) ((void)0)
 #endif
 
 // PP switch to toggle recursive checking of invariants by default
@@ -61,7 +65,6 @@ mdb_dump_and_fail(struct cte *cte, enum mdb_invariant failure)
 // disable toplevel invariants checks as we're doing them anyway
 #undef CHECK_INVARIANTS
 #define CHECK_INVARIANTS ((void)0)
-
 #define CHECK_INVARIANTS_SUB(cte) mdb_check_subtree_invariants(cte)
 #else
 #define CHECK_INVARIANTS_SUB(cte) ((void)0)
@@ -593,7 +596,7 @@ errval_t
 mdb_insert(struct cte *new_node)
 {
     MDB_TRACE_ENTER(mdb_root, "%p", new_node);
-    CHECK_INVARIANTS(mdb_root);
+    CHECK_INVARIANTS(mdb_root, !mdb_is_reachable(mdb_root, new_node));
 #ifdef IN_KERNEL
 #ifdef MDB_TRACE_NO_RECURSIVE
     char prefix[50];
@@ -602,8 +605,7 @@ mdb_insert(struct cte *new_node)
 #endif
 #endif
     errval_t ret = mdb_sub_insert(new_node, &mdb_root);
-    assert(mdb_is_reachable(mdb_root, new_node));
-    CHECK_INVARIANTS(mdb_root);
+    CHECK_INVARIANTS(mdb_root, mdb_is_reachable(mdb_root, new_node));
     MDB_TRACE_LEAVE_SUB_RET("%"PRIuPTR, ret, mdb_root);
 }
 
@@ -824,7 +826,7 @@ errval_t
 mdb_remove(struct cte *target)
 {
     MDB_TRACE_ENTER(mdb_root, "%p", target);
-    CHECK_INVARIANTS(mdb_root);
+    CHECK_INVARIANTS(mdb_root, mdb_is_reachable(mdb_root, target));
 #ifdef IN_KERNEL
 #ifdef MDB_TRACE_NO_RECURSIVE
     char prefix[50];
@@ -833,8 +835,7 @@ mdb_remove(struct cte *target)
 #endif
 #endif
     errval_t err = mdb_subtree_remove(target, &mdb_root, NULL);
-    assert(!mdb_is_reachable(mdb_root, target));
-    CHECK_INVARIANTS(mdb_root);
+    CHECK_INVARIANTS(mdb_root, !mdb_is_reachable(mdb_root, target));
     MDB_TRACE_LEAVE_SUB_RET("%"PRIuPTR, err, mdb_root);
 }