diff options
Diffstat (limited to 'test/tsan/race_on_read.cc')
-rw-r--r-- | test/tsan/race_on_read.cc | 41 |
1 files changed, 41 insertions, 0 deletions
diff --git a/test/tsan/race_on_read.cc b/test/tsan/race_on_read.cc new file mode 100644 index 0000000000000..1ec0522b9035c --- /dev/null +++ b/test/tsan/race_on_read.cc @@ -0,0 +1,41 @@ +// RUN: %clangxx_tsan -O1 %s -o %t && %deflake %run %t | FileCheck %s +#include <pthread.h> +#include <stdio.h> +#include <unistd.h> +#include <sys/types.h> +#include <sys/stat.h> +#include <fcntl.h> +#include <unistd.h> +#include <errno.h> + +int fd; +char buf; + +void *Thread(void *x) { + sleep(1); + read(fd, &buf, 1); + return NULL; +} + +int main() { + fd = open("/dev/random", O_RDONLY); + if (fd < 0) { + fprintf(stderr, "failed to open /dev/random (%d)\n", errno); + return 1; + } + pthread_t t[2]; + pthread_create(&t[0], NULL, Thread, NULL); + pthread_create(&t[1], NULL, Thread, NULL); + pthread_join(t[0], NULL); + pthread_join(t[1], NULL); + close(fd); + fprintf(stderr, "DONE\n"); +} + +// CHECK: WARNING: ThreadSanitizer: data race +// CHECK: Write of size 1 +// CHECK: #0 read +// CHECK: Previous write of size 1 +// CHECK: #0 read +// CHECK: DONE + |