diff options
| author | Alexander Potapenko <glider@google.com> | 2012-09-11 09:26:35 +0000 |
|---|---|---|
| committer | Alexander Potapenko <glider@google.com> | 2012-09-11 09:26:35 +0000 |
| commit | 1a471772b019b528f7f4c09b02ede47f65dd0824 (patch) | |
| tree | 99fc4cdc384d7edaf11f5dcd2cb6ab164e8cefaa /compiler-rt | |
| parent | 69a56fffae3b16f72991eca3fe2f51f8806b1593 (diff) | |
| download | bcm5719-llvm-1a471772b019b528f7f4c09b02ede47f65dd0824.tar.gz bcm5719-llvm-1a471772b019b528f7f4c09b02ede47f65dd0824.zip | |
Interceptors for lockf and lockf64, minor calloc() fix.
llvm-svn: 163602
Diffstat (limited to 'compiler-rt')
| -rw-r--r-- | compiler-rt/lib/tsan/rtl/tsan_interceptors.cc | 42 | ||||
| -rw-r--r-- | compiler-rt/lib/tsan/rtl/tsan_stat.cc | 2 | ||||
| -rw-r--r-- | compiler-rt/lib/tsan/rtl/tsan_stat.h | 2 |
3 files changed, 45 insertions, 1 deletions
diff --git a/compiler-rt/lib/tsan/rtl/tsan_interceptors.cc b/compiler-rt/lib/tsan/rtl/tsan_interceptors.cc index f0a46ac618f..2e024a87e4e 100644 --- a/compiler-rt/lib/tsan/rtl/tsan_interceptors.cc +++ b/compiler-rt/lib/tsan/rtl/tsan_interceptors.cc @@ -68,6 +68,12 @@ const int PTHREAD_BARRIER_SERIAL_THREAD = -1; const int MAP_FIXED = 0x10; typedef long long_t; // NOLINT +// From /usr/include/unistd.h +# define F_ULOCK 0 /* Unlock a previously locked region. */ +# define F_LOCK 1 /* Lock a region for exclusive use. */ +# define F_TLOCK 2 /* Test and lock a region for exclusive use. */ +# define F_TEST 3 /* Test a region for other processes locks. */ + typedef void (*sighandler_t)(int sig); #define errno (*__errno_location()) @@ -353,7 +359,7 @@ TSAN_INTERCEPTOR(void*, calloc, uptr size, uptr n) { { SCOPED_INTERCEPTOR_RAW(calloc, size, n); p = user_alloc(thr, pc, n * size); - internal_memset(p, 0, n * size); + if (p) internal_memset(p, 0, n * size); } invoke_malloc_hook(p, n * size); return p; @@ -1198,6 +1204,38 @@ TSAN_INTERCEPTOR(long_t, pwritev64, int fd, void *vec, int cnt, u64 off) { return res; } +// |func| is either lockf or lockf64. +#define LOCKF_BODY(func) \ + SCOPED_TSAN_INTERCEPTOR(func, fd, cmd, len); \ + int res = -1; \ + switch (cmd) { \ + case F_ULOCK: { \ + Release(thr, pc, fd2addr(fd)); \ + res = REAL(func)(fd, cmd, len); \ + break; \ + } \ + case F_LOCK: \ + case F_TLOCK: { \ + res = REAL(func)(fd, cmd, len); \ + if (res != -1) Acquire(thr, pc, fd2addr(fd)); \ + break; \ + } \ + default: { \ + res = REAL(func)(fd, cmd, len); \ + break; \ + } \ + } \ + return res; \ +/**/ + +TSAN_INTERCEPTOR(int, lockf, int fd, int cmd, unsigned len) { + LOCKF_BODY(lockf); +} + +TSAN_INTERCEPTOR(int, lockf64, int fd, int cmd, u64 len) { + LOCKF_BODY(lockf64); +} + TSAN_INTERCEPTOR(long_t, send, int fd, void *buf, long_t len, int flags) { SCOPED_TSAN_INTERCEPTOR(send, fd, buf, len, flags); Release(thr, pc, fd2addr(fd)); @@ -1571,6 +1609,8 @@ void InitializeInterceptors() { TSAN_INTERCEPT(pwrite64); TSAN_INTERCEPT(writev); TSAN_INTERCEPT(pwritev64); + TSAN_INTERCEPT(lockf); + TSAN_INTERCEPT(lockf64); TSAN_INTERCEPT(send); TSAN_INTERCEPT(sendmsg); TSAN_INTERCEPT(recv); diff --git a/compiler-rt/lib/tsan/rtl/tsan_stat.cc b/compiler-rt/lib/tsan/rtl/tsan_stat.cc index a7c33a5de76..671ae564265 100644 --- a/compiler-rt/lib/tsan/rtl/tsan_stat.cc +++ b/compiler-rt/lib/tsan/rtl/tsan_stat.cc @@ -183,6 +183,8 @@ void StatOutput(u64 *stat) { name[StatInt_pwrite64] = " pwrite64 "; name[StatInt_writev] = " writev "; name[StatInt_pwritev64] = " pwritev64 "; + name[StatInt_lockf] = " lockf "; + name[StatInt_lockf64] = " lockf64 "; name[StatInt_send] = " send "; name[StatInt_sendmsg] = " sendmsg "; name[StatInt_recv] = " recv "; diff --git a/compiler-rt/lib/tsan/rtl/tsan_stat.h b/compiler-rt/lib/tsan/rtl/tsan_stat.h index d99491f745a..08cd1ded820 100644 --- a/compiler-rt/lib/tsan/rtl/tsan_stat.h +++ b/compiler-rt/lib/tsan/rtl/tsan_stat.h @@ -181,6 +181,8 @@ enum StatType { StatInt_pwrite64, StatInt_writev, StatInt_pwritev64, + StatInt_lockf, + StatInt_lockf64, StatInt_send, StatInt_sendmsg, StatInt_recv, |

