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_semaphore.c b/exp-drd/drd_semaphore.c
index 513dcd1..48b6f91 100644
--- a/exp-drd/drd_semaphore.c
+++ b/exp-drd/drd_semaphore.c
@@ -72,7 +72,7 @@
 }
 
 /** Free the memory that was allocated by semaphore_initialize(). Called by
- *  drd_clientobj_remove().
+ *  clientobj_remove().
  */
 static void semaphore_cleanup(struct semaphore_info* p)
 {
@@ -96,21 +96,21 @@
   struct semaphore_info *p;
 
   tl_assert(offsetof(DrdClientobj, semaphore) == 0);
-  p = &drd_clientobj_get(semaphore, ClientSemaphore)->semaphore;
+  p = &clientobj_get(semaphore, ClientSemaphore)->semaphore;
   if (p == 0)
   {
     tl_assert(offsetof(DrdClientobj, semaphore) == 0);
-    p = &drd_clientobj_add(semaphore, semaphore + size,
+    p = &clientobj_add(semaphore, semaphore + size,
                            ClientSemaphore)->semaphore;
     semaphore_initialize(p, semaphore, size, 0);
   }
   return p;
 }
 
-struct semaphore_info* semaphore_get(const Addr semaphore)
+static struct semaphore_info* semaphore_get(const Addr semaphore)
 {
   tl_assert(offsetof(DrdClientobj, semaphore) == 0);
-  return &drd_clientobj_get(semaphore, ClientSemaphore)->semaphore;
+  return &clientobj_get(semaphore, ClientSemaphore)->semaphore;
 }
 
 /** Called before sem_init(). */
@@ -134,9 +134,9 @@
 }
 
 /** Called after sem_destroy(). */
-void semaphore_destroy(struct semaphore_info* const p)
+void semaphore_destroy(const Addr semaphore)
 {
-  tl_assert(p);
+  struct semaphore_info* p;
 
   if (s_trace_semaphore)
   {
@@ -144,10 +144,23 @@
                  "[%d/%d] semaphore_destroy 0x%lx",
                  VG_(get_running_tid)(),
                  thread_get_running_tid(),
-                 p->a1);
+                 semaphore);
   }
 
-  drd_clientobj_remove(p->a1, ClientSemaphore);
+  p = semaphore_get(semaphore);
+
+  if (p == 0)
+  {
+    GenericErrInfo GEI;
+    VG_(maybe_record_error)(VG_(get_running_tid)(),
+                            GenericErr,
+                            VG_(get_IP)(VG_(get_running_tid)()),
+                            "Not a semaphore",
+                            &GEI);
+    return;
+  }
+
+  clientobj_remove(semaphore, ClientSemaphore);
 }
 
 /** Called before sem_wait(). */