diff options
author | Dmitry Vyukov <dvyukov@google.com> | 2014-03-05 08:10:27 +0000 |
---|---|---|
committer | Dmitry Vyukov <dvyukov@google.com> | 2014-03-05 08:10:27 +0000 |
commit | da2f7b994640f399d709fa635d450b7b4160bf34 (patch) | |
tree | 7a6739c2874ad3f1968cf2d10ed71594dcbd3160 /lib/tsan/dd/dd_interceptors.cc | |
parent | f5d9d82cee9f6a1a46055c92e6488329e6189ac3 (diff) |
tsan: add interceptors for pthread_spinlock_t and ptread_rwlock_t for deadlock detector
git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/trunk@202947 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/tsan/dd/dd_interceptors.cc')
-rw-r--r-- | lib/tsan/dd/dd_interceptors.cc | 109 |
1 files changed, 102 insertions, 7 deletions
diff --git a/lib/tsan/dd/dd_interceptors.cc b/lib/tsan/dd/dd_interceptors.cc index 18494908a..3374a40bf 100644 --- a/lib/tsan/dd/dd_interceptors.cc +++ b/lib/tsan/dd/dd_interceptors.cc @@ -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, pthread_mutex_t *m) { 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 |