Added command-line option --trace-clientobj. Renamed drd_clientobj* functions into clientobj*. Moved some code from drd_main.c into the drd_mutex.c/drd_cond.c/drd_semaphore.c.

git-svn-id: svn://svn.valgrind.org/valgrind/trunk@7522 a5019735-40e9-0310-863c-91ae7b9d1cf9
diff --git a/exp-drd/drd_barrier.c b/exp-drd/drd_barrier.c
index 30c801e..9a135b3 100644
--- a/exp-drd/drd_barrier.c
+++ b/exp-drd/drd_barrier.c
@@ -113,7 +113,7 @@
 }
 
 /** Deallocate the memory allocated by barrier_initialize() and in p->oset. 
- *  Called by drd_clientobj_destroy().
+ *  Called by clientobj_destroy().
  */
 void barrier_cleanup(struct barrier_info* p)
 {
@@ -149,10 +149,10 @@
   struct barrier_info *p;
 
   tl_assert(offsetof(DrdClientobj, barrier) == 0);
-  p = &drd_clientobj_get(barrier, ClientBarrier)->barrier;
+  p = &clientobj_get(barrier, ClientBarrier)->barrier;
   if (p == 0)
   {
-    p = &drd_clientobj_add(barrier, barrier + size, ClientBarrier)->barrier;
+    p = &clientobj_add(barrier, barrier + size, ClientBarrier)->barrier;
     barrier_initialize(p, barrier, size, count);
   }
   return p;
@@ -160,10 +160,10 @@
 
 /** Look up the address of the information associated with the client-side
  *  barrier object. */
-struct barrier_info* barrier_get(const Addr barrier)
+static struct barrier_info* barrier_get(const Addr barrier)
 {
   tl_assert(offsetof(DrdClientobj, barrier) == 0);
-  return &drd_clientobj_get(barrier, ClientBarrier)->barrier;
+  return &clientobj_get(barrier, ClientBarrier)->barrier;
 }
 
 /** Initialize a barrier with client address barrier, client size size, and
@@ -186,18 +186,32 @@
 }
 
 /** Called after pthread_barrier_destroy(). */
-void barrier_destroy(struct barrier_info* const p)
+void barrier_destroy(const Addr barrier)
 {
+  struct barrier_info* p;
+
   if (s_trace_barrier)
   {
     VG_(message)(Vg_UserMsg,
                  "[%d/%d] barrier_destroy 0x%lx",
                  VG_(get_running_tid)(),
                  thread_get_running_tid(),
-                 p->a1);
+                 barrier);
   }
-  tl_assert(p);
-  drd_clientobj_remove(p->a1, ClientBarrier);
+
+  p = barrier_get(barrier);
+  if (p == 0)
+  {
+    GenericErrInfo GEI;
+    VG_(maybe_record_error)(VG_(get_running_tid)(),
+                            GenericErr,
+                            VG_(get_IP)(VG_(get_running_tid)()),
+                            "Not a barrier",
+                            &GEI);
+    return;
+  }
+
+  clientobj_remove(p->a1, ClientBarrier);
 }
 
 /** Called before pthread_barrier_wait(). */
@@ -289,8 +303,8 @@
 {
   struct barrier_info* p;
 
-  drd_clientobj_resetiter();
-  for ( ; (p = &drd_clientobj_next(ClientBarrier)->barrier) != 0; )
+  clientobj_resetiter();
+  for ( ; (p = &clientobj_next(ClientBarrier)->barrier) != 0; )
   {
     struct barrier_thread_info* q;
     const UWord word_tid = tid;