[sanitizer] Intercept __pthread_mutex_lock and __pthread_mutex_unlock
Reviewers: eugenis, dvyukov Subscribers: srhines, kubamracek, llvm-commits Differential Revision: https://reviews.llvm.org/D46793 llvm-svn: 332320
This commit is contained in:
parent
3f1fd7988c
commit
75e01fa00b
|
|
@ -4054,6 +4054,24 @@ INTERCEPTOR(int, pthread_mutex_unlock, void *m) {
|
||||||
#define INIT_PTHREAD_MUTEX_UNLOCK
|
#define INIT_PTHREAD_MUTEX_UNLOCK
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if SANITIZER_INTERCEPT___PTHREAD_MUTEX
|
||||||
|
INTERCEPTOR(int, __pthread_mutex_lock, void *m) {
|
||||||
|
return WRAP(pthread_mutex_lock)(m);
|
||||||
|
}
|
||||||
|
|
||||||
|
INTERCEPTOR(int, __pthread_mutex_unlock, void *m) {
|
||||||
|
return WRAP(pthread_mutex_unlock)(m);
|
||||||
|
}
|
||||||
|
|
||||||
|
#define INIT___PTHREAD_MUTEX_LOCK \
|
||||||
|
COMMON_INTERCEPT_FUNCTION(__pthread_mutex_lock)
|
||||||
|
#define INIT___PTHREAD_MUTEX_UNLOCK \
|
||||||
|
COMMON_INTERCEPT_FUNCTION(__pthread_mutex_unlock)
|
||||||
|
#else
|
||||||
|
#define INIT___PTHREAD_MUTEX_LOCK
|
||||||
|
#define INIT___PTHREAD_MUTEX_UNLOCK
|
||||||
|
#endif
|
||||||
|
|
||||||
#if SANITIZER_INTERCEPT___LIBC_MUTEX
|
#if SANITIZER_INTERCEPT___LIBC_MUTEX
|
||||||
INTERCEPTOR(int, __libc_mutex_lock, void *m)
|
INTERCEPTOR(int, __libc_mutex_lock, void *m)
|
||||||
ALIAS(WRAPPER_NAME(pthread_mutex_lock));
|
ALIAS(WRAPPER_NAME(pthread_mutex_lock));
|
||||||
|
|
@ -7302,6 +7320,8 @@ static void InitializeCommonInterceptors() {
|
||||||
INIT__EXIT;
|
INIT__EXIT;
|
||||||
INIT_PTHREAD_MUTEX_LOCK;
|
INIT_PTHREAD_MUTEX_LOCK;
|
||||||
INIT_PTHREAD_MUTEX_UNLOCK;
|
INIT_PTHREAD_MUTEX_UNLOCK;
|
||||||
|
INIT___PTHREAD_MUTEX_LOCK;
|
||||||
|
INIT___PTHREAD_MUTEX_UNLOCK;
|
||||||
INIT___LIBC_MUTEX_LOCK;
|
INIT___LIBC_MUTEX_LOCK;
|
||||||
INIT___LIBC_MUTEX_UNLOCK;
|
INIT___LIBC_MUTEX_UNLOCK;
|
||||||
INIT___LIBC_THR_SETCANCELSTATE;
|
INIT___LIBC_THR_SETCANCELSTATE;
|
||||||
|
|
|
||||||
|
|
@ -365,6 +365,7 @@
|
||||||
(SI_LINUX || SI_FREEBSD || SI_NETBSD || SI_OPENBSD || SI_MAC || SI_SOLARIS)
|
(SI_LINUX || SI_FREEBSD || SI_NETBSD || SI_OPENBSD || SI_MAC || SI_SOLARIS)
|
||||||
|
|
||||||
#define SANITIZER_INTERCEPT_PTHREAD_MUTEX SI_POSIX
|
#define SANITIZER_INTERCEPT_PTHREAD_MUTEX SI_POSIX
|
||||||
|
#define SANITIZER_INTERCEPT___PTHREAD_MUTEX SI_LINUX_NOT_ANDROID
|
||||||
#define SANITIZER_INTERCEPT___LIBC_MUTEX SI_NETBSD
|
#define SANITIZER_INTERCEPT___LIBC_MUTEX SI_NETBSD
|
||||||
#define SANITIZER_INTERCEPT_PTHREAD_SETNAME_NP \
|
#define SANITIZER_INTERCEPT_PTHREAD_SETNAME_NP \
|
||||||
(SI_FREEBSD || SI_NETBSD || SI_OPENBSD || SI_LINUX_NOT_ANDROID || SI_SOLARIS)
|
(SI_FREEBSD || SI_NETBSD || SI_OPENBSD || SI_LINUX_NOT_ANDROID || SI_SOLARIS)
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,34 @@
|
||||||
|
// RUN: %clangxx -O1 %s -o %t && %run %t
|
||||||
|
// RUN: %clangxx -O1 -DUSE_GLIBC %s -o %t && %run %t
|
||||||
|
// UNSUPPORTED: android
|
||||||
|
|
||||||
|
#include <pthread.h>
|
||||||
|
|
||||||
|
#ifdef USE_GLIBC
|
||||||
|
extern "C" int __pthread_mutex_lock(pthread_mutex_t *__mutex);
|
||||||
|
extern "C" int __pthread_mutex_unlock(pthread_mutex_t *__mutex);
|
||||||
|
#define LOCK __pthread_mutex_lock
|
||||||
|
#define UNLOCK __pthread_mutex_unlock
|
||||||
|
#else
|
||||||
|
#define LOCK pthread_mutex_lock
|
||||||
|
#define UNLOCK pthread_mutex_unlock
|
||||||
|
#endif
|
||||||
|
|
||||||
|
pthread_mutex_t m = PTHREAD_MUTEX_INITIALIZER;
|
||||||
|
int x;
|
||||||
|
|
||||||
|
static void *Start(void *arg) {
|
||||||
|
LOCK(&m);
|
||||||
|
++x;
|
||||||
|
UNLOCK(&m);
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
int main() {
|
||||||
|
pthread_t threads[2] = {};
|
||||||
|
for (pthread_t &t : threads)
|
||||||
|
pthread_create(&t, 0, &Start, 0);
|
||||||
|
for (pthread_t &t : threads)
|
||||||
|
pthread_join(t, 0);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue