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