[PATCH] D28520: Disable -Wthread-safety-analysis for some functions in __thread_support
Dimitry Andric via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Sat Jan 14 06:13:16 PST 2017
dim added a subscriber: ed.
dim added a comment.
In https://reviews.llvm.org/D28520#646160, @aaron.ballman wrote:
> I feel like I must be missing something; why is this disabling rather than specifying the thread safety behavior? e.g., `__libcpp_mutex_lock()` specifying that it acquires the capability and `__libcpp_mutex_unlock()` specifying that it releases it?
I wasn't able to figure out how that should work. The Thread Safety Analysis documentation specifies a number of macros that can be used, but does not directly document the attributes themselves. It looks like some of the attributes have a slightly different signature than the actual pthread functions, and the `__libcpp` wrapper for them, e.g. the example for `TRY_ACQUIRE` seems to assume a `bool` return value:
// Try to acquire the mutex. Returns true on success, and false on failure.
bool TryLock() TRY_ACQUIRE(true);
where `TRY_ACQUIRE(true)` gets replaced by `__attribute__ ((try_acquire_capability(true)))`. However, the signature for the `__libcpp` variant, and the "real" pthread function, is:
int __libcpp_mutex_trylock(__libcpp_mutex_t *__m)
so the return value is an `int`, where `0` means success, and any other value an error. I am unsure how this can be mapped to the attribute, and the documentation does not specify it.
In https://reviews.llvm.org/D28520#646169, @EricWF wrote:
> Also how is `pthread_mutex_t` getting annotated as a mutex type? Is it now done automatically?
Since a few years, FreeBSD's <pthread.h> has locking annotations, for example https://svnweb.freebsd.org/base/head/include/pthread.h?view=markup#l228 which has:
int pthread_mutex_init(pthread_mutex_t *__mutex,
const pthread_mutexattr_t *)
int pthread_mutex_lock(pthread_mutex_t *__mutex)
int pthread_mutex_trylock(pthread_mutex_t *__mutex)
int pthread_mutex_timedlock(pthread_mutex_t *__mutex,
const struct timespec *)
These annotations expand to `__attribute__((locks_excluded))`, `__attribute__((exclusive_lock_function))`, and so on, if `__has_extension(c_thread_safety_attributes)` is true. Apparently @ed added these.
More information about the cfe-commits