|
1 /* |
|
2 * Copyright 2013 Google Inc. |
|
3 * |
|
4 * Use of this source code is governed by a BSD-style license that can be |
|
5 * found in the LICENSE file. |
|
6 */ |
|
7 |
|
8 #ifndef SkMutex_win_DEFINED |
|
9 #define SkMutex_win_DEFINED |
|
10 |
|
11 /** Windows CriticalSection based mutex. */ |
|
12 |
|
13 #ifndef WIN32_LEAN_AND_MEAN |
|
14 # define WIN32_LEAN_AND_MEAN |
|
15 # define WIN32_IS_MEAN_WAS_LOCALLY_DEFINED |
|
16 #endif |
|
17 #ifndef NOMINMAX |
|
18 # define NOMINMAX |
|
19 # define NOMINMAX_WAS_LOCALLY_DEFINED |
|
20 #endif |
|
21 # |
|
22 #include <windows.h> |
|
23 # |
|
24 #ifdef WIN32_IS_MEAN_WAS_LOCALLY_DEFINED |
|
25 # undef WIN32_IS_MEAN_WAS_LOCALLY_DEFINED |
|
26 # undef WIN32_LEAN_AND_MEAN |
|
27 #endif |
|
28 #ifdef NOMINMAX_WAS_LOCALLY_DEFINED |
|
29 # undef NOMINMAX_WAS_LOCALLY_DEFINED |
|
30 # undef NOMINMAX |
|
31 #endif |
|
32 |
|
33 // On Windows, SkBaseMutex and SkMutex are the same thing, |
|
34 // we can't easily get rid of static initializers. |
|
35 class SkMutex { |
|
36 public: |
|
37 SkMutex() { |
|
38 InitializeCriticalSection(&fStorage); |
|
39 } |
|
40 |
|
41 ~SkMutex() { |
|
42 DeleteCriticalSection(&fStorage); |
|
43 } |
|
44 |
|
45 void acquire() { |
|
46 EnterCriticalSection(&fStorage); |
|
47 } |
|
48 |
|
49 void release() { |
|
50 LeaveCriticalSection(&fStorage); |
|
51 } |
|
52 |
|
53 private: |
|
54 SkMutex(const SkMutex&); |
|
55 SkMutex& operator=(const SkMutex&); |
|
56 |
|
57 CRITICAL_SECTION fStorage; |
|
58 }; |
|
59 |
|
60 typedef SkMutex SkBaseMutex; |
|
61 |
|
62 // Windows currently provides no documented means of POD initializing a CRITICAL_SECTION. |
|
63 #define SK_DECLARE_STATIC_MUTEX(name) static SkBaseMutex name |
|
64 #define SK_DECLARE_GLOBAL_MUTEX(name) SkBaseMutex name |
|
65 |
|
66 #endif |