[compiler-rt] r202947 - tsan: add interceptors for pthread_spinlock_t and ptread_rwlock_t for deadlock detector

Dmitry Vyukov dvyukov at google.com
Wed Mar 5 00:10:27 PST 2014


Author: dvyukov
Date: Wed Mar  5 02:10:27 2014
New Revision: 202947

URL: http://llvm.org/viewvc/llvm-project?rev=202947&view=rev
Log:
tsan: add interceptors for pthread_spinlock_t and ptread_rwlock_t for deadlock detector

Modified:
    compiler-rt/trunk/lib/tsan/dd/dd_interceptors.cc

Modified: compiler-rt/trunk/lib/tsan/dd/dd_interceptors.cc
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/dd/dd_interceptors.cc?rev=202947&r1=202946&r2=202947&view=diff
==============================================================================
--- compiler-rt/trunk/lib/tsan/dd/dd_interceptors.cc (original)
+++ compiler-rt/trunk/lib/tsan/dd/dd_interceptors.cc Wed Mar  5 02:10:27 2014
@@ -28,17 +28,14 @@ static void InitThread() {
 
 INTERCEPTOR(int, pthread_mutex_destroy, pthread_mutex_t *m) {
   InitThread();
-  int res = REAL(pthread_mutex_destroy)(m);
   MutexDestroy(thr, (uptr)m);
-  return res;
+  return REAL(pthread_mutex_destroy)(m);
 }
 
 INTERCEPTOR(int, pthread_mutex_lock, pthread_mutex_t *m) {
   InitThread();
-  int res = REAL(pthread_mutex_lock)(m);
-  if (res == 0)
-    MutexLock(thr, (uptr)m, true, false);
-  return res;
+  MutexLock(thr, (uptr)m, true, false);
+  return REAL(pthread_mutex_lock)(m);
 }
 
 INTERCEPTOR(int, pthread_mutex_trylock, pthread_mutex_t *m) {
@@ -52,10 +49,94 @@ INTERCEPTOR(int, pthread_mutex_trylock,
 INTERCEPTOR(int, pthread_mutex_unlock, pthread_mutex_t *m) {
   InitThread();
   MutexUnlock(thr, (uptr)m, true);
-  int res = REAL(pthread_mutex_unlock)(m);
+  return REAL(pthread_mutex_unlock)(m);
+}
+
+INTERCEPTOR(int, pthread_spin_destroy, pthread_spinlock_t *m) {
+  InitThread();
+  int res = REAL(pthread_spin_destroy)(m);
+  MutexDestroy(thr, (uptr)m);
+  return res;
+}
+
+INTERCEPTOR(int, pthread_spin_lock, pthread_spinlock_t *m) {
+  InitThread();
+  MutexLock(thr, (uptr)m, true, false);
+  return REAL(pthread_spin_lock)(m);
+}
+
+INTERCEPTOR(int, pthread_spin_trylock, pthread_spinlock_t *m) {
+  InitThread();
+  int res = REAL(pthread_spin_trylock)(m);
+  if (res == 0)
+    MutexLock(thr, (uptr)m, true, true);
+  return res;
+}
+
+INTERCEPTOR(int, pthread_spin_unlock, pthread_spinlock_t *m) {
+  InitThread();
+  MutexUnlock(thr, (uptr)m, true);
+  return REAL(pthread_spin_unlock)(m);
+}
+
+INTERCEPTOR(int, pthread_rwlock_destroy, pthread_rwlock_t *m) {
+  InitThread();
+  MutexDestroy(thr, (uptr)m);
+  return REAL(pthread_rwlock_destroy)(m);
+}
+
+INTERCEPTOR(int, pthread_rwlock_rdlock, pthread_rwlock_t *m) {
+  InitThread();
+  MutexLock(thr, (uptr)m, false, false);
+  return REAL(pthread_rwlock_rdlock)(m);
+}
+
+INTERCEPTOR(int, pthread_rwlock_tryrdlock, pthread_rwlock_t *m) {
+  InitThread();
+  int res = REAL(pthread_rwlock_tryrdlock)(m);
+  if (res == 0)
+    MutexLock(thr, (uptr)m, false, true);
+  return res;
+}
+
+INTERCEPTOR(int, pthread_rwlock_timedrdlock, pthread_rwlock_t *m,
+    const timespec *abstime) {
+  InitThread();
+  int res = REAL(pthread_rwlock_timedrdlock)(m, abstime);
+  if (res == 0)
+    MutexLock(thr, (uptr)m, false, true);
+  return res;
+}
+
+INTERCEPTOR(int, pthread_rwlock_wrlock, pthread_rwlock_t *m) {
+  InitThread();
+  MutexLock(thr, (uptr)m, true, false);
+  return REAL(pthread_rwlock_wrlock)(m);
+}
+
+INTERCEPTOR(int, pthread_rwlock_trywrlock, pthread_rwlock_t *m) {
+  InitThread();
+  int res = REAL(pthread_rwlock_trywrlock)(m);
+  if (res == 0)
+    MutexLock(thr, (uptr)m, true, true);
+  return res;
+}
+
+INTERCEPTOR(int, pthread_rwlock_timedwrlock, pthread_rwlock_t *m,
+    const timespec *abstime) {
+  InitThread();
+  int res = REAL(pthread_rwlock_timedwrlock)(m, abstime);
+  if (res == 0)
+    MutexLock(thr, (uptr)m, true, true);
   return res;
 }
 
+INTERCEPTOR(int, pthread_rwlock_unlock, pthread_rwlock_t *m) {
+  InitThread();
+  MutexUnlock(thr, (uptr)m, true);  // note: not necessary write unlock
+  return REAL(pthread_rwlock_unlock)(m);
+}
+
 namespace __dsan {
 
 void InitializeInterceptors() {
@@ -63,6 +144,20 @@ void InitializeInterceptors() {
   INTERCEPT_FUNCTION(pthread_mutex_lock);
   INTERCEPT_FUNCTION(pthread_mutex_trylock);
   INTERCEPT_FUNCTION(pthread_mutex_unlock);
+
+  INTERCEPT_FUNCTION(pthread_spin_destroy);
+  INTERCEPT_FUNCTION(pthread_spin_lock);
+  INTERCEPT_FUNCTION(pthread_spin_trylock);
+  INTERCEPT_FUNCTION(pthread_spin_unlock);
+
+  INTERCEPT_FUNCTION(pthread_rwlock_destroy);
+  INTERCEPT_FUNCTION(pthread_rwlock_rdlock);
+  INTERCEPT_FUNCTION(pthread_rwlock_tryrdlock);
+  INTERCEPT_FUNCTION(pthread_rwlock_timedrdlock);
+  INTERCEPT_FUNCTION(pthread_rwlock_wrlock);
+  INTERCEPT_FUNCTION(pthread_rwlock_trywrlock);
+  INTERCEPT_FUNCTION(pthread_rwlock_timedwrlock);
+  INTERCEPT_FUNCTION(pthread_rwlock_unlock);
 }
 
 }  // namespace __dsan





More information about the llvm-commits mailing list