tsan: fix epoll_ctl interceptor

Currently data-race-test unittests fail with the following false positive:


WARNING: ThreadSanitizer: data race (pid=20365)
  Write of size 8 at 0x7da000008050 by thread T54:
    #0 close tsan_interceptors.cc:1483 (racecheck_unittest-linux-amd64-O0+0x0000000eb34a)
    #1 NegativeTests_epoll::Worker2() unittest/posix_tests.cc:1148 (racecheck_unittest-linux-amd64-O0+0x0000000cc6b1)
    #2 MyThread::ThreadBody(MyThread*) unittest/./thread_wrappers_pthread.h:367 (racecheck_unittest-linux-amd64-O0+0x000000097500)

  Previous read of size 8 at 0x7da000008050 by thread T49:
    #0 epoll_ctl tsan_interceptors.cc:1646 (racecheck_unittest-linux-amd64-O0+0x0000000e9fee)
    #1 NegativeTests_epoll::Worker1() unittest/posix_tests.cc:1140 (racecheck_unittest-linux-amd64-O0+0x0000000cc5b5)
    #2 MyThread::ThreadBody(MyThread*) unittest/./thread_wrappers_pthread.h:367 (racecheck_unittest-linux-amd64-O0+0x000000097500)

llvm-svn: 192448
This commit is contained in:
Dmitry Vyukov 2013-10-11 13:33:22 +00:00
parent 3d0933c425
commit c9f9ada48d
1 changed files with 9 additions and 7 deletions

View File

@ -1645,21 +1645,23 @@ TSAN_INTERCEPTOR(void*, opendir, char *path) {
TSAN_INTERCEPTOR(int, epoll_ctl, int epfd, int op, int fd, void *ev) {
SCOPED_TSAN_INTERCEPTOR(epoll_ctl, epfd, op, fd, ev);
if (op == EPOLL_CTL_ADD && epfd >= 0) {
FdRelease(thr, pc, epfd);
}
int res = REAL(epoll_ctl)(epfd, op, fd, ev);
if (fd >= 0)
if (epfd >= 0)
FdAccess(thr, pc, epfd);
if (epfd >= 0 && fd >= 0)
FdAccess(thr, pc, fd);
if (op == EPOLL_CTL_ADD && epfd >= 0)
FdRelease(thr, pc, epfd);
int res = REAL(epoll_ctl)(epfd, op, fd, ev);
return res;
}
TSAN_INTERCEPTOR(int, epoll_wait, int epfd, void *ev, int cnt, int timeout) {
SCOPED_TSAN_INTERCEPTOR(epoll_wait, epfd, ev, cnt, timeout);
if (epfd >= 0)
FdAccess(thr, pc, epfd);
int res = BLOCK_REAL(epoll_wait)(epfd, ev, cnt, timeout);
if (res > 0 && epfd >= 0) {
if (res > 0 && epfd >= 0)
FdAcquire(thr, pc, epfd);
}
return res;
}