Skip to content

Commit

Permalink
[tsan] Add __cxa_guard_acquire hooks to support cooperative scheduling
Browse files Browse the repository at this point in the history
Reviewers: dvyukov

Subscribers: krytarowski, kubamracek, llvm-commits

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

llvm-svn: 347336
  • Loading branch information
vitalybuka committed Nov 20, 2018
1 parent 368a199 commit afedb89
Show file tree
Hide file tree
Showing 2 changed files with 37 additions and 0 deletions.
12 changes: 12 additions & 0 deletions compiler-rt/lib/tsan/rtl/tsan_interceptors.cc
Expand Up @@ -228,6 +228,16 @@ void InitializeLibIgnore() {
libignore()->OnLibraryLoaded(0);
}

// The following two hooks can be used by for cooperative scheduling when
// locking.
#ifdef TSAN_EXTERNAL_HOOKS
void OnPotentiallyBlockingRegionBegin();
void OnPotentiallyBlockingRegionEnd();
#else
SANITIZER_WEAK_CXX_DEFAULT_IMPL void OnPotentiallyBlockingRegionBegin() {}
SANITIZER_WEAK_CXX_DEFAULT_IMPL void OnPotentiallyBlockingRegionEnd() {}
#endif

} // namespace __tsan

static ThreadSignalContext *SigCtx(ThreadState *thr) {
Expand Down Expand Up @@ -866,6 +876,8 @@ TSAN_INTERCEPTOR(int, posix_memalign, void **memptr, uptr align, uptr sz) {
// Used in thread-safe function static initialization.
STDCXX_INTERCEPTOR(int, __cxa_guard_acquire, atomic_uint32_t *g) {
SCOPED_INTERCEPTOR_RAW(__cxa_guard_acquire, g);
OnPotentiallyBlockingRegionBegin();
auto on_exit = at_scope_exit(&OnPotentiallyBlockingRegionEnd);
for (;;) {
u32 cmp = atomic_load(g, memory_order_acquire);
if (cmp == 0) {
Expand Down
25 changes: 25 additions & 0 deletions compiler-rt/test/tsan/cxa_guard_acquire.cc
@@ -0,0 +1,25 @@
// RUN: %clangxx_tsan -O1 %s -o %t && %run %t 2>&1 | FileCheck %s

#include <stdio.h>

namespace __tsan {

void OnPotentiallyBlockingRegionBegin() {
printf("Enter __cxa_guard_acquire\n");
}

void OnPotentiallyBlockingRegionEnd() { printf("Exit __cxa_guard_acquire\n"); }

} // namespace __tsan

int main(int argc, char **argv) {
// CHECK: Enter main
printf("Enter main\n");
// CHECK-NEXT: Enter __cxa_guard_acquire
// CHECK-NEXT: Exit __cxa_guard_acquire
static int s = argc;
(void)s;
// CHECK-NEXT: Exit main
printf("Exit main\n");
return 0;
}

0 comments on commit afedb89

Please sign in to comment.