1047696c1c67b2e0a73f2b951ce23ff5b155111bbbsalomon@google.com// RUN: %clangxx_tsan -O1 %s -o %t && %deflake %run %t | FileCheck %s
2047696c1c67b2e0a73f2b951ce23ff5b155111bbbsalomon@google.com#include <pthread.h>
3047696c1c67b2e0a73f2b951ce23ff5b155111bbbsalomon@google.com#include <stdlib.h>
4047696c1c67b2e0a73f2b951ce23ff5b155111bbbsalomon@google.com#include <stdio.h>
5047696c1c67b2e0a73f2b951ce23ff5b155111bbbsalomon@google.com
6047696c1c67b2e0a73f2b951ce23ff5b155111bbbsalomon@google.comvoid *Thread1(void *p) {
7047696c1c67b2e0a73f2b951ce23ff5b155111bbbsalomon@google.com  *(int*)p = 42;
8047696c1c67b2e0a73f2b951ce23ff5b155111bbbsalomon@google.com  return 0;
9047696c1c67b2e0a73f2b951ce23ff5b155111bbbsalomon@google.com}
10047696c1c67b2e0a73f2b951ce23ff5b155111bbbsalomon@google.com
11f96ba02513eadd9fa24d75396ec9f2d6682e464cbsalomonvoid *Thread2(void *p) {
12c49233410e7278f0b95b8b0d28a80105a2930a88bsalomon  *(int*)p = 44;
136d003d1ddced3e71684b8b3785d1e5a16255688dbsalomon@google.com  return 0;
141ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.com}
15047696c1c67b2e0a73f2b951ce23ff5b155111bbbsalomon@google.com
161ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.comvoid *alloc() {
171ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.com  return malloc(99);
181ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.com}
191ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.com
2091a798f121a2238639f8e2d08cc776d4f0236cebcommit-bot@chromium.orgvoid *AllocThread(void* arg) {
211ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.com  return alloc();
221ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.com}
231ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.com
241ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.comint main() {
251ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.com  void *p = 0;
261ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.com  pthread_t t[2];
27956b310f13c7412c035406c658ff16ca85eac656skia.committer@gmail.com  pthread_create(&t[0], 0, AllocThread, 0);
28b86add1ad37776818e1f730359ec587c9fdbff5fhumper@google.com  pthread_join(t[0], &p);
29b86add1ad37776818e1f730359ec587c9fdbff5fhumper@google.com  fprintf(stderr, "addr=%p\n", p);
30b86add1ad37776818e1f730359ec587c9fdbff5fhumper@google.com  pthread_create(&t[0], 0, Thread1, (char*)p + 16);
31b86add1ad37776818e1f730359ec587c9fdbff5fhumper@google.com  pthread_create(&t[1], 0, Thread2, (char*)p + 16);
32b86add1ad37776818e1f730359ec587c9fdbff5fhumper@google.com  pthread_join(t[0], 0);
33b86add1ad37776818e1f730359ec587c9fdbff5fhumper@google.com  pthread_join(t[1], 0);
34b86add1ad37776818e1f730359ec587c9fdbff5fhumper@google.com  return 0;
35b86add1ad37776818e1f730359ec587c9fdbff5fhumper@google.com}
361ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.com
371ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.com// CHECK: addr=[[ADDR:0x[0-9,a-f]+]]
38bc91fd71faa2c5fd14423fecd18e50701c922cedcommit-bot@chromium.org// CHECK: WARNING: ThreadSanitizer: data race
39b86add1ad37776818e1f730359ec587c9fdbff5fhumper@google.com// ...
401ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.com// CHECK: Location is heap block of size 99 at [[ADDR]] allocated by thread T1:
411ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.com// CHCEK:     #0 malloc
421ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.com// CHECK:     #{{1|2}} alloc
431ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.com// CHECK:     #{{2|3}} AllocThread
441ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.com// ...
451ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.com// CHECK:   Thread T1 (tid={{.*}}, finished) created by main thread at:
461ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.com// CHECK:     #0 pthread_create
471ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.com// CHECK:     #1 main
481ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.com