diff options
author | Benjamin Kramer <benny.kra@googlemail.com> | 2019-08-15 16:55:23 +0000 |
---|---|---|
committer | Benjamin Kramer <benny.kra@googlemail.com> | 2019-08-15 16:55:23 +0000 |
commit | 8d3a1523dd96968c75987620374bfc78c45ee279 (patch) | |
tree | 603a0e1a2a311f227eedccc4fcf7eeb2d59c5a16 /llvm/lib/Support/RWMutex.cpp | |
parent | 1c013ca1f28b5cb1c969ccec0b28b1da40a4a0ae (diff) | |
download | bcm5719-llvm-8d3a1523dd96968c75987620374bfc78c45ee279.tar.gz bcm5719-llvm-8d3a1523dd96968c75987620374bfc78c45ee279.zip |
[Support] Base RWMutex on std::shared_timed_mutex (C++14)
This should have the same semantics. We use std::shared_mutex instead on
MSVC and C++17, std::shared_timed_mutex is less efficient than our
custom implementation on Windows, std::shared_mutex should be faster.
llvm-svn: 369018
Diffstat (limited to 'llvm/lib/Support/RWMutex.cpp')
-rw-r--r-- | llvm/lib/Support/RWMutex.cpp | 124 |
1 files changed, 0 insertions, 124 deletions
diff --git a/llvm/lib/Support/RWMutex.cpp b/llvm/lib/Support/RWMutex.cpp deleted file mode 100644 index 7ce856b716c..00000000000 --- a/llvm/lib/Support/RWMutex.cpp +++ /dev/null @@ -1,124 +0,0 @@ -//===- RWMutex.cpp - Reader/Writer Mutual Exclusion Lock --------*- C++ -*-===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// -// -// This file implements the llvm::sys::RWMutex class. -// -//===----------------------------------------------------------------------===// - -#include "llvm/Support/Allocator.h" -#include "llvm/Support/RWMutex.h" -#include "llvm/Config/config.h" - -//===----------------------------------------------------------------------===// -//=== WARNING: Implementation here must contain only TRULY operating system -//=== independent code. -//===----------------------------------------------------------------------===// - -#if !defined(LLVM_ENABLE_THREADS) || LLVM_ENABLE_THREADS == 0 -// Define all methods as no-ops if threading is explicitly disabled - -using namespace llvm; -using namespace sys; - -RWMutexImpl::RWMutexImpl() = default; -RWMutexImpl::~RWMutexImpl() = default; - -bool RWMutexImpl::reader_acquire() { return true; } -bool RWMutexImpl::reader_release() { return true; } -bool RWMutexImpl::writer_acquire() { return true; } -bool RWMutexImpl::writer_release() { return true; } - -#else - -#if defined(HAVE_PTHREAD_H) && defined(HAVE_PTHREAD_RWLOCK_INIT) - -#include <cassert> -#include <cstdlib> -#include <pthread.h> - -using namespace llvm; -using namespace sys; - -// Construct a RWMutex using pthread calls -RWMutexImpl::RWMutexImpl() -{ - // Declare the pthread_rwlock data structures - pthread_rwlock_t* rwlock = - static_cast<pthread_rwlock_t*>(safe_malloc(sizeof(pthread_rwlock_t))); - -#ifdef __APPLE__ - // Workaround a bug/mis-feature in Darwin's pthread_rwlock_init. - bzero(rwlock, sizeof(pthread_rwlock_t)); -#endif - - // Initialize the rwlock - int errorcode = pthread_rwlock_init(rwlock, nullptr); - (void)errorcode; - assert(errorcode == 0); - - // Assign the data member - data_ = rwlock; -} - -// Destruct a RWMutex -RWMutexImpl::~RWMutexImpl() -{ - pthread_rwlock_t* rwlock = static_cast<pthread_rwlock_t*>(data_); - assert(rwlock != nullptr); - pthread_rwlock_destroy(rwlock); - free(rwlock); -} - -bool -RWMutexImpl::reader_acquire() -{ - pthread_rwlock_t* rwlock = static_cast<pthread_rwlock_t*>(data_); - assert(rwlock != nullptr); - - int errorcode = pthread_rwlock_rdlock(rwlock); - return errorcode == 0; -} - -bool -RWMutexImpl::reader_release() -{ - pthread_rwlock_t* rwlock = static_cast<pthread_rwlock_t*>(data_); - assert(rwlock != nullptr); - - int errorcode = pthread_rwlock_unlock(rwlock); - return errorcode == 0; -} - -bool -RWMutexImpl::writer_acquire() -{ - pthread_rwlock_t* rwlock = static_cast<pthread_rwlock_t*>(data_); - assert(rwlock != nullptr); - - int errorcode = pthread_rwlock_wrlock(rwlock); - return errorcode == 0; -} - -bool -RWMutexImpl::writer_release() -{ - pthread_rwlock_t* rwlock = static_cast<pthread_rwlock_t*>(data_); - assert(rwlock != nullptr); - - int errorcode = pthread_rwlock_unlock(rwlock); - return errorcode == 0; -} - -#elif defined(LLVM_ON_UNIX) -#include "Unix/RWMutex.inc" -#elif defined( _WIN32) -#include "Windows/RWMutex.inc" -#else -#warning Neither LLVM_ON_UNIX nor _WIN32 was set in Support/Mutex.cpp -#endif -#endif |