Skip to content

Commit

Permalink
tcmalloc: Switch thread-safety annotations to support clang
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
vsrinivas committed Feb 18, 2021
1 parent 96ba58e commit cc496ae
Showing 1 changed file with 8 additions and 10 deletions.
18 changes: 8 additions & 10 deletions src/base/thread_annotations.h
Original file line number Diff line number Diff line change
Expand Up @@ -36,8 +36,8 @@
// of their multi-threaded code. The annotations can also help program
// analysis tools to identify potential thread safety issues.
//
// The annotations are implemented using GCC's "attributes" extension.
// Using the macros defined here instead of the raw GCC attributes allows
// The annotations are implemented using clang's "attributes" extension.
// Using the macros defined here instead of the raw clang attributes allows
// for portability and future compatibility.
//
// This functionality is not yet fully implemented in perftools,
Expand All @@ -47,9 +47,7 @@
#define BASE_THREAD_ANNOTATIONS_H_


#if defined(__GNUC__) \
&& (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4)) \
&& defined(__SUPPORT_TS_ANNOTATION__) && (!defined(SWIG))
#if defined(__clang__)
#define THREAD_ANNOTATION_ATTRIBUTE__(x) __attribute__((x))
#else
#define THREAD_ANNOTATION_ATTRIBUTE__(x) // no-op
Expand Down Expand Up @@ -114,19 +112,19 @@

// The following annotations specify lock and unlock primitives.
#define EXCLUSIVE_LOCK_FUNCTION(x) \
THREAD_ANNOTATION_ATTRIBUTE__(exclusive_lock(x))
THREAD_ANNOTATION_ATTRIBUTE__(exclusive_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) \
THREAD_ANNOTATION_ATTRIBUTE__(exclusive_trylock(x))
THREAD_ANNOTATION_ATTRIBUTE__(exclusive_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) \
THREAD_ANNOTATION_ATTRIBUTE__(unlock(x))
THREAD_ANNOTATION_ATTRIBUTE__(unlock_function(x))

// An escape hatch for thread safety analysis to ignore the annotated function.
#define NO_THREAD_SAFETY_ANALYSIS \
Expand Down

0 comments on commit cc496ae

Please sign in to comment.