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