153ca1f3190680f3e86aebe0f72f7918d63f71e0dCharles Davis//= llvm/Support/Unix/RWMutex.inc - Unix Reader/Writer Mutual Exclusion Lock =// 21f6efa3996dd1929fbc129203ce5009b620e6969Michael J. Spencer// 32a8cf9aadd39e507e6e09c25530a2f01ca27fe57Owen Anderson// The LLVM Compiler Infrastructure 42a8cf9aadd39e507e6e09c25530a2f01ca27fe57Owen Anderson// 52a8cf9aadd39e507e6e09c25530a2f01ca27fe57Owen Anderson// This file is distributed under the University of Illinois Open Source 62a8cf9aadd39e507e6e09c25530a2f01ca27fe57Owen Anderson// License. See LICENSE.TXT for details. 71f6efa3996dd1929fbc129203ce5009b620e6969Michael J. Spencer// 82a8cf9aadd39e507e6e09c25530a2f01ca27fe57Owen Anderson//===----------------------------------------------------------------------===// 92a8cf9aadd39e507e6e09c25530a2f01ca27fe57Owen Anderson// 102a8cf9aadd39e507e6e09c25530a2f01ca27fe57Owen Anderson// This file implements the Unix specific (non-pthread) RWMutex class. 112a8cf9aadd39e507e6e09c25530a2f01ca27fe57Owen Anderson// 122a8cf9aadd39e507e6e09c25530a2f01ca27fe57Owen Anderson//===----------------------------------------------------------------------===// 132a8cf9aadd39e507e6e09c25530a2f01ca27fe57Owen Anderson 142a8cf9aadd39e507e6e09c25530a2f01ca27fe57Owen Anderson//===----------------------------------------------------------------------===// 152a8cf9aadd39e507e6e09c25530a2f01ca27fe57Owen Anderson//=== WARNING: Implementation here must contain only generic UNIX code that 162a8cf9aadd39e507e6e09c25530a2f01ca27fe57Owen Anderson//=== is guaranteed to work on *all* UNIX variants. 172a8cf9aadd39e507e6e09c25530a2f01ca27fe57Owen Anderson//===----------------------------------------------------------------------===// 182a8cf9aadd39e507e6e09c25530a2f01ca27fe57Owen Anderson 1936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/Support/Mutex.h" 2036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 212a8cf9aadd39e507e6e09c25530a2f01ca27fe57Owen Andersonnamespace llvm { 222a8cf9aadd39e507e6e09c25530a2f01ca27fe57Owen Anderson 232a8cf9aadd39e507e6e09c25530a2f01ca27fe57Owen Andersonusing namespace sys; 242a8cf9aadd39e507e6e09c25530a2f01ca27fe57Owen Anderson 2536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// This naive implementation treats readers the same as writers. This 2636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// will therefore deadlock if a thread tries to acquire a read lock 2736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// multiple times. 2836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 2937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen HinesRWMutexImpl::RWMutexImpl() : data_(new MutexImpl(false)) { } 302a8cf9aadd39e507e6e09c25530a2f01ca27fe57Owen Anderson 3136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen HinesRWMutexImpl::~RWMutexImpl() { 3237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines delete static_cast<MutexImpl *>(data_); 3336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines} 342a8cf9aadd39e507e6e09c25530a2f01ca27fe57Owen Anderson 35b65e9ed10677fe8944822c450b14d7e321f6e6f5Owen Andersonbool RWMutexImpl::reader_acquire() { 3637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines return static_cast<MutexImpl *>(data_)->acquire(); 372a8cf9aadd39e507e6e09c25530a2f01ca27fe57Owen Anderson} 382a8cf9aadd39e507e6e09c25530a2f01ca27fe57Owen Anderson 39b65e9ed10677fe8944822c450b14d7e321f6e6f5Owen Andersonbool RWMutexImpl::reader_release() { 4037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines return static_cast<MutexImpl *>(data_)->release(); 412a8cf9aadd39e507e6e09c25530a2f01ca27fe57Owen Anderson} 422a8cf9aadd39e507e6e09c25530a2f01ca27fe57Owen Anderson 43b65e9ed10677fe8944822c450b14d7e321f6e6f5Owen Andersonbool RWMutexImpl::writer_acquire() { 4437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines return static_cast<MutexImpl *>(data_)->acquire(); 452a8cf9aadd39e507e6e09c25530a2f01ca27fe57Owen Anderson} 462a8cf9aadd39e507e6e09c25530a2f01ca27fe57Owen Anderson 47b65e9ed10677fe8944822c450b14d7e321f6e6f5Owen Andersonbool RWMutexImpl::writer_release() { 4837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines return static_cast<MutexImpl *>(data_)->release(); 492a8cf9aadd39e507e6e09c25530a2f01ca27fe57Owen Anderson} 502a8cf9aadd39e507e6e09c25530a2f01ca27fe57Owen Anderson 512a8cf9aadd39e507e6e09c25530a2f01ca27fe57Owen Anderson} 52