diff options
| author | Dmitry Vyukov <dvyukov@google.com> | 2012-12-18 12:35:31 +0000 |
|---|---|---|
| committer | Dmitry Vyukov <dvyukov@google.com> | 2012-12-18 12:35:31 +0000 |
| commit | d509179a0b13fd0d16ecf0781ba33bd1842da165 (patch) | |
| tree | 16c2fcea24173a44bf7b267a27d355d00af38c5e | |
| parent | b13abb952a99d74c6464ab5360bae635365ff8ff (diff) | |
| download | bcm5719-llvm-d509179a0b13fd0d16ecf0781ba33bd1842da165.tar.gz bcm5719-llvm-d509179a0b13fd0d16ecf0781ba33bd1842da165.zip | |
tsan: add signalfd() and inotify_init() interceptors
llvm-svn: 170429
| -rw-r--r-- | compiler-rt/lib/tsan/rtl/tsan_fd.cc | 15 | ||||
| -rw-r--r-- | compiler-rt/lib/tsan/rtl/tsan_fd.h | 2 | ||||
| -rw-r--r-- | compiler-rt/lib/tsan/rtl/tsan_interceptors.cc | 28 | ||||
| -rw-r--r-- | compiler-rt/lib/tsan/rtl/tsan_stat.cc | 3 | ||||
| -rw-r--r-- | compiler-rt/lib/tsan/rtl/tsan_stat.h | 3 |
5 files changed, 49 insertions, 2 deletions
diff --git a/compiler-rt/lib/tsan/rtl/tsan_fd.cc b/compiler-rt/lib/tsan/rtl/tsan_fd.cc index 7428596b15a..a27bbccba6f 100644 --- a/compiler-rt/lib/tsan/rtl/tsan_fd.cc +++ b/compiler-rt/lib/tsan/rtl/tsan_fd.cc @@ -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()); diff --git a/compiler-rt/lib/tsan/rtl/tsan_fd.h b/compiler-rt/lib/tsan/rtl/tsan_fd.h index 9947f148627..8f8bafb4428 100644 --- a/compiler-rt/lib/tsan/rtl/tsan_fd.h +++ b/compiler-rt/lib/tsan/rtl/tsan_fd.h @@ -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); diff --git a/compiler-rt/lib/tsan/rtl/tsan_interceptors.cc b/compiler-rt/lib/tsan/rtl/tsan_interceptors.cc index b0dedda6afe..cacad2c82ed 100644 --- a/compiler-rt/lib/tsan/rtl/tsan_interceptors.cc +++ b/compiler-rt/lib/tsan/rtl/tsan_interceptors.cc @@ -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); diff --git a/compiler-rt/lib/tsan/rtl/tsan_stat.cc b/compiler-rt/lib/tsan/rtl/tsan_stat.cc index b9707034747..3fa8a03ee19 100644 --- a/compiler-rt/lib/tsan/rtl/tsan_stat.cc +++ b/compiler-rt/lib/tsan/rtl/tsan_stat.cc @@ -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 "; diff --git a/compiler-rt/lib/tsan/rtl/tsan_stat.h b/compiler-rt/lib/tsan/rtl/tsan_stat.h index 062354e6193..64b12a6628f 100644 --- a/compiler-rt/lib/tsan/rtl/tsan_stat.h +++ b/compiler-rt/lib/tsan/rtl/tsan_stat.h @@ -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, |

