159 lines
2.6 KiB
C++
159 lines
2.6 KiB
C++
|
/*++
|
||
|
|
||
|
Copyright (c) 1998-1999 Microsoft Corporation
|
||
|
All rights reserved.
|
||
|
|
||
|
Module Name:
|
||
|
|
||
|
dbginit.cxx
|
||
|
|
||
|
Abstract:
|
||
|
|
||
|
Debug Library initialization
|
||
|
|
||
|
Author:
|
||
|
|
||
|
Steve Kiraly (SteveKi) 24-May-1998
|
||
|
|
||
|
Revision History:
|
||
|
|
||
|
--*/
|
||
|
#include "precomp.hxx"
|
||
|
#pragma hdrstop
|
||
|
|
||
|
//
|
||
|
// Debug library lock variable.
|
||
|
//
|
||
|
namespace
|
||
|
{
|
||
|
LONG DebugLibraryInitLock = 0;
|
||
|
BOOL IsLibraryInitialized = FALSE;
|
||
|
}
|
||
|
|
||
|
/*++
|
||
|
|
||
|
Title:
|
||
|
|
||
|
DebugLibraryInitialize
|
||
|
|
||
|
Routine Description:
|
||
|
|
||
|
Initialize the debug library. Basically we need to have the
|
||
|
library critical section initialized to prevent multiple threads
|
||
|
from trying to access either the messaging initialization code
|
||
|
or the internal heap initialization code.
|
||
|
|
||
|
Arguments:
|
||
|
|
||
|
None.
|
||
|
|
||
|
Return Value:
|
||
|
|
||
|
None.
|
||
|
|
||
|
--*/
|
||
|
extern "C"
|
||
|
VOID
|
||
|
DebugLibraryInitialize(
|
||
|
VOID
|
||
|
)
|
||
|
{
|
||
|
//
|
||
|
// Is the library initialized.
|
||
|
//
|
||
|
if (!IsLibraryInitialized)
|
||
|
{
|
||
|
//
|
||
|
// Only allow one thread to do the library initialization.
|
||
|
//
|
||
|
while (InterlockedCompareExchange(&DebugLibraryInitLock, 1, 0))
|
||
|
{
|
||
|
Sleep(1);
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// We must re-check is, to prevent second thread from doing
|
||
|
// the initialization as well.
|
||
|
//
|
||
|
if (!IsLibraryInitialized)
|
||
|
{
|
||
|
//
|
||
|
// Initialize the ciritical section
|
||
|
//
|
||
|
GlobalCriticalSection.Initialize();
|
||
|
|
||
|
//
|
||
|
// Initalize the debug heap.
|
||
|
//
|
||
|
DebugLibraryInitializeHeap();
|
||
|
|
||
|
//
|
||
|
// Mark the library as initialized.
|
||
|
//
|
||
|
IsLibraryInitialized = TRUE;
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// Release the library init lock.
|
||
|
//
|
||
|
DebugLibraryInitLock = 0;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/*++
|
||
|
|
||
|
Title:
|
||
|
|
||
|
DebugLibraryRelease
|
||
|
|
||
|
Routine Description:
|
||
|
|
||
|
Release any resorces in the debug library. Callers should call
|
||
|
this function to properly shut down the library. Callers should
|
||
|
not call any function in the library after this call.
|
||
|
|
||
|
Arguments:
|
||
|
|
||
|
None.
|
||
|
|
||
|
Return Value:
|
||
|
|
||
|
None.
|
||
|
|
||
|
--*/
|
||
|
extern "C"
|
||
|
VOID
|
||
|
DebugLibraryRelease(
|
||
|
VOID
|
||
|
)
|
||
|
{
|
||
|
//
|
||
|
// Relese the message instance.
|
||
|
//
|
||
|
TDebugMsg_Release();
|
||
|
|
||
|
//
|
||
|
// Walk the internal heap, if the Display library
|
||
|
// errors flag is enabled then the heap contents
|
||
|
// are dummped to the debug device.
|
||
|
//
|
||
|
DebugLibraryWalkHeap();
|
||
|
|
||
|
//
|
||
|
// Release the internal heap.
|
||
|
//
|
||
|
DebugLibraryDestroyHeap();
|
||
|
|
||
|
//
|
||
|
// Release the critical section.
|
||
|
//
|
||
|
GlobalCriticalSection.Release();
|
||
|
|
||
|
//
|
||
|
// Mark the library as not initialized.
|
||
|
//
|
||
|
IsLibraryInitialized = FALSE;
|
||
|
}
|
||
|
|
||
|
|