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);
}