| Index: src/ports/SkMutex_win.h
|
| ===================================================================
|
| --- src/ports/SkMutex_win.h (revision 0)
|
| +++ src/ports/SkMutex_win.h (working copy)
|
| @@ -0,0 +1,76 @@
|
| +/*
|
| + * 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 <windows.h>
|
| +#
|
| +#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
|
| +
|
| +// TODO: this exists because SK_DECLARE_STATIC_ONCE in methods is currently
|
| +// relying on a compiler bug which allows the '=' to work.
|
| +// All use of SK_DECLARE_STATIC_ONCE in methods is unsafe, and must be removed.
|
| +// To find these cases, make SkMutex's copy and assignement private directly.
|
| +class SkNoncopyableMutex {
|
| +public:
|
| + SkNoncopyableMutex() { }
|
| +
|
| +private:
|
| + SkNoncopyableMutex(const SkNoncopyableMutex&);
|
| + SkNoncopyableMutex& operator=(const SkNoncopyableMutex&);
|
| +};
|
| +
|
| +// On Windows, SkBaseMutex and SkMutex are the same thing,
|
| +// we can't easily get rid of static initializers.
|
| +class SkMutex : SkNoncopyableMutex {
|
| +public:
|
| + SkMutex() {
|
| + InitializeCriticalSection(&fStorage);
|
| + }
|
| +
|
| + ~SkMutex() {
|
| + DeleteCriticalSection(&fStorage);
|
| + }
|
| +
|
| + void acquire() {
|
| + EnterCriticalSection(&fStorage);
|
| + }
|
| +
|
| + void release() {
|
| + LeaveCriticalSection(&fStorage);
|
| + }
|
| +
|
| +private:
|
| + 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
|
|
|