/*++ Copyright (c) 1996 Microsoft Corporation Module Name: ptrmap.cxx Abstract: A helper class for mapping ID to 32 or 64 bit ptr Author: Kestutis Patiejunas (kestutip) 08-Dec-1998 Revision History: Notes: --*/ #include "precomp.hxx" #ifdef _X86_ /*++ Routine Description: Constructor Arguments: ignored Return Value: NA --*/ CIdToPointerMapper::CIdToPointerMapper( DWORD , DWORD ) { } CIdToPointerMapper::~CIdToPointerMapper() { } VOID CIdToPointerMapper::VerifyOutstandinMappings() { } /*++ Routine Description: Finds a mapping in mapping table between DWORD ID and pointer associated Arguments: DWORD ID - and ID to which mapping should be deleted. Return Value: PVOID - the pointer associated with the given ID. NULL indicates a failure. --*/ PVOID CIdToPointerMapper::FindMapping( DWORD id) { return (PVOID)id; } /*++ Routine Description: Deletes a mapping from mapping table between dword ID and PTR Arguments: ignored Return Value: BOOL TRUE is succeded --*/ BOOL CIdToPointerMapper::DeleteMapping( DWORD ) { return TRUE; } /*++ Routine Description: Takes a PVOID pointer and returns a DWORD ID associated,which should be used in mapping it back to ptr Arguments: PVOID ptr - a pointer of 32/64 bits which should be mapped into dword Return Value: DWORD - an ID associated with a given pointer . Starts from 1. Zero indicates a failure to craete mapping. --*/ DWORD CIdToPointerMapper::AddMapping( PVOID ptr) { return (DWORD)ptr; } #else // ifdef _X86_ /*++ Routine Description: Constructor Arguments: nStartMaps - initial nubmer of possible mappings in table nIncreaseMaps - number of increase for table when there is not enought space Return Value: sucess is tored in m_fInitialized --*/ CIdToPointerMapper::CIdToPointerMapper(DWORD nStartMaps,DWORD nIncreaseMaps): m_nStartMaps(nStartMaps), m_nIncreaseMaps(nIncreaseMaps) { if (!m_nStartMaps) { m_nStartMaps = DEFAULT_START_NUMBER_OF_MAPS; } if (!nIncreaseMaps) { m_nIncreaseMaps = DEFAULT_INCREASE_NUMBER_OF_MAPS; } // initial empty list head index m_EmptyPlace = 0; m_nMappings = 0; m_Map = NULL; // allocate a mem for mapping m_pBufferObj = new BUFFER (m_nStartMaps * sizeof(MapperElement)); if( m_pBufferObj ) { m_Map = (MapperElement *) m_pBufferObj->QueryPtr(); } if (m_Map) { // initialized mappaing space so the every element point to next one for (DWORD i=0; i< m_nStartMaps; i++) { m_Map[i].fInUse = FALSE; m_Map[i].dwIndex = i+1; } // just the last has special value m_Map[m_nStartMaps-1].dwIndex = MAPPING_NO_EMPTY_PLACE_IDX; m_fInitialized = TRUE; } else { m_fInitialized =FALSE; } } CIdToPointerMapper::~CIdToPointerMapper() { VerifyOutstandinMappings (); if (m_fInitialized) { delete m_pBufferObj; } } VOID CIdToPointerMapper::VerifyOutstandinMappings () { MD_ASSERT (m_nMappings==0); } /*++ Routine Description: Finds a mapping in mapping table between DWORD ID and pointer associated Arguments: DWORD ID - and ID to which mapping should be deleted. Return Value: DWORD - an ID associated with a given pointer . Starts from 1. Zero indicates a failure to craete mapping. --*/ PVOID CIdToPointerMapper::FindMapping (DWORD id) { PVOID retVal = NULL; if (m_fInitialized) { id--; MD_ASSERT (id < m_nStartMaps); if (id < m_nStartMaps && m_Map[id].fInUse) { retVal = m_Map[id].pData; } } return retVal; } /*++ Routine Description: Deletes a mapping from mapping table between dword ID and PTR Arguments: DWORD ID - and ID to which mapping should be deleted. Return Value: BOOL TRUE is succeded --*/ BOOL CIdToPointerMapper::DeleteMapping (DWORD id) { BOOL retVal = FALSE; if (m_fInitialized) { id--; MD_ASSERT (id < m_nStartMaps); if (id < m_nStartMaps) { MD_ASSERT (m_Map[id].fInUse); // get the ptr from element with index [id] if (m_Map[id].fInUse) { // add elemen to empty elements list m_Map[id].fInUse = FALSE; m_Map[id].dwIndex = m_EmptyPlace; m_EmptyPlace = id; MD_ASSERT(m_nMappings); m_nMappings--; retVal = TRUE; } } } return retVal; } /*++ Routine Description: Takes a PVOID pointer and returns a DWORD ID associated,which should be used in mapping it back to ptr Arguments: PVOID ptr - a pointer of 32/64 bits which should be mapped into dword Return Value: DWORD - an ID associated with a given pointer . Starts from 1. Zero indicates a failure to craete mapping. --*/ DWORD CIdToPointerMapper::AddMapping (PVOID ptr) { DWORD retVal=0; DWORD newSize, i, dwPlace; if (m_fInitialized) { if (m_EmptyPlace == MAPPING_NO_EMPTY_PLACE_IDX) { // case when there is not enough mem , so then try to realloc newSize = m_nStartMaps + m_nIncreaseMaps; if (!m_pBufferObj->Resize(newSize * sizeof(MapperElement))) { return 0; } m_Map = (MapperElement *) m_pBufferObj->QueryPtr(); // realloc succeded initialize the remainder as free list for (i=m_nStartMaps; i