/*
 * 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
