Index: src/core/SkSharedMutex.h |
diff --git a/src/core/SkSharedMutex.h b/src/core/SkSharedMutex.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..a020f9e1be94b3fd5fc3b2625609069320b75602 |
--- /dev/null |
+++ b/src/core/SkSharedMutex.h |
@@ -0,0 +1,43 @@ |
+/* |
+ * Copyright 2015 Google Inc. |
+ * |
+ * Use of this source code is governed by a BSD-style license that can be |
+ * found in the LICENSE file. |
+ */ |
+ |
+#ifndef SkSharedLock_DEFINED |
+#define SkSharedLock_DEFINED |
+ |
+#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: |
+// http://preshing.com/20150316/semaphores-are-surprisingly-versatile/ |
+// |
+// This lock does not obey strict queue ordering. It will always alternate between readers and |
+// a single writer. |
+class SkSharedMutex { |
+public: |
+ SkSharedMutex(); |
+ |
+ // Acquire lock for exclusive use. |
+ void acquire(); |
+ |
+ // Release lock for exclusive use. |
+ void release(); |
+ |
+ // Acquire lock for shared use. |
+ void acquireShared(); |
+ |
+ // Release lock for shared use. |
+ void releaseShared(); |
+ |
+private: |
+ SkAtomic<int32_t> fQueueCounts; |
+ SkSemaphore fSharedQueue; |
+ SkSemaphore fExclusiveQueue; |
+}; |
+ |
+#endif // SkSharedLock_DEFINED |