Handle statically initialized condition variables properly.

git-svn-id: svn://svn.valgrind.org/valgrind/trunk@11139 a5019735-40e9-0310-863c-91ae7b9d1cf9
diff --git a/drd/drd_cond.c b/drd/drd_cond.c
index 456b290..bef880f 100644
--- a/drd/drd_cond.c
+++ b/drd/drd_cond.c
@@ -29,6 +29,7 @@
 #include "drd_mutex.h"
 #include "pub_tool_errormgr.h"    /* VG_(maybe_record_error)() */
 #include "pub_tool_libcassert.h"  /* tl_assert()               */
+#include "pub_tool_libcbase.h"    /* VG_(memcmp)()             */
 #include "pub_tool_libcprint.h"   /* VG_(printf)()             */
 #include "pub_tool_machine.h"     /* VG_(get_IP)()             */
 #include "pub_tool_threadstate.h" /* VG_(get_running_tid)()    */
@@ -45,6 +46,12 @@
 static Bool DRD_(s_trace_cond);
 
 
+/* Global variables. */
+
+Addr DRD_(pthread_cond_initializer);
+int DRD_(pthread_cond_initializer_size);
+
+
 /* Function definitions. */
 
 void DRD_(cond_set_report_signal_unlocked)(const Bool r)
@@ -382,12 +389,17 @@
                    cond);
    }
 
-   if (!p)
+   tl_assert(DRD_(pthread_cond_initializer));
+   if (!p && VG_(memcmp)((void*)cond, (void*)DRD_(pthread_cond_initializer),
+                         DRD_(pthread_cond_initializer_size)) != 0)
    {
       not_initialized(cond);
       return;
    }
 
+   if (!p)
+      p = cond_get_or_allocate(cond);
+
    cond_signal(DRD_(thread_get_running_tid)(), p);
 }
 
@@ -405,11 +417,16 @@
    }
 
    p = DRD_(cond_get)(cond);
-   if (!p)
+   tl_assert(DRD_(pthread_cond_initializer));
+   if (!p && VG_(memcmp)((void*)cond, (void*)DRD_(pthread_cond_initializer),
+                         DRD_(pthread_cond_initializer_size)) != 0)
    {
       not_initialized(cond);
       return;
    }
 
+   if (!p)
+      p = cond_get_or_allocate(cond);
+
    cond_signal(DRD_(thread_get_running_tid)(), p);
 }