[PATCH] D66313: Re-introduce the RWMutexImpl for macOS < 10.12

Jonas Devlieghere via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Thu Aug 15 15:08:44 PDT 2019


JDevlieghere created this revision.
JDevlieghere added reviewers: bkramer, jfb, ldionne.
Herald added subscribers: kristina, dexonsmith.
Herald added a project: LLVM.
JDevlieghere added a reviewer: arphaman.

Unfortunately, `std::shared_timed_mutex` is only available on macOS 10.12 and later. This prevents LLVM from compiling when you have a deployment target that older. This patch reintroduced the old `RWMutexImpl` but guards it by the macOS availability macro.


Repository:
  rL LLVM

https://reviews.llvm.org/D66313

Files:
  llvm/include/llvm/Support/RWMutex.h


Index: llvm/include/llvm/Support/RWMutex.h
===================================================================
--- llvm/include/llvm/Support/RWMutex.h
+++ llvm/include/llvm/Support/RWMutex.h
@@ -31,8 +31,71 @@
       // on Windows and always available on MSVC.
 #if defined(_MSC_VER) || __cplusplus > 201402L
       std::shared_mutex impl;
+#else
+      // std::shared_timed_mutex is only availble on macOS 10.12 and later.
+#if defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) &&                  \
+    defined(__MAC_10_12) &&                                                    \
+    __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ < __MAC_10_12
+      /// Platform agnostic RWMutex class.
+      /// Platform agnostic RWMutex class.
+      class RWMutexImpl {
+        /// @name Constructors
+        /// @{
+      public:
+        /// Initializes the lock but doesn't acquire it.
+        /// Default Constructor.
+        explicit RWMutexImpl();
+
+        /// @}
+        /// @name Do Not Implement
+        /// @{
+        RWMutexImpl(const RWMutexImpl &original) = delete;
+        RWMutexImpl &operator=(const RWMutexImpl &) = delete;
+        /// @}
+
+        /// Releases and removes the lock
+        /// Destructor
+        ~RWMutexImpl();
+
+        /// @}
+        /// @name Methods
+        /// @{
+      public:
+        /// Attempts to unconditionally acquire the lock in reader mode. If the
+        /// lock is held by a writer, this method will wait until it can acquire
+        /// the lock.
+        /// @returns false if any kind of error occurs, true otherwise.
+        /// Unconditionally acquire the lock in reader mode.
+        bool reader_acquire();
+
+        /// Attempts to release the lock in reader mode.
+        /// @returns false if any kind of error occurs, true otherwise.
+        /// Unconditionally release the lock in reader mode.
+        bool reader_release();
+
+        /// Attempts to unconditionally acquire the lock in reader mode. If the
+        /// lock is held by any readers, this method will wait until it can
+        /// acquire the lock.
+        /// @returns false if any kind of error occurs, true otherwise.
+        /// Unconditionally acquire the lock in writer mode.
+        bool writer_acquire();
+
+        /// Attempts to release the lock in writer mode.
+        /// @returns false if any kind of error occurs, true otherwise.
+        /// Unconditionally release the lock in write mode.
+        bool writer_release();
+
+        //@}
+        /// @name Platform Dependent Data
+        /// @{
+      private:
+#if defined(LLVM_ENABLE_THREADS) && LLVM_ENABLE_THREADS != 0
+        void *data_ = nullptr; ///< We don't know what the data will be
+#endif
+      } impl;
 #else
       std::shared_timed_mutex impl;
+#endif
 #endif
       unsigned readers = 0;
       unsigned writers = 0;


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D66313.215475.patch
Type: text/x-patch
Size: 2866 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20190815/457d75d9/attachment.bin>


More information about the llvm-commits mailing list