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

// On Windows, SkBaseMutex and SkMutex are the same thing,
// we can't easily get rid of static initializers.
class SkMutex {
public:
    SkMutex() {
        InitializeCriticalSection(&fStorage);
        SkDEBUGCODE(fOwner = 0;)
    }

    ~SkMutex() {
        SkASSERT(0 == fOwner);
        DeleteCriticalSection(&fStorage);
    }

    void acquire() {
        EnterCriticalSection(&fStorage);
        SkDEBUGCODE(fOwner = GetCurrentThreadId();)
    }

    void release() {
        this->assertHeld();
        SkDEBUGCODE(fOwner = 0;)
        LeaveCriticalSection(&fStorage);
    }

    void assertHeld() {
        SkASSERT(GetCurrentThreadId() == fOwner);
    }

private:
    SkMutex(const SkMutex&);
    SkMutex& operator=(const SkMutex&);

    CRITICAL_SECTION fStorage;
    SkDEBUGCODE(DWORD fOwner;)
};

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
