Ignore:
Timestamp:
Jul 6, 2001, 3:47:19 PM (24 years ago)
Author:
sandervl
Message:

heap updates/fixes

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/kernel32/os2heap.cpp

    r6080 r6184  
    1 /* $Id: os2heap.cpp,v 1.18 2001-06-23 08:43:17 sandervl Exp $ */
     1/* $Id: os2heap.cpp,v 1.19 2001-07-06 13:47:19 sandervl Exp $ */
    22
    33/*
     
    9393  while(heapelem) {
    9494    hnext = heapelem->next;
    95     free(heapelem);
     95    free(heapelem->lpMem);
    9696    heapelem = hnext;
    9797  }
     
    122122LPVOID OS2Heap::Alloc(DWORD dwFlags, DWORD dwBytes)
    123123{
    124  LPVOID lpMem;
     124 HEAPELEM *lpHeapObj;
     125 LPVOID    lpMem;
    125126
    126127//  dprintf(("OS2Heap::Alloc\n"));
    127128  lpMem = malloc(dwBytes + HEAP_OVERHEAD);
    128129  if(lpMem == NULL) {
    129     dprintf(("OS2Heap::Alloc, lpMem == NULL"));
    130     return(NULL);
     130      dprintf(("OS2Heap::Alloc, lpMem == NULL"));
     131      return(NULL);
    131132  }
    132133  if(dwFlags & HEAP_ZERO_MEMORY) {
    133     memset((char *)lpMem, 0, dwBytes+HEAP_OVERHEAD);
     134      memset(lpMem, 0, dwBytes+HEAP_OVERHEAD);
    134135  }
    135136  totalAlloc += dwBytes;
    136137
     138  //align at 8 byte boundary
     139  lpHeapObj = (HEAPELEM *)(((ULONG)lpMem+7) & ~7);
     140  lpHeapObj->lpMem = lpMem;
     141
    137142  if(hmutex)
    138     hmutex->enter();
    139 
     143      hmutex->enter();
     144
     145  lpHeapObj->next    = heapelem;
     146  lpHeapObj->prev    = NULL;
     147  lpHeapObj->magic   = MAGIC_NR_HEAP;
    140148  if(heapelem) {
    141    HEAPELEM *hnext;
    142 
    143     hnext = heapelem;
    144 
    145     heapelem       = (HEAPELEM *)lpMem;
    146     hnext->prev    = heapelem;
    147     heapelem->next = hnext;
    148   }
    149   else {
    150     heapelem = (HEAPELEM *)lpMem;
    151     heapelem->next = NULL;
    152   }
    153   heapelem->prev    = NULL;
    154   heapelem->flags   = 0;    //only used when allocated with LocalAlloc
    155   heapelem->lockCnt = 0;    //..    ..
    156   heapelem->magic   = MAGIC_NR_HEAP;
     149      heapelem->prev = lpHeapObj;
     150  }
     151  heapelem           = lpHeapObj;
    157152
    158153  if(hmutex) {
    159     hmutex->leave();
    160   }
    161   return(LPVOID)((char *)lpMem+sizeof(HEAPELEM));
    162 }
    163 //******************************************************************************
    164 //******************************************************************************
    165 LPVOID OS2Heap::Alloc(DWORD dwFlags, DWORD dwBytes, DWORD LocalAllocFlags)
    166 {
    167  HEAPELEM *helem;
    168  LPVOID    lpMem = Alloc(dwFlags, dwBytes);
    169 
    170   if(lpMem == NULL)
    171     return(NULL);
    172 
    173   helem = (HEAPELEM *)((char *)lpMem - sizeof(HEAPELEM));
    174   helem->flags   = LocalAllocFlags;
    175   return(lpMem);
    176 }
    177 //******************************************************************************
    178 //******************************************************************************
    179 BOOL OS2Heap::Lock(LPVOID lpMem)
    180 {
    181  HEAPELEM *helem = (HEAPELEM *)((char *)lpMem - sizeof(HEAPELEM));
    182 
    183   if((ULONG)lpMem > ADDRESS_SPACE_LIMIT) {
    184         //SvL: Some apps lock and unlock gdi handles; just ignore this here
    185         dprintf(("Lock: invalid address %x", lpMem));
    186         return FALSE;
    187   }
    188 
    189   if(lpMem == NULL)
    190         return(FALSE);
    191 
    192   if(helem->magic != MAGIC_NR_HEAP)
    193   {
    194         dprintf(("OS2Heap::Lock ERROR BAD HEAP POINTER:%X\n", lpMem));
    195         return FALSE;
    196   }
    197 
    198   helem->lockCnt++;
    199 
    200   return(TRUE);
    201 }
    202 //******************************************************************************
    203 //******************************************************************************
    204 BOOL OS2Heap::Unlock(LPVOID lpMem)
    205 {
    206  HEAPELEM *helem = (HEAPELEM *)((char *)lpMem - sizeof(HEAPELEM));
    207 
    208   if((ULONG)lpMem > ADDRESS_SPACE_LIMIT) {
    209         //SvL: Some apps lock and unlock gdi handles; just ignore this here
    210         dprintf(("Unlock: invalid address %x", lpMem));
    211         return FALSE;
    212   }
    213 
    214   if(lpMem == NULL)
    215     return(FALSE);
    216 
    217   if(helem->lockCnt == 0)
    218     return(FALSE);
    219 
    220   if(helem->magic != MAGIC_NR_HEAP)
    221   {
    222     dprintf(("OS2Heap::UnLock ERROR BAD HEAP POINTER:%X\n", lpMem));
    223     return FALSE;
    224   }
    225 
    226   helem->lockCnt--;
    227 
    228   return(TRUE);
    229 }
    230 //******************************************************************************
    231 //******************************************************************************
    232 DWORD OS2Heap::GetFlags(LPVOID lpMem)
    233 {
    234  HEAPELEM *helem = (HEAPELEM *)((char *)lpMem - sizeof(HEAPELEM));
    235 
    236   if(lpMem == NULL)
    237     return(0);
    238 
    239   if(helem->magic != MAGIC_NR_HEAP)
    240   {
    241     dprintf(("OS2Heap::GetFlags ERROR BAD HEAP POINTER:%X\n", lpMem));
    242     return 0;
    243   }
    244 
    245   return(helem->lockCnt | (helem->flags << 8));
    246 }
    247 //******************************************************************************
    248 //******************************************************************************
    249 int OS2Heap::GetLockCnt(LPVOID lpMem)
    250 {
    251  HEAPELEM *helem = (HEAPELEM *)((char *)lpMem - sizeof(HEAPELEM));
    252 
    253   if((ULONG)lpMem > ADDRESS_SPACE_LIMIT) {
    254         //SvL: Some apps lock and unlock gdi handles; just ignore this here
    255         dprintf(("GetLockCnt: invalid address %x", lpMem));
    256         return FALSE;
    257   }
    258 
    259   if(lpMem == NULL)
    260         return(0);
    261 
    262   if(helem->magic != MAGIC_NR_HEAP)
    263   {
    264         dprintf(("OS2Heap::GetLockCnt ERROR BAD HEAP POINTER:%X\n", lpMem));
    265         return 0;
    266   }
    267 
    268   return(helem->lockCnt);
     154      hmutex->leave();
     155  }
     156  return(LPVOID)(lpHeapObj+1);
    269157}
    270158//******************************************************************************
     
    272160DWORD OS2Heap::Size(DWORD dwFlags, PVOID lpMem)
    273161{
    274  HEAPELEM *helem = (HEAPELEM *)((char *)lpMem - sizeof(HEAPELEM));
     162 HEAPELEM *helem = GET_HEAPOBJ(lpMem);
    275163
    276164  if(lpMem == NULL) {
     
    291179  }
    292180
    293   return(_msize((char *)lpMem - sizeof(HEAPELEM)) - HEAP_OVERHEAD);
     181  return(_msize(helem->lpMem) - HEAP_OVERHEAD);
    294182}
    295183//******************************************************************************
     
    297185LPVOID OS2Heap::ReAlloc(DWORD dwFlags, LPVOID lpMem, DWORD dwBytes)
    298186{
    299   HEAPELEM *helem = (HEAPELEM *)((char *)lpMem - sizeof(HEAPELEM));
     187  HEAPELEM *helem = GET_HEAPOBJ(lpMem);
    300188  LPVOID lpNewMem;
    301189  int    i, oldSize;
     
    334222BOOL OS2Heap::Free(DWORD dwFlags, LPVOID lpMem)
    335223{
    336  HEAPELEM *helem = (HEAPELEM *)((char *)lpMem - sizeof(HEAPELEM));
     224  HEAPELEM *helem = GET_HEAPOBJ(lpMem);
    337225
    338226  if(lpMem == NULL) {
     
    372260  }
    373261
    374   free((void *)helem);
     262  free(helem->lpMem);
    375263  return(TRUE);
    376264}
Note: See TracChangeset for help on using the changeset viewer.