/* * 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 # #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 // On Windows, SkBaseMutex and SkMutex are the same thing, // we can't easily get rid of static initializers. class SkMutex { public: SkMutex() { InitializeCriticalSection(&fStorage); } ~SkMutex() { DeleteCriticalSection(&fStorage); } void acquire() { EnterCriticalSection(&fStorage); } void release() { LeaveCriticalSection(&fStorage); } private: SkMutex(const SkMutex&); SkMutex& operator=(const SkMutex&); 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