forked from OSchip/llvm-project
[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
|
||||
#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
|
||||
INTERCEPTOR(int, __libc_mutex_lock, void *m)
|
||||
ALIAS(WRAPPER_NAME(pthread_mutex_lock));
|
||||
|
@ -7302,6 +7320,8 @@ static void InitializeCommonInterceptors() {
|
|||
INIT__EXIT;
|
||||
INIT_PTHREAD_MUTEX_LOCK;
|
||||
INIT_PTHREAD_MUTEX_UNLOCK;
|
||||
INIT___PTHREAD_MUTEX_LOCK;
|
||||
INIT___PTHREAD_MUTEX_UNLOCK;
|
||||
INIT___LIBC_MUTEX_LOCK;
|
||||
INIT___LIBC_MUTEX_UNLOCK;
|
||||
INIT___LIBC_THR_SETCANCELSTATE;
|
||||
|
|
|
@ -365,6 +365,7 @@
|
|||
(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_LINUX_NOT_ANDROID
|
||||
#define SANITIZER_INTERCEPT___LIBC_MUTEX SI_NETBSD
|
||||
#define SANITIZER_INTERCEPT_PTHREAD_SETNAME_NP \
|
||||
(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