mirror of
https://github.com/gperftools/gperftools
synced 2025-02-28 10:00:26 +00:00
tcmalloc: Switch thread-safety annotations to support clang
tcmalloc contains its own copy of thread_annotations.h, wrapper macros for static thread-safety analysis expressions. These thread- safety expressions allow asserting (at compile time) that certain locks are held or excluded or certain data is protected by specific locks; they are checked at compile-time by recent versions of clang or a gcc branch (https://gcc.gnu.org/wiki/ThreadSafetyAnnotation). Convert the #if-guard and macro names from the no-longer-supported gcc branch's defines & macros to the versions supported by recent versions of clang.
This commit is contained in:
parent
96ba58e19b
commit
cc496aecb8
@ -36,8 +36,8 @@
|
|||||||
// of their multi-threaded code. The annotations can also help program
|
// of their multi-threaded code. The annotations can also help program
|
||||||
// analysis tools to identify potential thread safety issues.
|
// analysis tools to identify potential thread safety issues.
|
||||||
//
|
//
|
||||||
// The annotations are implemented using GCC's "attributes" extension.
|
// The annotations are implemented using clang's "attributes" extension.
|
||||||
// Using the macros defined here instead of the raw GCC attributes allows
|
// Using the macros defined here instead of the raw clang attributes allows
|
||||||
// for portability and future compatibility.
|
// for portability and future compatibility.
|
||||||
//
|
//
|
||||||
// This functionality is not yet fully implemented in perftools,
|
// This functionality is not yet fully implemented in perftools,
|
||||||
@ -47,9 +47,7 @@
|
|||||||
#define BASE_THREAD_ANNOTATIONS_H_
|
#define BASE_THREAD_ANNOTATIONS_H_
|
||||||
|
|
||||||
|
|
||||||
#if defined(__GNUC__) \
|
#if defined(__clang__)
|
||||||
&& (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4)) \
|
|
||||||
&& defined(__SUPPORT_TS_ANNOTATION__) && (!defined(SWIG))
|
|
||||||
#define THREAD_ANNOTATION_ATTRIBUTE__(x) __attribute__((x))
|
#define THREAD_ANNOTATION_ATTRIBUTE__(x) __attribute__((x))
|
||||||
#else
|
#else
|
||||||
#define THREAD_ANNOTATION_ATTRIBUTE__(x) // no-op
|
#define THREAD_ANNOTATION_ATTRIBUTE__(x) // no-op
|
||||||
@ -114,19 +112,19 @@
|
|||||||
|
|
||||||
// The following annotations specify lock and unlock primitives.
|
// The following annotations specify lock and unlock primitives.
|
||||||
#define EXCLUSIVE_LOCK_FUNCTION(x) \
|
#define EXCLUSIVE_LOCK_FUNCTION(x) \
|
||||||
THREAD_ANNOTATION_ATTRIBUTE__(exclusive_lock(x))
|
THREAD_ANNOTATION_ATTRIBUTE__(exclusive_lock_function(x))
|
||||||
|
|
||||||
#define SHARED_LOCK_FUNCTION(x) \
|
#define SHARED_LOCK_FUNCTION(x) \
|
||||||
THREAD_ANNOTATION_ATTRIBUTE__(shared_lock(x))
|
THREAD_ANNOTATION_ATTRIBUTE__(shared_lock_function(x))
|
||||||
|
|
||||||
#define EXCLUSIVE_TRYLOCK_FUNCTION(x) \
|
#define EXCLUSIVE_TRYLOCK_FUNCTION(x) \
|
||||||
THREAD_ANNOTATION_ATTRIBUTE__(exclusive_trylock(x))
|
THREAD_ANNOTATION_ATTRIBUTE__(exclusive_trylock_function(x))
|
||||||
|
|
||||||
#define SHARED_TRYLOCK_FUNCTION(x) \
|
#define SHARED_TRYLOCK_FUNCTION(x) \
|
||||||
THREAD_ANNOTATION_ATTRIBUTE__(shared_trylock(x))
|
THREAD_ANNOTATION_ATTRIBUTE__(shared_trylock_function(x))
|
||||||
|
|
||||||
#define UNLOCK_FUNCTION(x) \
|
#define UNLOCK_FUNCTION(x) \
|
||||||
THREAD_ANNOTATION_ATTRIBUTE__(unlock(x))
|
THREAD_ANNOTATION_ATTRIBUTE__(unlock_function(x))
|
||||||
|
|
||||||
// An escape hatch for thread safety analysis to ignore the annotated function.
|
// An escape hatch for thread safety analysis to ignore the annotated function.
|
||||||
#define NO_THREAD_SAFETY_ANALYSIS \
|
#define NO_THREAD_SAFETY_ANALYSIS \
|
||||||
|
Loading…
Reference in New Issue
Block a user