drd: Add post-rwlock_init and pre-rwlock_destroy client requests (#332265)

From: Ivo Raisr <ivosh@ivosh.net>


git-svn-id: svn://svn.valgrind.org/valgrind/trunk@13882 a5019735-40e9-0310-863c-91ae7b9d1cf9
diff --git a/drd/drd_clientreq.c b/drd/drd_clientreq.c
index 6d67916..0c97f41 100644
--- a/drd/drd_clientreq.c
+++ b/drd/drd_clientreq.c
@@ -510,11 +510,21 @@
       break;
 
    case VG_USERREQ__PRE_RWLOCK_INIT:
-      DRD_(rwlock_pre_init)(arg[1], pthread_rwlock);
+      if (DRD_(thread_enter_synchr)(drd_tid) == 0)
+         DRD_(rwlock_pre_init)(arg[1], pthread_rwlock);
+      break;
+
+   case VG_USERREQ__POST_RWLOCK_INIT:
+      DRD_(thread_leave_synchr)(drd_tid);
+      break;
+
+   case VG_USERREQ__PRE_RWLOCK_DESTROY:
+      DRD_(thread_enter_synchr)(drd_tid);
       break;
 
    case VG_USERREQ__POST_RWLOCK_DESTROY:
-      DRD_(rwlock_post_destroy)(arg[1], pthread_rwlock);
+      if (DRD_(thread_leave_synchr)(drd_tid) == 0)
+         DRD_(rwlock_post_destroy)(arg[1], pthread_rwlock);
       break;
 
    case VG_USERREQ__PRE_RWLOCK_RDLOCK:
diff --git a/drd/drd_clientreq.h b/drd/drd_clientreq.h
index 0171091..c5d0623 100644
--- a/drd/drd_clientreq.h
+++ b/drd/drd_clientreq.h
@@ -197,6 +197,12 @@
 
    /* To notify the drd tool of a pthread_rwlock_init call. */
    VG_USERREQ__PRE_RWLOCK_INIT,
+   /* args: Addr rwlock */
+   /* To notify the drd tool of a pthread_rwlock_init call. */
+   VG_USERREQ__POST_RWLOCK_INIT,
+   /* args: Addr rwlock */
+   /* To notify the drd tool of a pthread_rwlock_destroy call. */
+   VG_USERREQ__PRE_RWLOCK_DESTROY,
    /* args: Addr rwlock, RwLockT */
    /* To notify the drd tool of a pthread_rwlock_destroy call. */
    VG_USERREQ__POST_RWLOCK_DESTROY,
diff --git a/drd/drd_pthread_intercepts.c b/drd/drd_pthread_intercepts.c
index 0fe90c9..e66297e 100644
--- a/drd/drd_pthread_intercepts.c
+++ b/drd/drd_pthread_intercepts.c
@@ -1101,6 +1101,8 @@
    VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__PRE_RWLOCK_INIT,
                                    rwlock, 0, 0, 0, 0);
    CALL_FN_W_WW(ret, fn, rwlock, attr);
+   VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__POST_RWLOCK_INIT,
+                                   rwlock, 0, 0, 0, 0);
    return ret;
 }
 
@@ -1115,6 +1117,8 @@
    int   ret;
    OrigFn fn;
    VALGRIND_GET_ORIG_FN(fn);
+   VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__PRE_RWLOCK_DESTROY,
+                                   rwlock, 0, 0, 0, 0);
    CALL_FN_W_W(ret, fn, rwlock);
    VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__POST_RWLOCK_DESTROY,
                                    rwlock, 0, 0, 0, 0);