summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMark Seaborn <mseaborn@chromium.org>2014-03-01 04:30:32 +0000
committerMark Seaborn <mseaborn@chromium.org>2014-03-01 04:30:32 +0000
commit552d9e49d9431b8529e6ed6988d9531b9a1aa81f (patch)
treea5905474c00f2352fd4d5d891f6f66a2f10e88e6
parentbbae512cd241b1d224815b77b6f06d00c686eed9 (diff)
downloadbcm5719-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
-rw-r--r--llvm/lib/Support/Unix/RWMutex.inc20
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();
}
}
OpenPOWER on IntegriCloud