llvm-project/compiler-rt/test/tsan/flush_memory.cpp
Dmitry Vyukov 7de546e9e8 tsan: deflake flush_memory.cpp
The test contains a race and checks that it's detected.
But the race may not be detected since we are doing aggressive flushes
and if the state flush happens between racing accesses, tsan won't
detect the race). So return 1 to make the test deterministic
regardless of the race.

Reviewed By: melver

Differential Revision: https://reviews.llvm.org/D115612
2021-12-13 12:01:30 +01:00

39 lines
1.1 KiB
C++

// RUN: %clangxx_tsan -O1 %s -o %t
// RUN: %env_tsan_opts=flush_memory_ms=1:flush_symbolizer_ms=1:memory_limit_mb=1 not %run %t 2>&1 | FileCheck %s
#include "test.h"
long X, Y;
void *Thread(void *arg) {
__atomic_fetch_add(&X, 1, __ATOMIC_SEQ_CST);
barrier_wait(&barrier);
barrier_wait(&barrier);
Y = 1;
return &Y;
}
int main() {
__tsan_flush_memory();
barrier_init(&barrier, 2);
__atomic_fetch_add(&X, 1, __ATOMIC_SEQ_CST);
pthread_t t;
pthread_create(&t, NULL, Thread, NULL);
barrier_wait(&barrier);
__tsan_flush_memory();
// Trigger a race to test flushing of the symbolizer cache.
Y = 2;
barrier_wait(&barrier);
pthread_join(t, NULL);
__atomic_fetch_add(&X, 1, __ATOMIC_SEQ_CST);
// Background runtime thread should do some flushes meanwhile.
sleep(2);
__tsan_flush_memory();
fprintf(stderr, "DONE\n");
// The race may not be detected since we are doing aggressive flushes
// (if the state flush happens between racing accesses, tsan won't
// detect the race). So return 1 to make the test deterministic.
return 1;
}
// CHECK: DONE