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.
 
 
 
 
 
 

228 lines
4.1 KiB

/*==========================================================================
*
* Copyright (C) 1994-1995 Microsoft Corporation. All Rights Reserved.
*
* File: memalloc.c
* Content: allocates memory; uses global blocks and sub-allocates
* out of those using LocalAlloc
*@@BEGIN_MSINTERNAL
* History:
* Date By Reason
* ==== == ======
* 29-dec-94 craige initial implementation
* 12-jan-95 craige use clib as an option
*@@END_MSINTERNAL
*
***************************************************************************/
#include "ddraw16.h"
#if 0
#define USE_CLIB
#ifdef USE_CLIB
#include <malloc.h>
#else
#define GLOBAL_BLOCK_SIZE 32768
typedef struct _HEAPLIST
{
struct _HEAPLIST FAR *lpLink;
WORD wSel;
GLOBALHANDLE hMem;
} HEAPLIST, FAR *LPHEAPLIST;
static LPHEAPLIST lphlHeap;
/*
* tryAlloc - try to allocate from a heap
*/
static LPVOID tryAlloc( WORD sel, WORD size )
{
void NEAR *ptr;
_asm push ds
_asm mov ax, sel
_asm mov ds, ax
ptr = (void NEAR *) LocalAlloc( LPTR, size );
_asm pop ds
if( ptr == (void NEAR *) NULL )
{
return (void FAR *) NULL;
}
return MAKELP( sel, ptr );
} /* tryAlloc */
#endif
#ifdef DEBUG
LONG lAllocCount;
#endif
/*
* MemAlloc - allocate memory from our global pool
*/
LPVOID MemAlloc( UINT size )
{
LPVOID lptr;
#ifndef USE_CLIB
LPHEAPLIST curr;
GLOBALHANDLE gh;
LPVOID lpnew;
WORD sel;
#endif
#ifdef DEBUG
lAllocCount++;
#endif
#ifdef USE_CLIB
lptr = _fmalloc( size );
if( lptr != NULL )
{
_fmemset( lptr, 0, size );
}
else
{
DPF( 1, "Alloc of size %u FAILED!", size );
}
return lptr;
#else
/*
* run our current list of GlobalAlloc'ed chunks
*/
curr = lphlHeap;
while( curr != NULL )
{
lptr = tryAlloc( curr->wSel, size );
if( lptr != (LPVOID) NULL )
{
return lptr;
}
curr = curr->lpLink;
}
/*
* no luck, allocate a new global chunk
*/
gh = GlobalAlloc( GMEM_SHARE | GMEM_MOVEABLE, GLOBAL_BLOCK_SIZE );
if( gh == NULL )
{
return NULL;
}
lpnew = GlobalLock( gh );
if( lpnew == NULL )
{
GlobalFree( gh );
return NULL;
}
/*
* set up a local heap in this new global chunk
*/
sel = SELECTOROF( lpnew );
if( !LocalInit( sel, 0, GLOBAL_BLOCK_SIZE-1 ) )
{
GlobalUnlock( gh );
GlobalFree( gh );
return NULL;
}
/*
* chain this new heap into our list
*/
curr = tryAlloc( sel, sizeof( HEAPLIST ) );
if( curr == NULL )
{
return NULL;
}
curr->wSel = sel;
curr->hMem = gh;
curr->lpLink = lphlHeap;
lphlHeap = curr;
/*
* go allocate the original request
*/
return tryAlloc( sel, size );
#endif
} /* MemAlloc */
/*
* MemFree - free memory from our global pool
*/
void MemFree( LPVOID lptr )
{
#ifdef USE_CLIB
_ffree( lptr );
#else
WORD sel;
if( lptr != (LPVOID) NULL )
{
sel = SELECTOROF( lptr );
_asm push ds
_asm mov ax,sel
_asm mov ds,ax
LocalFree( OFFSETOF( lptr ) );
_asm pop ds
}
#endif
#ifdef DEBUG
if( lptr != NULL )
{
lAllocCount--;
if( lAllocCount < 0 )
{
DPF( 1, "Too Many Frees!\n" );
}
}
#endif
} /* MemFree */
/*
* MemInit - initialize the heap manager
*/
BOOL MemInit( void )
{
#ifndef USE_CLIB
lphlHeap = NULL;
#endif
#ifdef DEBUG
lAllocCount = 0;
#endif
return TRUE;
} /* MemInit */
/*
* MemFini - finished with our heap manager
*/
void MemFini( void )
{
#ifdef DEBUG
if( lAllocCount != 0 )
{
DPF( 1, "Memory still allocated! Alloc count = %ld", lAllocCount );
}
#endif
#ifndef USE_CLIB
LPHEAPLIST curr;
LPHEAPLIST last;
GLOBALHANDLE gh;
curr = lphlHeap;
while( curr != NULL )
{
gh = curr->hMem;
last = curr->lpLink;
// GlobalUnfix( gh );
GlobalUnlock( gh );
GlobalFree( gh );
curr = last;
}
lphlHeap = NULL;
#endif
} /* MemFini */
#endif