Added support for OpenMP barriers -- if libgomp.so has been built with debug information. More in general, added support for nested synchronization constructs.
git-svn-id: svn://svn.valgrind.org/valgrind/trunk@7642 a5019735-40e9-0310-863c-91ae7b9d1cf9
diff --git a/exp-drd/drd_semaphore.c b/exp-drd/drd_semaphore.c
index 48b6f91..607abe9 100644
--- a/exp-drd/drd_semaphore.c
+++ b/exp-drd/drd_semaphore.c
@@ -54,14 +54,10 @@
static
void semaphore_initialize(struct semaphore_info* const p,
- const Addr semaphore,
- const SizeT size,
- const UWord value)
+ const Addr semaphore, const UWord value)
{
tl_assert(semaphore != 0);
- tl_assert(size > 0);
tl_assert(p->a1 == semaphore);
- tl_assert(p->a2 - p->a1 == size);
tl_assert(p->type == ClientSemaphore);
p->cleanup = (void(*)(DrdClientobj*))semaphore_cleanup;
@@ -91,7 +87,7 @@
static
struct semaphore_info*
-semaphore_get_or_allocate(const Addr semaphore, const SizeT size)
+semaphore_get_or_allocate(const Addr semaphore)
{
struct semaphore_info *p;
@@ -100,9 +96,8 @@
if (p == 0)
{
tl_assert(offsetof(DrdClientobj, semaphore) == 0);
- p = &clientobj_add(semaphore, semaphore + size,
- ClientSemaphore)->semaphore;
- semaphore_initialize(p, semaphore, size, 0);
+ p = &clientobj_add(semaphore, ClientSemaphore)->semaphore;
+ semaphore_initialize(p, semaphore, 0);
}
return p;
}
@@ -114,7 +109,7 @@
}
/** Called before sem_init(). */
-struct semaphore_info* semaphore_init(const Addr semaphore, const SizeT size,
+struct semaphore_info* semaphore_init(const Addr semaphore,
const Word pshared, const UWord value)
{
struct semaphore_info* p;
@@ -127,8 +122,11 @@
thread_get_running_tid(),
semaphore);
}
- tl_assert(semaphore_get(semaphore) == 0);
- p = semaphore_get_or_allocate(semaphore, size);
+ if (semaphore_get(semaphore))
+ {
+ // To do: print an error message that a semaphore is being reinitialized.
+ }
+ p = semaphore_get_or_allocate(semaphore);
p->value = value;
return p;
}
@@ -164,11 +162,11 @@
}
/** Called before sem_wait(). */
-void semaphore_pre_wait(const Addr semaphore, const SizeT size)
+void semaphore_pre_wait(const Addr semaphore)
{
struct semaphore_info* p;
- p = semaphore_get_or_allocate(semaphore, size);
+ p = semaphore_get_or_allocate(semaphore);
if (s_trace_semaphore)
{
VG_(message)(Vg_UserMsg,
@@ -223,8 +221,7 @@
}
/** Called before sem_post(). */
-void semaphore_pre_post(const DrdThreadId tid, const Addr semaphore,
- const SizeT size)
+void semaphore_pre_post(const DrdThreadId tid, const Addr semaphore)
{
struct semaphore_info* p;
@@ -236,7 +233,7 @@
thread_get_running_tid(),
semaphore);
}
- p = semaphore_get_or_allocate(semaphore, size);
+ p = semaphore_get_or_allocate(semaphore);
p->value++;
if (p->value == 1)
{
@@ -248,7 +245,7 @@
/** Called after sem_post() finished successfully. */
void semaphore_post_post(const DrdThreadId tid, const Addr semaphore,
- const SizeT size, const Bool waited)
+ const Bool waited)
{
/* Note: it is hard to implement the sem_post() wrapper correctly in */
/* case sem_post() returns an error code. This is because handling this */