Index: src/ports/SkMutex_win.h |
=================================================================== |
--- src/ports/SkMutex_win.h (revision 0) |
+++ src/ports/SkMutex_win.h (working copy) |
@@ -0,0 +1,76 @@ |
+/* |
+ * Copyright 2013 Google Inc. |
+ * |
+ * Use of this source code is governed by a BSD-style license that can be |
+ * found in the LICENSE file. |
+ */ |
+ |
+#ifndef SkMutex_win_DEFINED |
+#define SkMutex_win_DEFINED |
+ |
+/** Windows CriticalSection based mutex. */ |
+ |
+#ifndef WIN32_LEAN_AND_MEAN |
+# define WIN32_LEAN_AND_MEAN |
+# define WIN32_IS_MEAN_WAS_LOCALLY_DEFINED |
+#endif |
+#ifndef NOMINMAX |
+# define NOMINMAX |
+# define NOMINMAX_WAS_LOCALLY_DEFINED |
+#endif |
+# |
+#include <windows.h> |
+# |
+#ifdef WIN32_IS_MEAN_WAS_LOCALLY_DEFINED |
+# undef WIN32_IS_MEAN_WAS_LOCALLY_DEFINED |
+# undef WIN32_LEAN_AND_MEAN |
+#endif |
+#ifdef NOMINMAX_WAS_LOCALLY_DEFINED |
+# undef NOMINMAX_WAS_LOCALLY_DEFINED |
+# undef NOMINMAX |
+#endif |
+ |
+// TODO: this exists because SK_DECLARE_STATIC_ONCE in methods is currently |
+// relying on a compiler bug which allows the '=' to work. |
+// All use of SK_DECLARE_STATIC_ONCE in methods is unsafe, and must be removed. |
+// To find these cases, make SkMutex's copy and assignement private directly. |
+class SkNoncopyableMutex { |
+public: |
+ SkNoncopyableMutex() { } |
+ |
+private: |
+ SkNoncopyableMutex(const SkNoncopyableMutex&); |
+ SkNoncopyableMutex& operator=(const SkNoncopyableMutex&); |
+}; |
+ |
+// On Windows, SkBaseMutex and SkMutex are the same thing, |
+// we can't easily get rid of static initializers. |
+class SkMutex : SkNoncopyableMutex { |
+public: |
+ SkMutex() { |
+ InitializeCriticalSection(&fStorage); |
+ } |
+ |
+ ~SkMutex() { |
+ DeleteCriticalSection(&fStorage); |
+ } |
+ |
+ void acquire() { |
+ EnterCriticalSection(&fStorage); |
+ } |
+ |
+ void release() { |
+ LeaveCriticalSection(&fStorage); |
+ } |
+ |
+private: |
+ CRITICAL_SECTION fStorage; |
+}; |
+ |
+typedef SkMutex SkBaseMutex; |
+ |
+// Windows currently provides no documented means of POD initializing a CRITICAL_SECTION. |
+#define SK_DECLARE_STATIC_MUTEX(name) static SkBaseMutex name |
+#define SK_DECLARE_GLOBAL_MUTEX(name) SkBaseMutex name |
+ |
+#endif |