tsan: add signalfd() and inotify_init() interceptors
llvm-svn: 170429
This commit is contained in:
parent
b13abb952a
commit
d509179a0b
|
@ -90,11 +90,12 @@ static void init(ThreadState *thr, uptr pc, int fd, FdSync *s) {
|
|||
FdDesc *d = fddesc(thr, pc, fd);
|
||||
// As a matter of fact, we don't intercept all close calls.
|
||||
// See e.g. libc __res_iclose().
|
||||
if (d->sync)
|
||||
if (d->sync) {
|
||||
unref(thr, pc, d->sync);
|
||||
d->sync = 0;
|
||||
}
|
||||
if (flags()->io_sync == 0) {
|
||||
unref(thr, pc, s);
|
||||
d->sync = 0;
|
||||
} else if (flags()->io_sync == 1) {
|
||||
d->sync = s;
|
||||
} else if (flags()->io_sync == 2) {
|
||||
|
@ -189,6 +190,16 @@ void FdEventCreate(ThreadState *thr, uptr pc, int fd) {
|
|||
init(thr, pc, fd, allocsync());
|
||||
}
|
||||
|
||||
void FdSignalCreate(ThreadState *thr, uptr pc, int fd) {
|
||||
DPrintf("#%d: FdSignalCreate(%d)\n", thr->tid, fd);
|
||||
init(thr, pc, fd, 0);
|
||||
}
|
||||
|
||||
void FdInotifyCreate(ThreadState *thr, uptr pc, int fd) {
|
||||
DPrintf("#%d: FdInotifyCreate(%d)\n", thr->tid, fd);
|
||||
init(thr, pc, fd, 0);
|
||||
}
|
||||
|
||||
void FdPollCreate(ThreadState *thr, uptr pc, int fd) {
|
||||
DPrintf("#%d: FdPollCreate(%d)\n", thr->tid, fd);
|
||||
init(thr, pc, fd, allocsync());
|
||||
|
|
|
@ -46,6 +46,8 @@ void FdFileCreate(ThreadState *thr, uptr pc, int fd);
|
|||
void FdDup(ThreadState *thr, uptr pc, int oldfd, int newfd);
|
||||
void FdPipeCreate(ThreadState *thr, uptr pc, int rfd, int wfd);
|
||||
void FdEventCreate(ThreadState *thr, uptr pc, int fd);
|
||||
void FdSignalCreate(ThreadState *thr, uptr pc, int fd);
|
||||
void FdInotifyCreate(ThreadState *thr, uptr pc, int fd);
|
||||
void FdPollCreate(ThreadState *thr, uptr pc, int fd);
|
||||
void FdSocketCreate(ThreadState *thr, uptr pc, int fd);
|
||||
void FdSocketAccept(ThreadState *thr, uptr pc, int fd, int newfd);
|
||||
|
|
|
@ -1128,6 +1128,31 @@ TSAN_INTERCEPTOR(int, eventfd, unsigned initval, int flags) {
|
|||
return fd;
|
||||
}
|
||||
|
||||
TSAN_INTERCEPTOR(int, signalfd, int fd, void *mask, int flags) {
|
||||
SCOPED_TSAN_INTERCEPTOR(signalfd, fd, mask, flags);
|
||||
FdClose(thr, pc, fd);
|
||||
fd = REAL(signalfd)(fd, mask, flags);
|
||||
if (fd >= 0)
|
||||
FdSignalCreate(thr, pc, fd);
|
||||
return fd;
|
||||
}
|
||||
|
||||
TSAN_INTERCEPTOR(int, inotify_init) {
|
||||
SCOPED_TSAN_INTERCEPTOR(inotify_init);
|
||||
int fd = REAL(inotify_init)();
|
||||
if (fd >= 0)
|
||||
FdInotifyCreate(thr, pc, fd);
|
||||
return fd;
|
||||
}
|
||||
|
||||
TSAN_INTERCEPTOR(int, inotify_init1, int flags) {
|
||||
SCOPED_TSAN_INTERCEPTOR(inotify_init1, flags);
|
||||
int fd = REAL(inotify_init1)(flags);
|
||||
if (fd >= 0)
|
||||
FdInotifyCreate(thr, pc, fd);
|
||||
return fd;
|
||||
}
|
||||
|
||||
TSAN_INTERCEPTOR(int, socket, int domain, int type, int protocol) {
|
||||
SCOPED_TSAN_INTERCEPTOR(socket, domain, type, protocol);
|
||||
int fd = REAL(socket)(domain, type, protocol);
|
||||
|
@ -1743,6 +1768,9 @@ void InitializeInterceptors() {
|
|||
TSAN_INTERCEPT(dup2);
|
||||
TSAN_INTERCEPT(dup3);
|
||||
TSAN_INTERCEPT(eventfd);
|
||||
TSAN_INTERCEPT(signalfd);
|
||||
TSAN_INTERCEPT(inotify_init);
|
||||
TSAN_INTERCEPT(inotify_init1);
|
||||
TSAN_INTERCEPT(socket);
|
||||
TSAN_INTERCEPT(socketpair);
|
||||
TSAN_INTERCEPT(connect);
|
||||
|
|
|
@ -189,6 +189,9 @@ void StatOutput(u64 *stat) {
|
|||
name[StatInt_dup2] = " dup2 ";
|
||||
name[StatInt_dup3] = " dup3 ";
|
||||
name[StatInt_eventfd] = " eventfd ";
|
||||
name[StatInt_signalfd] = " signalfd ";
|
||||
name[StatInt_inotify_init] = " inotify_init ";
|
||||
name[StatInt_inotify_init1] = " inotify_init1 ";
|
||||
name[StatInt_socket] = " socket ";
|
||||
name[StatInt_socketpair] = " socketpair ";
|
||||
name[StatInt_connect] = " connect ";
|
||||
|
|
|
@ -184,6 +184,9 @@ enum StatType {
|
|||
StatInt_dup2,
|
||||
StatInt_dup3,
|
||||
StatInt_eventfd,
|
||||
StatInt_signalfd,
|
||||
StatInt_inotify_init,
|
||||
StatInt_inotify_init1,
|
||||
StatInt_socket,
|
||||
StatInt_socketpair,
|
||||
StatInt_connect,
|
||||
|
|
Loading…
Reference in New Issue