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.
|
|
//#---------------------------------------------------------------
//
// 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 ); }
|