/*++

Copyright (c) 1989  Microsoft Corporation

Module Name:

    atkcrit.c

Abstract:

    This module implements nt critical section code to be used by the
    portable stack's EnterCriticalSection()/ExitCriticalSection() routines.

Author:

    Nikhil Kamkolkar (NikhilK)    8-Jun-1992

Revision History:

--*/


#include "atalknt.h"

//
// Global variables
//

NDIS_SPIN_LOCK  CriticalSpinLock;


#if DBG
KSPIN_LOCK   SpinLock;
#endif




VOID
InitCriticalSectionNt( VOID )
{
    NdisAllocateSpinLock(&CriticalSpinLock);

#if DBG
    SpinLock = CriticalSpinLock.SpinLock;
    DBGPRINT(ATALK_DEBUG_CRITSEC, DEBUG_LEVEL_INFOCLASS0, ("SpinLock = %lx\n", SpinLock));
#endif

    return;
}




VOID
EnterCriticalSectionNt( VOID )
{

#if DBG
    PULONG  ebp;

    ebp = *(PULONG *)((PULONG)&ebp + 1);
    DBGPRINT(ATALK_DEBUG_CRITSEC, DEBUG_LEVEL_INFOCLASS0, ("Acquiring critical: %lx(%lx)\n",
                &CriticalSpinLock, *(ULONG *)(ebp+1) ));
    if (CriticalSpinLock.SpinLock != SpinLock) {
        DBGBRK(ATALK_DEBUG_CRITSEC, DEBUG_LEVEL_ERROR);
    }
#endif

    ACQUIRE_SPIN_LOCK(&CriticalSpinLock);
    return;
}




VOID
LeaveCriticalSectionNt( VOID )
{
#if DBG
    PULONG  ebp;

    ebp = *(PULONG *)((PULONG)&ebp + 1);
    DBGPRINT(ATALK_DEBUG_CRITSEC, DEBUG_LEVEL_INFOCLASS0, ("Releasing critical: %lx(%lx)\n",
                &CriticalSpinLock, *(ULONG *)(ebp+1) ));
#endif

    RELEASE_SPIN_LOCK(&CriticalSpinLock);

#if DBG
    if (SpinLock != CriticalSpinLock.SpinLock) {
        DBGBRK(ATALK_DEBUG_CRITSEC, DEBUG_LEVEL_ERROR);
    }
#endif

    return;
}