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