annotate compiler-rt/test/tsan/static_init5.cpp @ 266:00f31e85ec16 default tip

Added tag current for changeset 31d058e83c98
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Sat, 14 Oct 2023 10:13:55 +0900
parents 1d019706d866
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
150
anatofuz
parents:
diff changeset
1 // RUN: %clangxx_tsan -O1 %s -o %t && %run %t 2>&1 | FileCheck %s
anatofuz
parents:
diff changeset
2 #include <pthread.h>
anatofuz
parents:
diff changeset
3 #include <stdlib.h>
anatofuz
parents:
diff changeset
4 #include <stdio.h>
anatofuz
parents:
diff changeset
5 #include <sched.h>
anatofuz
parents:
diff changeset
6
anatofuz
parents:
diff changeset
7 struct Cache {
anatofuz
parents:
diff changeset
8 int x;
anatofuz
parents:
diff changeset
9 explicit Cache(int x)
anatofuz
parents:
diff changeset
10 : x(x) {
anatofuz
parents:
diff changeset
11 }
anatofuz
parents:
diff changeset
12 };
anatofuz
parents:
diff changeset
13
anatofuz
parents:
diff changeset
14 void *AsyncInit(void *p) {
anatofuz
parents:
diff changeset
15 return new Cache((int)(long)p);
anatofuz
parents:
diff changeset
16 }
anatofuz
parents:
diff changeset
17
anatofuz
parents:
diff changeset
18 Cache *CreateCache() {
anatofuz
parents:
diff changeset
19 pthread_t t;
anatofuz
parents:
diff changeset
20 pthread_create(&t, 0, AsyncInit, (void*)(long)rand());
anatofuz
parents:
diff changeset
21 void *res;
anatofuz
parents:
diff changeset
22 pthread_join(t, &res);
anatofuz
parents:
diff changeset
23 return (Cache*)res;
anatofuz
parents:
diff changeset
24 }
anatofuz
parents:
diff changeset
25
anatofuz
parents:
diff changeset
26 void *Thread1(void *x) {
anatofuz
parents:
diff changeset
27 static Cache *c = CreateCache();
anatofuz
parents:
diff changeset
28 if (c->x >= RAND_MAX)
anatofuz
parents:
diff changeset
29 exit(1);
anatofuz
parents:
diff changeset
30 return 0;
anatofuz
parents:
diff changeset
31 }
anatofuz
parents:
diff changeset
32
anatofuz
parents:
diff changeset
33 int main() {
anatofuz
parents:
diff changeset
34 pthread_t t[2];
anatofuz
parents:
diff changeset
35 pthread_create(&t[0], 0, Thread1, 0);
anatofuz
parents:
diff changeset
36 pthread_create(&t[1], 0, Thread1, 0);
anatofuz
parents:
diff changeset
37 pthread_join(t[0], 0);
anatofuz
parents:
diff changeset
38 pthread_join(t[1], 0);
anatofuz
parents:
diff changeset
39 fprintf(stderr, "PASS\n");
anatofuz
parents:
diff changeset
40 }
anatofuz
parents:
diff changeset
41
anatofuz
parents:
diff changeset
42 // CHECK-NOT: WARNING: ThreadSanitizer: data race