From 79ac85be0b3a519724a56b3dc69375fed4202b4f Mon Sep 17 00:00:00 2001 From: Mark Seaborn Date: Sat, 1 Mar 2014 04:30:32 +0000 Subject: [PATCH] Fix RWMutex to be thread-safe when pthread_rwlock is not available lib/Support/RWMutex.cpp contains an implementation of RWMutex that uses pthread_rwlock, but when pthread_rwlock is not available (such as under NaCl, when using newlib), it silently falls back to using the no-op definition in lib/Support/Unix/RWMutex.inc, which is not thread-safe. Fix this case to be thread-safe by using a normal mutex. Differential Revision: http://llvm-reviews.chandlerc.com/D2892 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@202570 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Support/Unix/RWMutex.inc | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/lib/Support/Unix/RWMutex.inc b/lib/Support/Unix/RWMutex.inc index 40e87ff1311..edcbd52f5f3 100644 --- a/lib/Support/Unix/RWMutex.inc +++ b/lib/Support/Unix/RWMutex.inc @@ -16,28 +16,36 @@ //=== is guaranteed to work on *all* UNIX variants. //===----------------------------------------------------------------------===// +#include "llvm/Support/Mutex.h" + namespace llvm { using namespace sys; -RWMutexImpl::RWMutexImpl() { } +// This naive implementation treats readers the same as writers. This +// will therefore deadlock if a thread tries to acquire a read lock +// multiple times. -RWMutexImpl::~RWMutexImpl() { } +RWMutexImpl::RWMutexImpl() : data_(new Mutex(false)) { } + +RWMutexImpl::~RWMutexImpl() { + delete static_cast(data_); +} bool RWMutexImpl::reader_acquire() { - return true; + return static_cast(data_)->acquire(); } bool RWMutexImpl::reader_release() { - return true; + return static_cast(data_)->release(); } bool RWMutexImpl::writer_acquire() { - return true; + return static_cast(data_)->acquire(); } bool RWMutexImpl::writer_release() { - return true; + return static_cast(data_)->release(); } }