You've already forked linux-packaging-mono
acceptance-tests
data
debian
docs
external
Newtonsoft.Json
api-doc-tools
api-snapshot
aspnetwebstack
bdwgc
binary-reference-assemblies
bockbuild
boringssl
cecil
cecil-legacy
corefx
corert
helix-binaries
ikdasm
ikvm
illinker-test-assets
linker
llvm-project
clang
clang-tools-extra
compiler-rt
cmake
docs
include
lib
BlocksRuntime
asan
builtins
cfi
dfsan
esan
fuzzer
hwasan
interception
lsan
msan
profile
safestack
sanitizer_common
scripts
symbolizer
tests
.clang-format
.clang-tidy
CMakeLists.txt
sancov_begin.S
sancov_end.S
sancov_flags.cc
sancov_flags.h
sancov_flags.inc
sanitizer_addrhashmap.h
sanitizer_allocator.cc
sanitizer_allocator.h
sanitizer_allocator_bytemap.h
sanitizer_allocator_checks.cc
sanitizer_allocator_checks.h
sanitizer_allocator_combined.h
sanitizer_allocator_interface.h
sanitizer_allocator_internal.h
sanitizer_allocator_local_cache.h
sanitizer_allocator_primary32.h
sanitizer_allocator_primary64.h
sanitizer_allocator_secondary.h
sanitizer_allocator_size_class_map.h
sanitizer_allocator_stats.h
sanitizer_asm.h
sanitizer_atomic.h
sanitizer_atomic_clang.h
sanitizer_atomic_clang_mips.h
sanitizer_atomic_clang_other.h
sanitizer_atomic_clang_x86.h
sanitizer_atomic_msvc.h
sanitizer_bitvector.h
sanitizer_bvgraph.h
sanitizer_common.cc
sanitizer_common.h
sanitizer_common_interceptors.inc.REMOVED.git-id
sanitizer_common_interceptors_format.inc
sanitizer_common_interceptors_ioctl.inc
sanitizer_common_interface.inc
sanitizer_common_interface_posix.inc
sanitizer_common_libcdep.cc
sanitizer_common_nolibc.cc
sanitizer_common_syscalls.inc
sanitizer_coverage_fuchsia.cc
sanitizer_coverage_interface.inc
sanitizer_coverage_libcdep_new.cc
sanitizer_coverage_win_dll_thunk.cc
sanitizer_coverage_win_dynamic_runtime_thunk.cc
sanitizer_coverage_win_sections.cc
sanitizer_coverage_win_weak_interception.cc
sanitizer_dbghelp.h
sanitizer_deadlock_detector.h
sanitizer_deadlock_detector1.cc
sanitizer_deadlock_detector2.cc
sanitizer_deadlock_detector_interface.h
sanitizer_errno.cc
sanitizer_errno.h
sanitizer_errno_codes.h
sanitizer_file.cc
sanitizer_file.h
sanitizer_flag_parser.cc
sanitizer_flag_parser.h
sanitizer_flags.cc
sanitizer_flags.h
sanitizer_flags.inc
sanitizer_freebsd.h
sanitizer_fuchsia.cc
sanitizer_fuchsia.h
sanitizer_getauxval.h
sanitizer_interface_internal.h
sanitizer_internal_defs.h
sanitizer_lfstack.h
sanitizer_libc.cc
sanitizer_libc.h
sanitizer_libignore.cc
sanitizer_libignore.h
sanitizer_linux.cc
sanitizer_linux.h
sanitizer_linux_libcdep.cc
sanitizer_linux_mips64.S
sanitizer_linux_s390.cc
sanitizer_linux_x86_64.S
sanitizer_list.h
sanitizer_mac.cc
sanitizer_mac.h
sanitizer_mac_libcdep.cc
sanitizer_malloc_mac.inc
sanitizer_mutex.h
sanitizer_persistent_allocator.cc
sanitizer_persistent_allocator.h
sanitizer_placement_new.h
sanitizer_platform.h
sanitizer_platform_interceptors.h
sanitizer_platform_limits_linux.cc
sanitizer_platform_limits_netbsd.cc
sanitizer_platform_limits_netbsd.h
sanitizer_platform_limits_posix.cc
sanitizer_platform_limits_posix.h
sanitizer_platform_limits_solaris.cc
sanitizer_platform_limits_solaris.h
sanitizer_posix.cc
sanitizer_posix.h
sanitizer_posix_libcdep.cc
sanitizer_printf.cc
sanitizer_procmaps.h
sanitizer_procmaps_common.cc
sanitizer_procmaps_freebsd.cc
sanitizer_procmaps_linux.cc
sanitizer_procmaps_mac.cc
sanitizer_procmaps_solaris.cc
sanitizer_quarantine.h
sanitizer_report_decorator.h
sanitizer_signal_interceptors.inc
sanitizer_solaris.cc
sanitizer_stackdepot.cc
sanitizer_stackdepot.h
sanitizer_stackdepotbase.h
sanitizer_stacktrace.cc
sanitizer_stacktrace.h
sanitizer_stacktrace_libcdep.cc
sanitizer_stacktrace_printer.cc
sanitizer_stacktrace_printer.h
sanitizer_stoptheworld.h
sanitizer_stoptheworld_linux_libcdep.cc
sanitizer_stoptheworld_mac.cc
sanitizer_suppressions.cc
sanitizer_suppressions.h
sanitizer_symbolizer.cc
sanitizer_symbolizer.h
sanitizer_symbolizer_fuchsia.cc
sanitizer_symbolizer_internal.h
sanitizer_symbolizer_libbacktrace.cc
sanitizer_symbolizer_libbacktrace.h
sanitizer_symbolizer_libcdep.cc
sanitizer_symbolizer_mac.cc
sanitizer_symbolizer_mac.h
sanitizer_symbolizer_posix_libcdep.cc
sanitizer_symbolizer_win.cc
sanitizer_syscall_generic.inc
sanitizer_syscall_linux_aarch64.inc
sanitizer_syscall_linux_arm.inc
sanitizer_syscall_linux_x86_64.inc
sanitizer_termination.cc
sanitizer_thread_registry.cc
sanitizer_thread_registry.h
sanitizer_tls_get_addr.cc
sanitizer_tls_get_addr.h
sanitizer_unwind_linux_libcdep.cc
sanitizer_vector.h
sanitizer_win.cc
sanitizer_win.h
sanitizer_win_defs.h
sanitizer_win_dll_thunk.cc
sanitizer_win_dll_thunk.h
sanitizer_win_dynamic_runtime_thunk.cc
sanitizer_win_weak_interception.cc
sanitizer_win_weak_interception.h
weak_symbols.txt
scudo
stats
tsan
ubsan
ubsan_minimal
xray
CMakeLists.txt
test
unittests
www
.arcconfig
.gitignore
CMakeLists.txt
CODE_OWNERS.TXT
CREDITS.TXT
LICENSE.TXT
README.txt
eng
libcxx
libcxxabi
libunwind
lld
lldb
llvm
nuget
openmp
polly
Directory.Build.props
Directory.Build.targets
NuGet.config
azure-pipelines.yml
build.cmd
build.sh
dir.common.props
global.json
llvm.proj
mxe-Win64.cmake.in
nuget-buildtasks
nunit-lite
roslyn-binaries
rx
xunit-binaries
how-to-bump-roslyn-binaries.md
ikvm-native
llvm
m4
man
mcs
mono
msvc
netcore
po
runtime
samples
scripts
support
tools
COPYING.LIB
LICENSE
Makefile.am
Makefile.in
NEWS
README.md
acinclude.m4
aclocal.m4
autogen.sh
code_of_conduct.md
compile
config.guess
config.h.in
config.rpath
config.sub
configure.REMOVED.git-id
configure.ac.REMOVED.git-id
depcomp
install-sh
ltmain.sh.REMOVED.git-id
missing
mkinstalldirs
mono-uninstalled.pc.in
test-driver
winconfig.h
74 lines
2.1 KiB
C
74 lines
2.1 KiB
C
![]() |
//===-- sanitizer_lfstack.h -=-----------------------------------*- C++ -*-===//
|
||
|
//
|
||
|
// The LLVM Compiler Infrastructure
|
||
|
//
|
||
|
// This file is distributed under the University of Illinois Open Source
|
||
|
// License. See LICENSE.TXT for details.
|
||
|
//
|
||
|
//===----------------------------------------------------------------------===//
|
||
|
//
|
||
|
// Lock-free stack.
|
||
|
// Uses 32/17 bits as ABA-counter on 32/64-bit platforms.
|
||
|
// The memory passed to Push() must not be ever munmap'ed.
|
||
|
// The type T must contain T *next field.
|
||
|
//
|
||
|
//===----------------------------------------------------------------------===//
|
||
|
|
||
|
#ifndef SANITIZER_LFSTACK_H
|
||
|
#define SANITIZER_LFSTACK_H
|
||
|
|
||
|
#include "sanitizer_internal_defs.h"
|
||
|
#include "sanitizer_common.h"
|
||
|
#include "sanitizer_atomic.h"
|
||
|
|
||
|
namespace __sanitizer {
|
||
|
|
||
|
template<typename T>
|
||
|
struct LFStack {
|
||
|
void Clear() {
|
||
|
atomic_store(&head_, 0, memory_order_relaxed);
|
||
|
}
|
||
|
|
||
|
bool Empty() const {
|
||
|
return (atomic_load(&head_, memory_order_relaxed) & kPtrMask) == 0;
|
||
|
}
|
||
|
|
||
|
void Push(T *p) {
|
||
|
u64 cmp = atomic_load(&head_, memory_order_relaxed);
|
||
|
for (;;) {
|
||
|
u64 cnt = (cmp & kCounterMask) + kCounterInc;
|
||
|
u64 xch = (u64)(uptr)p | cnt;
|
||
|
p->next = (T*)(uptr)(cmp & kPtrMask);
|
||
|
if (atomic_compare_exchange_weak(&head_, &cmp, xch,
|
||
|
memory_order_release))
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
T *Pop() {
|
||
|
u64 cmp = atomic_load(&head_, memory_order_acquire);
|
||
|
for (;;) {
|
||
|
T *cur = (T*)(uptr)(cmp & kPtrMask);
|
||
|
if (!cur)
|
||
|
return nullptr;
|
||
|
T *nxt = cur->next;
|
||
|
u64 cnt = (cmp & kCounterMask);
|
||
|
u64 xch = (u64)(uptr)nxt | cnt;
|
||
|
if (atomic_compare_exchange_weak(&head_, &cmp, xch,
|
||
|
memory_order_acquire))
|
||
|
return cur;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// private:
|
||
|
static const int kCounterBits = FIRST_32_SECOND_64(32, 17);
|
||
|
static const u64 kPtrMask = ((u64)-1) >> kCounterBits;
|
||
|
static const u64 kCounterMask = ~kPtrMask;
|
||
|
static const u64 kCounterInc = kPtrMask + 1;
|
||
|
|
||
|
atomic_uint64_t head_;
|
||
|
};
|
||
|
} // namespace __sanitizer
|
||
|
|
||
|
#endif // SANITIZER_LFSTACK_H
|