diff options
author | Mark Seaborn <mseaborn@chromium.org> | 2014-03-01 04:30:32 +0000 |
---|---|---|
committer | Mark Seaborn <mseaborn@chromium.org> | 2014-03-01 04:30:32 +0000 |
commit | 552d9e49d9431b8529e6ed6988d9531b9a1aa81f (patch) | |
tree | a5905474c00f2352fd4d5d891f6f66a2f10e88e6 /llvm/lib/Support/Unix/RWMutex.inc | |
parent | bbae512cd241b1d224815b77b6f06d00c686eed9 (diff) | |
download | bcm5719-llvm-552d9e49d9431b8529e6ed6988d9531b9a1aa81f.tar.gz bcm5719-llvm-552d9e49d9431b8529e6ed6988d9531b9a1aa81f.zip |
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
llvm-svn: 202570
Diffstat (limited to 'llvm/lib/Support/Unix/RWMutex.inc')
-rw-r--r-- | llvm/lib/Support/Unix/RWMutex.inc | 20 |
1 files changed, 14 insertions, 6 deletions
diff --git a/llvm/lib/Support/Unix/RWMutex.inc b/llvm/lib/Support/Unix/RWMutex.inc index 40e87ff1311..edcbd52f5f3 100644 --- a/llvm/lib/Support/Unix/RWMutex.inc +++ b/llvm/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() : data_(new Mutex(false)) { } -RWMutexImpl::~RWMutexImpl() { } +RWMutexImpl::~RWMutexImpl() { + delete static_cast<Mutex *>(data_); +} bool RWMutexImpl::reader_acquire() { - return true; + return static_cast<Mutex *>(data_)->acquire(); } bool RWMutexImpl::reader_release() { - return true; + return static_cast<Mutex *>(data_)->release(); } bool RWMutexImpl::writer_acquire() { - return true; + return static_cast<Mutex *>(data_)->acquire(); } bool RWMutexImpl::writer_release() { - return true; + return static_cast<Mutex *>(data_)->release(); } } |