Index: src/core/SkSharedMutex.h |
diff --git a/src/core/SkSharedMutex.h b/src/core/SkSharedMutex.h |
index f3430040e38b51ee05ddb9d2915db44a30ff6ec3..9660adf0eb4084093801867033838db045cc40d3 100644 |
--- a/src/core/SkSharedMutex.h |
+++ b/src/core/SkSharedMutex.h |
@@ -11,9 +11,16 @@ |
#include "SkAtomics.h" |
#include "SkSemaphore.h" |
#include "SkTypes.h" |
- |
-// This is a shared lock implementation similar to pthreads rwlocks. This implementation is |
-// cribbed from Preshing's article: |
+ |
+#ifdef SK_DEBUG |
+ #include "SkMutex.h" |
+ #include "../private/SkUniquePtr.h" |
+#endif // SK_DEBUG |
+ |
+// There are two shared lock implementations one debug the other is high performance. They implement |
+// an interface similar to pthread's rwlocks. |
+// This is a shared lock implementation similar to pthreads rwlocks. The high performance |
+// implementation is cribbed from Preshing's article: |
// http://preshing.com/20150316/semaphores-are-surprisingly-versatile/ |
// |
// This lock does not obey strict queue ordering. It will always alternate between readers and |
@@ -29,11 +36,7 @@ public: |
void release(); |
// Fail if exclusive is not held. |
-#ifdef SK_DEBUG |
void assertHeld() const; |
-#else |
- void assertHeld() const {} |
-#endif |
// Acquire lock for shared use. |
void acquireShared(); |
@@ -42,17 +45,28 @@ public: |
void releaseShared(); |
// Fail if shared lock not held. |
-#ifdef SK_DEBUG |
void assertHeldShared() const; |
-#else |
- void assertHeldShared() const {} |
-#endif |
private: |
- SkAtomic<int32_t> fQueueCounts; |
- SkSemaphore fSharedQueue; |
+#ifdef SK_DEBUG |
+ class ThreadIDSet; |
+ skstd::unique_ptr<ThreadIDSet> fCurrentShared; |
+ skstd::unique_ptr<ThreadIDSet> fWaitingExclusive; |
+ skstd::unique_ptr<ThreadIDSet> fWaitingShared; |
+ int fSharedQueueSelect{0}; |
+ mutable SkMutex fMu; |
+ SkSemaphore fSharedQueue[2]; |
SkSemaphore fExclusiveQueue; |
+#else |
+ SkAtomic<int32_t> fQueueCounts; |
+ SkSemaphore fSharedQueue; |
+ SkSemaphore fExclusiveQueue; |
+#endif // SK_DEBUG |
}; |
+#ifndef SK_DEBUG |
+inline void SkSharedMutex::assertHeld() const {}; |
+inline void SkSharedMutex::assertHeldShared() const {}; |
+#endif // SK_DEBUG |
#endif // SkSharedLock_DEFINED |