Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

132 lines
3.1 KiB

//#---------------------------------------------------------------
//
// File: FreeQ.cpp
//
// Synopsis: interface between CPool object and asynctrc.c
//
// Copyright (C) 1995 Microsoft Corporation
// All rights reserved.
//
// Authors: gordm
//
//----------------------------------------------------------------
#define _DBGTRACE_DLL_IMPLEMENTATION
#include <windows.h>
#include <cpool.h>
#include "randfail.h"
#include "traceint.h"
//
// global pointer to CPool to avoid pulling in the C runtime
// to call the con/destrustors
//
CPool* g_pFreePool = NULL;
//+---------------------------------------------------------------
//
// Function: InitTraceBuffers
//
// Synopsis: external "C" function to init the CPool
//
// Arguments: DWORD: Maximum number of pending traces
// DWORD: Increment size for the CPool
//
// Returns: BOOL: successful or not
//
//----------------------------------------------------------------
BOOL WINAPI InitTraceBuffers( DWORD dwThresholdCount, DWORD dwIncrement )
{
g_pFreePool = new CPool( TRACE_SIGNATURE );
return g_pFreePool != NULL &&
g_pFreePool->ReserveMemory( dwThresholdCount,
sizeof(TRACEBUF),
dwIncrement );
}
//+---------------------------------------------------------------
//
// Function: TermTraceBuffers
//
// Synopsis: cleanup
//
// Arguments: void
//
// Returns: void
//
//----------------------------------------------------------------
void WINAPI TermTraceBuffers( void )
{
CPool* pPool = (CPool*)InterlockedExchangePointer((void**)&g_pFreePool, NULL );
if ( pPool != NULL )
{
pPool->ReleaseMemory();
delete pPool;
}
}
//+---------------------------------------------------------------
//
// Function: GetTraceBuffer
//
// Synopsis: external "C" function to get a CPool buffer
//
// Arguments: void
//
// Returns: LPTRACEBUF: allocated buffer
//
//----------------------------------------------------------------
LPTRACEBUF WINAPI GetTraceBuffer( void )
{
LPTRACEBUF lpBuf;
//
// don't let the number of traces exceed the size
// of the file
//
if ( PendQ.dwCount >= PendQ.dwThresholdCount )
{
INT_TRACE( "Alloc flush: %u\n", PendQ.dwCount );
FlushAsyncTrace();
}
//
// Turn off randfail for this allocation
//
RandFailDisable();
lpBuf = (LPTRACEBUF)g_pFreePool->Alloc();
RandFailEnable();
if ( lpBuf != NULL )
{
lpBuf->pNext = NULL;
lpBuf->dwSignature = TRACE_SIGNATURE;
}
return lpBuf;
}
//+---------------------------------------------------------------
//
// Function: FreeTraceBuffer
//
// Synopsis: external "C" function to free a CPool buffer
//
// Arguments: LPTRACEBUF: the buffer to free
//
// Returns: void
//
//----------------------------------------------------------------
void WINAPI FreeTraceBuffer( LPTRACEBUF lpBuf )
{
ASSERT( lpBuf != NULL );
ASSERT( lpBuf->dwSignature == TRACE_SIGNATURE );
g_pFreePool->Free( (void*)lpBuf );
}