|
|
/*++
Copyright (c) 1997-2001 Microsoft Corporation
Module Name:
memory.c
Abstract:
Domain Name System (DNS) Library
Memory allocation routines for DNS library.
Author:
Jim Gilroy (jamesg) January, 1997
Revision History:
--*/
#include "local.h"
//
// Private default dnsapi heap.
//
// Use non-process heap just so i don't have to debug a stress
// failure every time some yahoo corrupts their heap.
//
HEAP_BLOB g_DnsApiHeap;
//
// Heap flags
//
#if DBG
#define DNS_HEAP_FLAGS \
( HEAP_GROWABLE | \ HEAP_TAIL_CHECKING_ENABLED | \ HEAP_FREE_CHECKING_ENABLED | \ HEAP_CREATE_ALIGN_16 | \ HEAP_CLASS_1 ) #else
#define DNS_HEAP_FLAGS \
( HEAP_GROWABLE | \ HEAP_CREATE_ALIGN_16 | \ HEAP_CLASS_1 ) #endif
VOID Heap_Initialize( VOID ) /*++
Routine Description:
Initialize heap routines.
MUST call this in dnsapi.dll attach. Note this doesn't actually create the heap. For perf, don't do that until we actually get called.
Arguments:
None.
Return Value:
None.
--*/ { #ifdef PRIVATE_DNSHEAP
//
// use dnslib debug heap as private heap
//
LOCK_GENERAL();
Dns_HeapInitialize( & g_DnsApiHeap, NULL, // no existing heap handle
DNS_HEAP_FLAGS, // create flags
#if DBG
TRUE, // use debug headers
#else
FALSE, // no debug headers
#endif
TRUE, // dnslib uses this heap
TRUE, // full heap checks
0, // no exception
0, // no default flags
"dnslib", // bogus file
0 // bogus line no
);
UNLOCK_GENERAL(); #endif
}
VOID Heap_Cleanup( VOID ) /*++
Routine Description:
Delete heap.
Need this to allow restart.
Arguments:
None.
Return Value:
None.
--*/ { #ifdef PRIVATE_DNSHEAP
//
// delete private heap
//
DNSDBG( ANY, ( "Heap_Cleanup()\n" ));
Dns_HeapCleanup( &g_DnsApiHeap ); #endif
}
//
// Exported routines
//
VOID DnsApiHeapReset( IN DNS_ALLOC_FUNCTION pAlloc, IN DNS_REALLOC_FUNCTION pRealloc, IN DNS_FREE_FUNCTION pFree ) /*++
Routine Description:
Resets heap routines used by dnsapi.dll routines.
DnsApi.dll allocates memory using the dnslib.lib heap routines. This simply resets those routines to use pointers to users heap routines.
Arguments:
pAlloc -- ptr to desired alloc function pRealloc -- ptr to desired realloc function pFree -- ptr to desired free function
Return Value:
None.
--*/ { // redirect heap for dnslib
Dns_LibHeapReset( pAlloc, pRealloc, pFree ); }
//
// External access to DNS memory routines.
//
// Modules that use DNS API memory and can be called in the context
// of DNS server or other process which points dnsapi.dll at another
// heap, should use these routines rather than LocalAlloc\Free().
//
// Note: that these routines can simply call the dnslib routines.
// This is because dnsapi ALWAYS keeps its heap in sync with dnslib
// whether it is default heap or has been redirected. Since dnslib
// heap routines have the redirection check, we can just call them
// and they'll do the right thing, we don't need a redirection check
// ourselves.
//
PVOID DnsApiAlloc( IN INT iSize ) { return Dns_Alloc( iSize ); }
PVOID DnsApiRealloc( IN OUT PVOID pMem, IN INT iSize ) { return Dns_Realloc( pMem, iSize ); }
VOID DnsApiFree( IN OUT PVOID pMem ) { Dns_Free( pMem ); }
//
// SDK public free
//
// Extensions to DNS_FREE_TYPE enum in windns.h to handle
// system-public structures.
// These are only used if freeing with DnsFree(), if using
// DnsFreeConfigStructure() then use the ConfigId directly.
//
// For convenience free type is the same as the config id.
// If this changes must change DnsFreeConfigStructure()
// to do mapping.
//
// These conflict with old function defs, so must undef
#undef DnsFreeNetworkInformation
#undef DnsFreeSearchInformation
#undef DnsFreeAdapterInformation
#define DnsFreeNetworkInformation (DNS_FREE_TYPE)DnsConfigNetworkInformation
#define DnsFreeSearchInformation (DNS_FREE_TYPE)DnsConfigSearchInformation
#define DnsFreeAdapterInformation (DNS_FREE_TYPE)DnsConfigAdapterInformation
#define DnsFreeNetInfo (DNS_FREE_TYPE)DnsConfigNetInfo
VOID WINAPI DnsFree( IN OUT PVOID pData, IN DNS_FREE_TYPE FreeType ) /*++
Routine Description:
Generic DNS data free.
Arguments:
pData -- data to free
FreeType -- free type
Return Value:
None
--*/ { DNSDBG( TRACE, ( "DnsFree( %p, %d )\n", pData, FreeType ));
if ( !pData ) { return; }
//
// free appropriate type
//
switch ( FreeType ) { case DnsFreeFlat:
DnsApiFree( pData ); break;
case DnsFreeRecordList:
Dns_RecordListFree( (PDNS_RECORD)pData ); break;
case DnsFreeNetworkInformation:
FreeNetworkInformation( pData ); break;
case DnsFreeSearchInformation:
FreeSearchInformation( pData ); break;
case DnsFreeAdapterInformation:
FreeAdapterInformation( pData ); break;
case DnsFreeNetInfo:
NetInfo_Free( pData ); break;
default:
ASSERT( FALSE ); DnsApiFree( pData ); break; } }
//
// End memory.c
//
|