[compiler-rt] a68b52e - tsan: add another fork deadlock test

Dmitry Vyukov via llvm-commits llvm-commits at lists.llvm.org
Wed Nov 24 04:25:58 PST 2021


Author: Dmitry Vyukov
Date: 2021-11-24T13:25:53+01:00
New Revision: a68b52e0a33382f241a250c1d67bed1141727447

URL: https://github.com/llvm/llvm-project/commit/a68b52e0a33382f241a250c1d67bed1141727447
DIFF: https://github.com/llvm/llvm-project/commit/a68b52e0a33382f241a250c1d67bed1141727447.diff

LOG: tsan: add another fork deadlock test

The test tries to provoke internal allocator to be locked during fork
and then force the child process to use the internal allocator.
This test sometimes deadlocks with the new tsan runtime.

Depends on D114514.

Reviewed By: melver

Differential Revision: https://reviews.llvm.org/D114515

Added: 
    compiler-rt/test/tsan/Linux/fork_multithreaded4.cpp

Modified: 
    

Removed: 
    


################################################################################
diff  --git a/compiler-rt/test/tsan/Linux/fork_multithreaded4.cpp b/compiler-rt/test/tsan/Linux/fork_multithreaded4.cpp
new file mode 100644
index 0000000000000..927f5a6ff5c00
--- /dev/null
+++ b/compiler-rt/test/tsan/Linux/fork_multithreaded4.cpp
@@ -0,0 +1,46 @@
+// RUN: %clangxx_tsan -O1 %s -o %t && %run %t 2>&1 | FileCheck %s
+
+// The test tries to provoke internal allocator to be locked during fork
+// and then force the child process to use the internal allocator.
+
+#include "../test.h"
+#include <errno.h>
+#include <sys/types.h>
+#include <sys/wait.h>
+
+static void *forker(void *arg) {
+  void *p = calloc(1, 16);
+  static_cast<volatile int *>(p)[0]++;
+  __atomic_fetch_add(static_cast<int *>(p), 1, __ATOMIC_SEQ_CST);
+  int pid = fork();
+  if (pid < 0) {
+    fprintf(stderr, "failed to fork (%d)\n", errno);
+    exit(1);
+  }
+  if (pid == 0) {
+    __atomic_fetch_add(&static_cast<int *>(p)[1], 1, __ATOMIC_SEQ_CST);
+    exit(0);
+  }
+  int status = 0;
+  while (waitpid(pid, &status, 0) != pid) {
+  }
+  if (!WIFEXITED(status) || WEXITSTATUS(status) != 0) {
+    fprintf(stderr, "subprocess failed (%d)\n", status);
+    exit(1);
+  }
+  free(p);
+  return 0;
+}
+
+int main() {
+  for (int i = 0; i < 10; i++) {
+    pthread_t threads[100];
+    for (auto &th : threads)
+      pthread_create(&th, 0, forker, 0);
+    for (auto th : threads)
+      pthread_join(th, 0);
+  }
+  fprintf(stderr, "DONE\n");
+}
+
+// CHECK: DONE


        


More information about the llvm-commits mailing list