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