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