fd_socket_norace.cc revision ba3ae356e0827bfdb17feaff53e17c3934470404
1651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// RUN: %clangxx_tsan -O1 %s -o %t && %t 2>&1 | FileCheck %s 2651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#include <pthread.h> 3651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#include <stdio.h> 49a24dc1409ec1d073a7b346d3b02a0129192fb58Mike Stump#include <stdlib.h> 55d1d7ae120c2c8e6cba5d2a712b33500a5aecc10Anders Carlsson#include <unistd.h> 68eae0907c5094b8af61e26b8b809baf3c1ba75c8Mike Stump#include <sys/types.h> 78eae0907c5094b8af61e26b8b809baf3c1ba75c8Mike Stump#include <sys/socket.h> 88eae0907c5094b8af61e26b8b809baf3c1ba75c8Mike Stump#include <netinet/in.h> 99a24dc1409ec1d073a7b346d3b02a0129192fb58Mike Stump#include <arpa/inet.h> 109a24dc1409ec1d073a7b346d3b02a0129192fb58Mike Stump 119a24dc1409ec1d073a7b346d3b02a0129192fb58Mike Stumpstruct sockaddr_in addr; 129a24dc1409ec1d073a7b346d3b02a0129192fb58Mike Stumpint X; 139a24dc1409ec1d073a7b346d3b02a0129192fb58Mike Stump 149a24dc1409ec1d073a7b346d3b02a0129192fb58Mike Stumpvoid *ClientThread(void *x) { 159a24dc1409ec1d073a7b346d3b02a0129192fb58Mike Stump X = 42; 169a24dc1409ec1d073a7b346d3b02a0129192fb58Mike Stump int c = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); 179a24dc1409ec1d073a7b346d3b02a0129192fb58Mike Stump if (connect(c, (struct sockaddr*)&addr, sizeof(addr))) { 189a24dc1409ec1d073a7b346d3b02a0129192fb58Mike Stump perror("connect"); 199a24dc1409ec1d073a7b346d3b02a0129192fb58Mike Stump exit(1); 209a24dc1409ec1d073a7b346d3b02a0129192fb58Mike Stump } 219a24dc1409ec1d073a7b346d3b02a0129192fb58Mike Stump if (send(c, "a", 1, 0) != 1) { 229a24dc1409ec1d073a7b346d3b02a0129192fb58Mike Stump perror("send"); 239a24dc1409ec1d073a7b346d3b02a0129192fb58Mike Stump exit(1); 249a24dc1409ec1d073a7b346d3b02a0129192fb58Mike Stump } 259a24dc1409ec1d073a7b346d3b02a0129192fb58Mike Stump close(c); 269a24dc1409ec1d073a7b346d3b02a0129192fb58Mike Stump return NULL; 278eae0907c5094b8af61e26b8b809baf3c1ba75c8Mike Stump} 288eae0907c5094b8af61e26b8b809baf3c1ba75c8Mike Stump 2945db90de59f6effb7bd9a55660ca97aa3feadc6cMike Stumpint main() { 308eae0907c5094b8af61e26b8b809baf3c1ba75c8Mike Stump int s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); 318eae0907c5094b8af61e26b8b809baf3c1ba75c8Mike Stump addr.sin_family = AF_INET; 328eae0907c5094b8af61e26b8b809baf3c1ba75c8Mike Stump inet_pton(AF_INET, "127.0.0.1", &addr.sin_addr); 338eae0907c5094b8af61e26b8b809baf3c1ba75c8Mike Stump addr.sin_port = INADDR_ANY; 348eae0907c5094b8af61e26b8b809baf3c1ba75c8Mike Stump socklen_t len = sizeof(addr); 358eae0907c5094b8af61e26b8b809baf3c1ba75c8Mike Stump bind(s, (sockaddr*)&addr, len); 3655f988efeb08b84c2dd9e4c05990b88c81fe2b58Mike Stump getsockname(s, (sockaddr*)&addr, &len); 378eae0907c5094b8af61e26b8b809baf3c1ba75c8Mike Stump listen(s, 10); 388eae0907c5094b8af61e26b8b809baf3c1ba75c8Mike Stump pthread_t t; 398eae0907c5094b8af61e26b8b809baf3c1ba75c8Mike Stump pthread_create(&t, 0, ClientThread, 0); 40e1667190dff025936a21e5eb43889ac93b570468Marcin Swiderski int c = accept(s, 0, 0); 41e1667190dff025936a21e5eb43889ac93b570468Marcin Swiderski char buf; 4255f988efeb08b84c2dd9e4c05990b88c81fe2b58Mike Stump while (read(c, &buf, 1) != 1) { 4355f988efeb08b84c2dd9e4c05990b88c81fe2b58Mike Stump } 448eae0907c5094b8af61e26b8b809baf3c1ba75c8Mike Stump X = 43; 458eae0907c5094b8af61e26b8b809baf3c1ba75c8Mike Stump close(c); 468eae0907c5094b8af61e26b8b809baf3c1ba75c8Mike Stump close(s); 478eae0907c5094b8af61e26b8b809baf3c1ba75c8Mike Stump pthread_join(t, 0); 488eae0907c5094b8af61e26b8b809baf3c1ba75c8Mike Stump} 498eae0907c5094b8af61e26b8b809baf3c1ba75c8Mike Stump 508eae0907c5094b8af61e26b8b809baf3c1ba75c8Mike Stump// CHECK-NOT: WARNING: ThreadSanitizer: data race 518eae0907c5094b8af61e26b8b809baf3c1ba75c8Mike Stump 528eae0907c5094b8af61e26b8b809baf3c1ba75c8Mike Stump