brintos

brintos / llvm-project-archived public Read only

0
0
Text · 1.2 KiB · 43f24f0 Raw
54 lines · c
1// RUN: %clang_tsan -O1 %s -o %t && %deflake %run %t | FileCheck %s2// Regression test for3// https://groups.google.com/d/msg/thread-sanitizer/e_zB9gYqFHM/DmAiTsrLAwAJ4// pthread_atfork() callback triggers a data race and we deadlocked5// on the report_mtx as we lock it around fork.6#include "test.h"7#include <sys/types.h>8#include <sys/wait.h>9#include <errno.h>10 11int glob = 0;12 13void *worker(void *unused) {14  glob++;15  barrier_wait(&barrier);16  return NULL;17}18 19void atfork() {20  glob++;21}22 23int main() {24  barrier_init(&barrier, 2);25  pthread_atfork(atfork, atfork, atfork);26  pthread_t t;27  pthread_create(&t, NULL, worker, NULL);28  barrier_wait(&barrier);29  pid_t pid = fork();30  if (pid < 0) {31    fprintf(stderr, "fork failed: %d\n", errno);32    return 1;33  }34  if (pid == 0) {35    fprintf(stderr, "CHILD\n");36    return 0;37  }38  if (pid != waitpid(pid, NULL, 0)) {39    fprintf(stderr, "waitpid failed: %d\n", errno);40    return 1;41  }42  pthread_join(t, NULL);43  fprintf(stderr, "PARENT\n");44  return 0;45}46 47// CHECK: ThreadSanitizer: data race48// CHECK:   Write of size 449// CHECK:     #0 atfork50// CHECK:   Previous write of size 451// CHECK:     #0 worker52// CHECK: CHILD53// CHECK: PARENT54