# Support for building with ThreadSanitizer (tsan) - # https://code.google.com/p/thread-sanitizer/ INCLUDE(CheckCCompilerFlag) INCLUDE(CheckCXXCompilerFlag) INCLUDE(CMakePushCheckState) OPTION(PELOTON_THREADSANITIZER "Enable ThreadSanitizer data race detector." ON) IF (PELOTON_THREADSANITIZER) CMAKE_PUSH_CHECK_STATE(RESET) SET(CMAKE_REQUIRED_FLAGS "-fsanitize=thread") # Also needs to be a link flag for test to pass CHECK_C_COMPILER_FLAG("-fsanitize=thread" HAVE_FLAG_SANITIZE_THREAD_C) CHECK_CXX_COMPILER_FLAG("-fsanitize=thread" HAVE_FLAG_SANITIZE_THREAD_CXX) CMAKE_POP_CHECK_STATE() IF(HAVE_FLAG_SANITIZE_THREAD_C AND HAVE_FLAG_SANITIZE_THREAD_CXX) SET(THREAD_SANITIZER_FLAG "-fsanitize=thread") SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${THREAD_SANITIZER_FLAG}") SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${THREAD_SANITIZER_FLAG}") SET(CMAKE_CGO_LDFLAGS "${CMAKE_CGO_LDFLAGS} ${THREAD_SANITIZER_FLAG}") # TC/jemalloc are incompatible with ThreadSanitizer - force # the use of the system allocator. SET(COUCHBASE_MEMORY_ALLOCATOR system CACHE STRING "Memory allocator to use") # Configure CTest's MemCheck to ThreadSanitizer. SET(MEMORYCHECK_TYPE ThreadSanitizer) ADD_DEFINITIONS(-DTHREAD_SANITIZER) # Override the normal ADD_TEST macro to set the TSAN_OPTIONS # environment variable - this allows us to specify the # suppressions file to use. FUNCTION(ADD_TEST name) IF(${ARGV0} STREQUAL "NAME") SET(_name ${ARGV1}) ELSE() SET(_name ${ARGV0}) ENDIF() _ADD_TEST(${ARGV}) if (COUCHBASE_SERVER_BUILD) SET_TESTS_PROPERTIES(${_name} PROPERTIES ENVIRONMENT "TSAN_OPTIONS=suppressions=${CMAKE_SOURCE_DIR}/tlm/tsan.suppressions") else (COUCHBASE_SERVER_BUILD) SET_TESTS_PROPERTIES(${_name} PROPERTIES ENVIRONMENT "TSAN_OPTIONS=suppressions=${PROJECT_SOURCE_DIR}/cmake/Modules/tsan.suppressions") endif (COUCHBASE_SERVER_BUILD) ENDFUNCTION() MESSAGE(STATUS "ThreadSanitizer enabled - forcing use of 'system' memory allocator.") ELSE() MESSAGE(FATAL_ERROR "PELOTON_THREADSANITIZER enabled but compiler doesn't support ThreadSanitizer - cannot continue.") ENDIF() ENDIF()