brintos

brintos / llvm-project-archived public Read only

0
0
Text · 1000 B · 755a7bd Raw
43 lines · cpp
1// RUN: %clangxx_tsan -O1 %s -o %t && %deflake %run %t | FileCheck %s2#include "test.h"3 4// Ensure that we can restore a stack of a finished thread.5 6int g_data;7 8void __attribute__((noinline)) foobar(int *p) {9  *p = 42;10}11 12void *Thread1(void *x) {13  foobar(&g_data);14  barrier_wait(&barrier);15  return NULL;16}17 18void *Thread2(void *x) {19  barrier_wait(&barrier);20  sleep(1); // let the thread finish and exit21  g_data = 43;22  return NULL;23}24 25int main() {26  barrier_init(&barrier, 2);27  pthread_t t[2];28  pthread_create(&t[0], NULL, Thread1, NULL);29  pthread_create(&t[1], NULL, Thread2, NULL);30  pthread_join(t[0], NULL);31  pthread_join(t[1], NULL);32  return 0;33}34 35// CHECK: WARNING: ThreadSanitizer: data race36// CHECK:   Write of size 4 at {{.*}} by thread T2:37// CHECK:   Previous write of size 4 at {{.*}} by thread T1:38// CHECK:     #0 foobar39// CHECK:     #1 Thread140// CHECK:   Thread T1 (tid={{.*}}, finished) created by main thread at:41// CHECK:     #0 pthread_create42// CHECK:     #1 main43