[compiler-rt] r299885 - [tsan] Fall-back to IPv6 if IPv4 is not available.
Vitaly Buka via llvm-commits
llvm-commits at lists.llvm.org
Mon Apr 10 14:03:22 PDT 2017
Author: vitalybuka
Date: Mon Apr 10 16:03:21 2017
New Revision: 299885
URL: http://llvm.org/viewvc/llvm-project?rev=299885&view=rev
Log:
[tsan] Fall-back to IPv6 if IPv4 is not available.
Reviewers: eugenis
Subscribers: kubamracek, llvm-commits
Differential Revision: https://reviews.llvm.org/D31897
Modified:
compiler-rt/trunk/test/tsan/fd_socket_connect_norace.cc
compiler-rt/trunk/test/tsan/fd_socket_norace.cc
Modified: compiler-rt/trunk/test/tsan/fd_socket_connect_norace.cc
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/test/tsan/fd_socket_connect_norace.cc?rev=299885&r1=299884&r2=299885&view=diff
==============================================================================
--- compiler-rt/trunk/test/tsan/fd_socket_connect_norace.cc (original)
+++ compiler-rt/trunk/test/tsan/fd_socket_connect_norace.cc Mon Apr 10 16:03:21 2017
@@ -1,20 +1,24 @@
// RUN: %clangxx_tsan -O1 %s -o %t && %run %t 2>&1 | FileCheck %s
+#include <arpa/inet.h>
+#include <assert.h>
+#include <netinet/in.h>
#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>
+#include <sys/types.h>
+#include <unistd.h>
-struct sockaddr_in addr;
+struct sockaddr_in addr4;
+struct sockaddr_in6 addr6;
+struct sockaddr *addr;
+socklen_t addrlen;
int X;
void *ClientThread(void *x) {
- int c = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
+ int c = socket(addr->sa_family, SOCK_STREAM, IPPROTO_TCP);
X = 42;
- if (connect(c, (struct sockaddr*)&addr, sizeof(addr))) {
+ if (connect(c, addr, addrlen)) {
perror("connect");
exit(1);
}
@@ -23,13 +27,26 @@ void *ClientThread(void *x) {
}
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);
+ addr4.sin_family = AF_INET;
+ addr4.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
+ addr4.sin_port = INADDR_ANY;
+ addr = (struct sockaddr *)&addr4;
+ addrlen = sizeof(addr4);
+
+ int s = socket(addr->sa_family, SOCK_STREAM, IPPROTO_TCP);
+ if (s <= 0) {
+ // Try to fall-back to IPv6
+ addr6.sin6_family = AF_INET6;
+ addr6.sin6_addr = in6addr_loopback;
+ addr6.sin6_port = INADDR_ANY;
+ addr = (struct sockaddr *)&addr6;
+ addrlen = sizeof(addr6);
+ s = socket(addr->sa_family, SOCK_STREAM, IPPROTO_TCP);
+ }
+ assert(s > 0);
+
+ bind(s, addr, addrlen);
+ getsockname(s, addr, &addrlen);
listen(s, 10);
pthread_t t;
pthread_create(&t, 0, ClientThread, 0);
Modified: compiler-rt/trunk/test/tsan/fd_socket_norace.cc
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/test/tsan/fd_socket_norace.cc?rev=299885&r1=299884&r2=299885&view=diff
==============================================================================
--- compiler-rt/trunk/test/tsan/fd_socket_norace.cc (original)
+++ compiler-rt/trunk/test/tsan/fd_socket_norace.cc Mon Apr 10 16:03:21 2017
@@ -1,20 +1,24 @@
// RUN: %clangxx_tsan -O1 %s -o %t && %run %t 2>&1 | FileCheck %s
+#include <arpa/inet.h>
+#include <assert.h>
+#include <netinet/in.h>
#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>
+#include <sys/types.h>
+#include <unistd.h>
-struct sockaddr_in addr;
+struct sockaddr_in addr4;
+struct sockaddr_in6 addr6;
+struct sockaddr *addr;
+socklen_t addrlen;
int X;
void *ClientThread(void *x) {
X = 42;
- int c = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
- if (connect(c, (struct sockaddr*)&addr, sizeof(addr))) {
+ int c = socket(addr->sa_family, SOCK_STREAM, IPPROTO_TCP);
+ if (connect(c, addr, addrlen)) {
perror("connect");
exit(1);
}
@@ -27,13 +31,26 @@ void *ClientThread(void *x) {
}
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);
+ addr4.sin_family = AF_INET;
+ addr4.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
+ addr4.sin_port = INADDR_ANY;
+ addr = (struct sockaddr *)&addr4;
+ addrlen = sizeof(addr4);
+
+ int s = socket(addr->sa_family, SOCK_STREAM, IPPROTO_TCP);
+ if (s <= 0) {
+ // Try to fall-back to IPv6
+ addr6.sin6_family = AF_INET6;
+ addr6.sin6_addr = in6addr_loopback;
+ addr6.sin6_port = INADDR_ANY;
+ addr = (struct sockaddr *)&addr6;
+ addrlen = sizeof(addr6);
+ s = socket(addr->sa_family, SOCK_STREAM, IPPROTO_TCP);
+ }
+ assert(s > 0);
+
+ bind(s, addr, addrlen);
+ getsockname(s, addr, &addrlen);
listen(s, 10);
pthread_t t;
pthread_create(&t, 0, ClientThread, 0);
More information about the llvm-commits
mailing list