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