fd_socket_norace.cc revision 2d1fdb26e458c4ddc04155c1d421bced3ba90cd0
12d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// RUN: %clangxx_tsan -O1 %s -o %t && %run %t 2>&1 | FileCheck %s 2ba3ae356e0827bfdb17feaff53e17c3934470404Dmitry Vyukov#include <pthread.h> 3ba3ae356e0827bfdb17feaff53e17c3934470404Dmitry Vyukov#include <stdio.h> 4ba3ae356e0827bfdb17feaff53e17c3934470404Dmitry Vyukov#include <stdlib.h> 5ba3ae356e0827bfdb17feaff53e17c3934470404Dmitry Vyukov#include <unistd.h> 6ba3ae356e0827bfdb17feaff53e17c3934470404Dmitry Vyukov#include <sys/types.h> 7ba3ae356e0827bfdb17feaff53e17c3934470404Dmitry Vyukov#include <sys/socket.h> 8ba3ae356e0827bfdb17feaff53e17c3934470404Dmitry Vyukov#include <netinet/in.h> 9ba3ae356e0827bfdb17feaff53e17c3934470404Dmitry Vyukov#include <arpa/inet.h> 10ba3ae356e0827bfdb17feaff53e17c3934470404Dmitry Vyukov 11ba3ae356e0827bfdb17feaff53e17c3934470404Dmitry Vyukovstruct sockaddr_in addr; 12ba3ae356e0827bfdb17feaff53e17c3934470404Dmitry Vyukovint X; 13ba3ae356e0827bfdb17feaff53e17c3934470404Dmitry Vyukov 14ba3ae356e0827bfdb17feaff53e17c3934470404Dmitry Vyukovvoid *ClientThread(void *x) { 15ba3ae356e0827bfdb17feaff53e17c3934470404Dmitry Vyukov X = 42; 16ba3ae356e0827bfdb17feaff53e17c3934470404Dmitry Vyukov int c = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); 17ba3ae356e0827bfdb17feaff53e17c3934470404Dmitry Vyukov if (connect(c, (struct sockaddr*)&addr, sizeof(addr))) { 18ba3ae356e0827bfdb17feaff53e17c3934470404Dmitry Vyukov perror("connect"); 19ba3ae356e0827bfdb17feaff53e17c3934470404Dmitry Vyukov exit(1); 20ba3ae356e0827bfdb17feaff53e17c3934470404Dmitry Vyukov } 21ba3ae356e0827bfdb17feaff53e17c3934470404Dmitry Vyukov if (send(c, "a", 1, 0) != 1) { 22ba3ae356e0827bfdb17feaff53e17c3934470404Dmitry Vyukov perror("send"); 23ba3ae356e0827bfdb17feaff53e17c3934470404Dmitry Vyukov exit(1); 24ba3ae356e0827bfdb17feaff53e17c3934470404Dmitry Vyukov } 25ba3ae356e0827bfdb17feaff53e17c3934470404Dmitry Vyukov close(c); 26ba3ae356e0827bfdb17feaff53e17c3934470404Dmitry Vyukov return NULL; 27ba3ae356e0827bfdb17feaff53e17c3934470404Dmitry Vyukov} 28ba3ae356e0827bfdb17feaff53e17c3934470404Dmitry Vyukov 29ba3ae356e0827bfdb17feaff53e17c3934470404Dmitry Vyukovint main() { 30ba3ae356e0827bfdb17feaff53e17c3934470404Dmitry Vyukov int s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); 31ba3ae356e0827bfdb17feaff53e17c3934470404Dmitry Vyukov addr.sin_family = AF_INET; 32ba3ae356e0827bfdb17feaff53e17c3934470404Dmitry Vyukov inet_pton(AF_INET, "127.0.0.1", &addr.sin_addr); 33ba3ae356e0827bfdb17feaff53e17c3934470404Dmitry Vyukov addr.sin_port = INADDR_ANY; 34ba3ae356e0827bfdb17feaff53e17c3934470404Dmitry Vyukov socklen_t len = sizeof(addr); 35ba3ae356e0827bfdb17feaff53e17c3934470404Dmitry Vyukov bind(s, (sockaddr*)&addr, len); 36ba3ae356e0827bfdb17feaff53e17c3934470404Dmitry Vyukov getsockname(s, (sockaddr*)&addr, &len); 37ba3ae356e0827bfdb17feaff53e17c3934470404Dmitry Vyukov listen(s, 10); 38ba3ae356e0827bfdb17feaff53e17c3934470404Dmitry Vyukov pthread_t t; 39ba3ae356e0827bfdb17feaff53e17c3934470404Dmitry Vyukov pthread_create(&t, 0, ClientThread, 0); 40ba3ae356e0827bfdb17feaff53e17c3934470404Dmitry Vyukov int c = accept(s, 0, 0); 41ba3ae356e0827bfdb17feaff53e17c3934470404Dmitry Vyukov char buf; 42ba3ae356e0827bfdb17feaff53e17c3934470404Dmitry Vyukov while (read(c, &buf, 1) != 1) { 43ba3ae356e0827bfdb17feaff53e17c3934470404Dmitry Vyukov } 44ba3ae356e0827bfdb17feaff53e17c3934470404Dmitry Vyukov X = 43; 45ba3ae356e0827bfdb17feaff53e17c3934470404Dmitry Vyukov close(c); 46ba3ae356e0827bfdb17feaff53e17c3934470404Dmitry Vyukov close(s); 47ba3ae356e0827bfdb17feaff53e17c3934470404Dmitry Vyukov pthread_join(t, 0); 48bd88c187a9eaed794b9098aaf147f9dada8c5131Dmitry Vyukov printf("OK\n"); 49ba3ae356e0827bfdb17feaff53e17c3934470404Dmitry Vyukov} 50ba3ae356e0827bfdb17feaff53e17c3934470404Dmitry Vyukov 51ba3ae356e0827bfdb17feaff53e17c3934470404Dmitry Vyukov// CHECK-NOT: WARNING: ThreadSanitizer: data race 52ba3ae356e0827bfdb17feaff53e17c3934470404Dmitry Vyukov 53