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, 34cad0cb2a2dd23ceee03f24954c491344aef18c2ctomhudson// we can't easily get rid of static initializers. However, 35cad0cb2a2dd23ceee03f24954c491344aef18c2ctomhudson// we preserve the same inheritance pattern as other platforms 36cad0cb2a2dd23ceee03f24954c491344aef18c2ctomhudson// so that we can forward-declare cleanly. 37cad0cb2a2dd23ceee03f24954c491344aef18c2ctomhudsonstruct SkBaseMutex { 38d9947f605a335363b0a0541d6d8cb7a7113ed788bungeman@google.compublic: 39cad0cb2a2dd23ceee03f24954c491344aef18c2ctomhudson SkBaseMutex() { 40d9947f605a335363b0a0541d6d8cb7a7113ed788bungeman@google.com InitializeCriticalSection(&fStorage); 41b83f6c3cbdabc14d8290b00d9f38ba59bf6719a1mtklein SkDEBUGCODE(fOwner = 0;) 42d9947f605a335363b0a0541d6d8cb7a7113ed788bungeman@google.com } 43d9947f605a335363b0a0541d6d8cb7a7113ed788bungeman@google.com 44cad0cb2a2dd23ceee03f24954c491344aef18c2ctomhudson ~SkBaseMutex() { 45b83f6c3cbdabc14d8290b00d9f38ba59bf6719a1mtklein SkASSERT(0 == fOwner); 46d9947f605a335363b0a0541d6d8cb7a7113ed788bungeman@google.com DeleteCriticalSection(&fStorage); 47d9947f605a335363b0a0541d6d8cb7a7113ed788bungeman@google.com } 48d9947f605a335363b0a0541d6d8cb7a7113ed788bungeman@google.com 49d9947f605a335363b0a0541d6d8cb7a7113ed788bungeman@google.com void acquire() { 50d9947f605a335363b0a0541d6d8cb7a7113ed788bungeman@google.com EnterCriticalSection(&fStorage); 51b83f6c3cbdabc14d8290b00d9f38ba59bf6719a1mtklein SkDEBUGCODE(fOwner = GetCurrentThreadId();) 52d9947f605a335363b0a0541d6d8cb7a7113ed788bungeman@google.com } 53d9947f605a335363b0a0541d6d8cb7a7113ed788bungeman@google.com 54d9947f605a335363b0a0541d6d8cb7a7113ed788bungeman@google.com void release() { 55b83f6c3cbdabc14d8290b00d9f38ba59bf6719a1mtklein this->assertHeld(); 56b83f6c3cbdabc14d8290b00d9f38ba59bf6719a1mtklein SkDEBUGCODE(fOwner = 0;) 57d9947f605a335363b0a0541d6d8cb7a7113ed788bungeman@google.com LeaveCriticalSection(&fStorage); 58d9947f605a335363b0a0541d6d8cb7a7113ed788bungeman@google.com } 59d9947f605a335363b0a0541d6d8cb7a7113ed788bungeman@google.com 60b83f6c3cbdabc14d8290b00d9f38ba59bf6719a1mtklein void assertHeld() { 61b83f6c3cbdabc14d8290b00d9f38ba59bf6719a1mtklein SkASSERT(GetCurrentThreadId() == fOwner); 62b83f6c3cbdabc14d8290b00d9f38ba59bf6719a1mtklein } 63b83f6c3cbdabc14d8290b00d9f38ba59bf6719a1mtklein 64cad0cb2a2dd23ceee03f24954c491344aef18c2ctomhudsonprotected: 65d9947f605a335363b0a0541d6d8cb7a7113ed788bungeman@google.com CRITICAL_SECTION fStorage; 66b83f6c3cbdabc14d8290b00d9f38ba59bf6719a1mtklein SkDEBUGCODE(DWORD fOwner;) 67cad0cb2a2dd23ceee03f24954c491344aef18c2ctomhudson 68cad0cb2a2dd23ceee03f24954c491344aef18c2ctomhudsonprivate: 69cad0cb2a2dd23ceee03f24954c491344aef18c2ctomhudson SkBaseMutex(const SkBaseMutex&); 70cad0cb2a2dd23ceee03f24954c491344aef18c2ctomhudson SkBaseMutex& operator=(const SkBaseMutex&); 71d9947f605a335363b0a0541d6d8cb7a7113ed788bungeman@google.com}; 72d9947f605a335363b0a0541d6d8cb7a7113ed788bungeman@google.com 73cad0cb2a2dd23ceee03f24954c491344aef18c2ctomhudsonclass SkMutex : public SkBaseMutex { }; 74d9947f605a335363b0a0541d6d8cb7a7113ed788bungeman@google.com 75d9947f605a335363b0a0541d6d8cb7a7113ed788bungeman@google.com// Windows currently provides no documented means of POD initializing a CRITICAL_SECTION. 76d6aeb6dc8fe21066f1a2c4813a4256a3acd3edf5bungeman// As a result, it is illegal to SK_DECLARE_STATIC_MUTEX in a function. 771ef960b01b3d76d9dac19a0d38d71dd03bbb9f21bungeman#define SK_DECLARE_STATIC_MUTEX(name) namespace{} static SkBaseMutex name 78d9947f605a335363b0a0541d6d8cb7a7113ed788bungeman@google.com 79d9947f605a335363b0a0541d6d8cb7a7113ed788bungeman@google.com#endif 80