forked from OSchip/llvm-project
Interceptors for lockf and lockf64, minor calloc() fix.
llvm-svn: 163602
This commit is contained in:
parent
69a56fffae
commit
1a471772b0
|
@ -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);
|
||||
|
|
|
@ -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 ";
|
||||
|
|
|
@ -181,6 +181,8 @@ enum StatType {
|
|||
StatInt_pwrite64,
|
||||
StatInt_writev,
|
||||
StatInt_pwritev64,
|
||||
StatInt_lockf,
|
||||
StatInt_lockf64,
|
||||
StatInt_send,
|
||||
StatInt_sendmsg,
|
||||
StatInt_recv,
|
||||
|
|
Loading…
Reference in New Issue