[llvm-commits] [compiler-rt] r170235 - in /compiler-rt/trunk/lib/tsan: lit_tests/fd_socket_connect_norace.cc lit_tests/signal_errno.cc rtl/tsan_fd.cc rtl/tsan_fd.h rtl/tsan_interceptors.cc

Dmitry Vyukov dvyukov at google.com
Fri Dec 14 12:01:58 PST 2012


Author: dvyukov
Date: Fri Dec 14 14:01:58 2012
New Revision: 170235

URL: http://llvm.org/viewvc/llvm-project?rev=170235&view=rev
Log:
tsan: synchronize connect->accept calls

Added:
    compiler-rt/trunk/lib/tsan/lit_tests/fd_socket_connect_norace.cc
Modified:
    compiler-rt/trunk/lib/tsan/lit_tests/signal_errno.cc
    compiler-rt/trunk/lib/tsan/rtl/tsan_fd.cc
    compiler-rt/trunk/lib/tsan/rtl/tsan_fd.h
    compiler-rt/trunk/lib/tsan/rtl/tsan_interceptors.cc

Added: compiler-rt/trunk/lib/tsan/lit_tests/fd_socket_connect_norace.cc
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/lit_tests/fd_socket_connect_norace.cc?rev=170235&view=auto
==============================================================================
--- compiler-rt/trunk/lib/tsan/lit_tests/fd_socket_connect_norace.cc (added)
+++ compiler-rt/trunk/lib/tsan/lit_tests/fd_socket_connect_norace.cc Fri Dec 14 14:01:58 2012
@@ -0,0 +1,44 @@
+// RUN: %clangxx_tsan -O1 %s -o %t && %t 2>&1 | FileCheck %s
+#include <pthread.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+
+struct sockaddr_in addr;
+int X;
+
+void *ClientThread(void *x) {
+  int c = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
+  X = 42;
+  if (connect(c, (struct sockaddr*)&addr, sizeof(addr))) {
+    perror("connect");
+    exit(1);
+  }
+  close(c);
+  return NULL;
+}
+
+int main() {
+  int s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
+  addr.sin_family = AF_INET;
+  inet_pton(AF_INET, "127.0.0.1", &addr.sin_addr);
+  addr.sin_port = INADDR_ANY;
+  socklen_t len = sizeof(addr);
+  bind(s, (sockaddr*)&addr, len);
+  getsockname(s, (sockaddr*)&addr, &len);
+  listen(s, 10);
+  pthread_t t;
+  pthread_create(&t, 0, ClientThread, 0);
+  int c = accept(s, 0, 0);
+  X = 42;
+  pthread_join(t, 0);
+  close(c);
+  close(s);
+}
+
+// CHECK-NOT: WARNING: ThreadSanitizer: data race
+

Modified: compiler-rt/trunk/lib/tsan/lit_tests/signal_errno.cc
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/lit_tests/signal_errno.cc?rev=170235&r1=170234&r2=170235&view=diff
==============================================================================
--- compiler-rt/trunk/lib/tsan/lit_tests/signal_errno.cc (original)
+++ compiler-rt/trunk/lib/tsan/lit_tests/signal_errno.cc Fri Dec 14 14:01:58 2012
@@ -10,12 +10,12 @@
 pthread_t mainth;
 volatile int done;
 
-static void handler(int, siginfo_t*, void*) {
+static void handler(int, siginfo_t *s, void *c) {
   errno = 1;
   done = 1;
 }
 
-static void* sendsignal(void*) {
+static void* sendsignal(void *p) {
   pthread_kill(mainth, SIGPROF);
   return 0;
 }

Modified: compiler-rt/trunk/lib/tsan/rtl/tsan_fd.cc
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/rtl/tsan_fd.cc?rev=170235&r1=170234&r2=170235&view=diff
==============================================================================
--- compiler-rt/trunk/lib/tsan/rtl/tsan_fd.cc (original)
+++ compiler-rt/trunk/lib/tsan/rtl/tsan_fd.cc Fri Dec 14 14:01:58 2012
@@ -31,6 +31,7 @@
   FdDesc globdesc;
   FdDesc filedesc;
   FdDesc sockdesc;
+  u64 connectsync;
 };
 
 static FdContext fdctx;
@@ -165,9 +166,17 @@
 
 void FdSocketAccept(ThreadState *thr, uptr pc, int fd, int newfd) {
   DPrintf("#%d: FdSocketAccept(%d, %d)\n", thr->tid, fd, newfd);
+  // Synchronize connect->accept.
+  Acquire(thr, pc, (uptr)&fdctx.connectsync);
   init(thr, pc, newfd, &fdctx.sockdesc);
 }
 
+void FdSocketConnecting(ThreadState *thr, uptr pc, int fd) {
+  DPrintf("#%d: FdSocketConnecting(%d)\n", thr->tid, fd);
+  // Synchronize connect->accept.
+  Release(thr, pc, (uptr)&fdctx.connectsync);
+}
+
 void FdSocketConnect(ThreadState *thr, uptr pc, int fd) {
   DPrintf("#%d: FdSocketConnect(%d)\n", thr->tid, fd);
   init(thr, pc, fd, &fdctx.sockdesc);

Modified: compiler-rt/trunk/lib/tsan/rtl/tsan_fd.h
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/rtl/tsan_fd.h?rev=170235&r1=170234&r2=170235&view=diff
==============================================================================
--- compiler-rt/trunk/lib/tsan/rtl/tsan_fd.h (original)
+++ compiler-rt/trunk/lib/tsan/rtl/tsan_fd.h Fri Dec 14 14:01:58 2012
@@ -49,6 +49,7 @@
 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);
+void FdSocketConnecting(ThreadState *thr, uptr pc, int fd);
 void FdSocketConnect(ThreadState *thr, uptr pc, int fd);
 
 uptr File2addr(char *path);

Modified: compiler-rt/trunk/lib/tsan/rtl/tsan_interceptors.cc
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/rtl/tsan_interceptors.cc?rev=170235&r1=170234&r2=170235&view=diff
==============================================================================
--- compiler-rt/trunk/lib/tsan/rtl/tsan_interceptors.cc (original)
+++ compiler-rt/trunk/lib/tsan/rtl/tsan_interceptors.cc Fri Dec 14 14:01:58 2012
@@ -1146,6 +1146,7 @@
 
 TSAN_INTERCEPTOR(int, connect, int fd, void *addr, unsigned addrlen) {
   SCOPED_TSAN_INTERCEPTOR(connect, fd, addr, addrlen);
+  FdSocketConnecting(thr, pc, fd);
   int res = REAL(connect)(fd, addr, addrlen);
   if (res == 0)
     FdSocketConnect(thr, pc, fd);





More information about the llvm-commits mailing list