Enable danger set checking when the environment variable DRD_VERIFY_DANGER_SET is set.

git-svn-id: svn://svn.valgrind.org/valgrind/trunk@7867 a5019735-40e9-0310-863c-91ae7b9d1cf9
diff --git a/exp-drd/drd_thread.c b/exp-drd/drd_thread.c
index a996732..9df8700 100644
--- a/exp-drd/drd_thread.c
+++ b/exp-drd/drd_thread.c
@@ -27,11 +27,13 @@
 #include "drd_segment.h"
 #include "drd_suppression.h"
 #include "drd_thread.h"
+#include "pub_tool_vki.h"
 #include "pub_tool_basics.h"      // Addr, SizeT
 #include "pub_tool_errormgr.h"    // VG_(unique_error)()
 #include "pub_tool_libcassert.h"  // tl_assert()
 #include "pub_tool_libcbase.h"    // VG_(strlen)()
 #include "pub_tool_libcprint.h"   // VG_(printf)()
+#include "pub_tool_libcproc.h"    // VG_(getenv)()
 #include "pub_tool_machine.h"
 #include "pub_tool_mallocfree.h"  // VG_(malloc)(), VG_(free)()
 #include "pub_tool_options.h"     // VG_(clo_backtrace_size)
@@ -43,6 +45,7 @@
 static void thread_append_segment(const DrdThreadId tid,
                                   Segment* const sg);
 static void thread_discard_segment(const DrdThreadId tid, Segment* const sg);
+static Bool thread_danger_set_up_to_date(const DrdThreadId tid);
 static void thread_compute_danger_set(struct bitmap** danger_set,
                                      const DrdThreadId tid);
 
@@ -682,6 +685,10 @@
     thread_compute_danger_set(&s_danger_set, s_drd_running_tid);
     s_danger_set_new_segment_count++;
   }
+  else if (tid == s_drd_running_tid)
+  {
+    tl_assert(thread_danger_set_up_to_date(s_drd_running_tid));
+  }
 
   thread_discard_ordered_segments();
 
@@ -889,6 +896,29 @@
   }
 }
 
+/** Verify whether the danger set for thread tid is up to date. Only perform
+ *  the check if the environment variable DRD_VERIFY_DANGER_SET has been set.
+ */
+static Bool thread_danger_set_up_to_date(const DrdThreadId tid)
+{
+  static int do_verify_danger_set = -1;
+  Bool result;
+  struct bitmap* computed_danger_set = 0;
+
+  if (do_verify_danger_set < 0)
+  {
+    //VG_(message)(Vg_DebugMsg, "%s", VG_(getenv)("DRD_VERIFY_DANGER_SET"));
+    do_verify_danger_set = VG_(getenv)("DRD_VERIFY_DANGER_SET") != 0;
+  }
+  if (do_verify_danger_set == 0)
+    return True;
+
+  thread_compute_danger_set(&computed_danger_set, tid);
+  result = bm_compare(s_danger_set, computed_danger_set);
+  bm_delete(computed_danger_set);
+  return result;
+}
+
 /** Compute a bitmap that represents the union of all memory accesses of all
  *  segments that are unordered to the current segment of the thread tid.
  */