- Timestamp:
- Jul 6, 2001, 3:47:19 PM (24 years ago)
- Location:
- trunk/src/kernel32
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/kernel32/heap.cpp
r6176 r6184 1 /* $Id: heap.cpp,v 1.2 8 2001-07-05 18:10:08 sandervl Exp $ */1 /* $Id: heap.cpp,v 1.29 2001-07-06 13:47:18 sandervl Exp $ */ 2 2 3 3 /* … … 202 202 #define HANDLE_TO_INTERN(h) ((PGLOBAL32_INTERN)(((char *)(h))-2)) 203 203 #define INTERN_TO_HANDLE(i) ((HGLOBAL) &((i)->Pointer)) 204 #define POINTER_TO_HANDLE(p) (*(((HGLOBAL *)(p))-1))205 204 #define ISHANDLE(h) (((DWORD)(h)&2)!=0) 206 205 #define ISPOINTER(h) (((DWORD)(h)&2)==0) 206 207 //SvL: -2 for 8 byte alignment 208 #define POINTER_TO_HANDLE(p) (*(((HGLOBAL *)(p))-2)) 209 #define HGLOBAL_SIZE 2*sizeof(HGLOBAL) 207 210 208 211 #pragma pack(1) … … 251 254 if(size) 252 255 { 253 if (!(palloc=HeapAlloc(GetProcessHeap(), hpflags, size+sizeof(HGLOBAL)))) { 256 //SvL: 2*sizeof for 8 byte alignment 257 if (!(palloc=HeapAlloc(GetProcessHeap(), hpflags, size+HGLOBAL_SIZE))) { 254 258 HeapFree(GetProcessHeap(), 0, pintern); 255 259 return 0; 256 260 } 257 261 *(HGLOBAL *)palloc=INTERN_TO_HANDLE(pintern); 258 pintern->Pointer=(char *) palloc+sizeof(HGLOBAL); 262 //SvL: 2*sizeof for 8 byte alignment 263 pintern->Pointer=(char *) palloc+HGLOBAL_SIZE; 259 264 } 260 265 else … … 283 288 284 289 285 if( ISPOINTER(hmem)) {290 if(hmem == NULL || ISPOINTER(hmem)) { 286 291 dprintf(("KERNEL32: GlobalLock %x returned %x", hmem, hmem)); 287 292 return (LPVOID) hmem; … … 324 329 dprintf(("KERNEL32: GlobalUnlock %x", hmem)); 325 330 326 if( ISPOINTER(hmem))331 if(hmem == NULL || ISPOINTER(hmem)) 327 332 return FALSE; 328 333 … … 396 401 if (maybe_intern->Magic == MAGIC_GLOBAL_USED) { 397 402 test = maybe_intern->Pointer; 398 if (HeapValidate( GetProcessHeap(), 0, ((HGLOBAL *)test)-1 ) && /* obj(-handle) valid arena? */ 403 //SvL: -2 for 8 byte alignment 404 if (HeapValidate( GetProcessHeap(), 0, ((HGLOBAL *)test)-2 ) && /* obj(-handle) valid arena? */ 399 405 HeapValidate( GetProcessHeap(), 0, maybe_intern )) /* intern valid arena? */ 400 406 { … … 520 526 { 521 527 if((palloc = HeapReAlloc(GetProcessHeap(), heap_flags, 522 (char *) pintern->Pointer- sizeof(HGLOBAL),523 size+ sizeof(HGLOBAL))) == NULL)528 (char *) pintern->Pointer-HGLOBAL_SIZE, 529 size+HGLOBAL_SIZE)) == NULL) 524 530 return 0; /* Block still valid */ 525 pintern->Pointer=(char *) palloc+ sizeof(HGLOBAL);531 pintern->Pointer=(char *) palloc+HGLOBAL_SIZE; 526 532 } 527 533 else 528 534 { 529 if((palloc=HeapAlloc(GetProcessHeap(), heap_flags, size+ sizeof(HGLOBAL)))535 if((palloc=HeapAlloc(GetProcessHeap(), heap_flags, size+HGLOBAL_SIZE)) 530 536 == NULL) 531 537 return 0; 532 538 *(HGLOBAL *)palloc=hmem; 533 pintern->Pointer=(char *) palloc+ sizeof(HGLOBAL);539 pintern->Pointer=(char *) palloc+HGLOBAL_SIZE; 534 540 } 535 541 } … … 538 544 if(pintern->Pointer) 539 545 { 540 HeapFree(GetProcessHeap(), 0, (char *) pintern->Pointer- sizeof(HGLOBAL));546 HeapFree(GetProcessHeap(), 0, (char *) pintern->Pointer-HGLOBAL_SIZE); 541 547 pintern->Pointer=NULL; 542 548 } … … 581 587 582 588 if(pintern->Pointer) 583 if(!HeapFree(GetProcessHeap(), 0, (char *)(pintern->Pointer)- sizeof(HGLOBAL)))589 if(!HeapFree(GetProcessHeap(), 0, (char *)(pintern->Pointer)-HGLOBAL_SIZE)) 584 590 hreturned=hmem; 585 591 if(!HeapFree(GetProcessHeap(), 0, pintern)) … … 620 626 return 0; 621 627 retval=HeapSize(GetProcessHeap(), 0, 622 (char *)(pintern->Pointer)-sizeof(HGLOBAL))-4; 623 if (retval == 0xffffffff-4) retval = 0; 628 (char *)(pintern->Pointer)-HGLOBAL_SIZE)-HGLOBAL_SIZE; 629 //SvL: ??? 630 if (retval == 0xffffffff-HGLOBAL_SIZE) retval = 0; 624 631 } 625 632 else … … 632 639 /* HeapSize returns 0xffffffff on failure */ 633 640 if (retval == 0xffffffff) retval = 0; 641 dprintf(("KERNEL32: GlobalSize %x = %d", hmem, retval)); 634 642 return retval; 635 643 } … … 929 937 HLOCAL WIN32API LocalReAlloc(HLOCAL hMem, DWORD cbBytes, UINT fuFlags) 930 938 { 931 HLOCAL hLocalNew ;932 LPVOID lpMem ;939 HLOCAL hLocalNew, hLocalOld; 940 LPVOID lpMem, lpMemOld; 933 941 DWORD cbOldSize; 934 942 935 dprintf(("KERNEL32: LocalReAlloc %X %d %X\n", hMem, cbBytes, fuFlags));943 dprintf(("KERNEL32: LocalReAlloc %X %d %X\n", hMem, cbBytes, fuFlags)); 936 944 937 945 // Check flags … … 949 957 return hMem; 950 958 951 hLocalNew = LocalAlloc(fuFlags, cbBytes); 952 if(hLocalNew != 0) 953 { 954 lpMem = LocalLock(hLocalNew); 955 956 if (lpMem != NULL) /* copy memory if successful */ 957 memcpy(lpMem, (LPVOID)hMem, min(cbBytes, cbOldSize)); 958 959 LocalUnlock(hLocalNew); 960 LocalFree(hMem); 961 } 962 return(hLocalNew); 959 return GlobalReAlloc(hMem, cbBytes, fuFlags); 963 960 } 964 961 //****************************************************************************** -
trunk/src/kernel32/os2heap.cpp
r6080 r6184 1 /* $Id: os2heap.cpp,v 1.1 8 2001-06-23 08:43:17sandervl Exp $ */1 /* $Id: os2heap.cpp,v 1.19 2001-07-06 13:47:19 sandervl Exp $ */ 2 2 3 3 /* … … 93 93 while(heapelem) { 94 94 hnext = heapelem->next; 95 free(heapelem );95 free(heapelem->lpMem); 96 96 heapelem = hnext; 97 97 } … … 122 122 LPVOID OS2Heap::Alloc(DWORD dwFlags, DWORD dwBytes) 123 123 { 124 LPVOID lpMem; 124 HEAPELEM *lpHeapObj; 125 LPVOID lpMem; 125 126 126 127 // dprintf(("OS2Heap::Alloc\n")); 127 128 lpMem = malloc(dwBytes + HEAP_OVERHEAD); 128 129 if(lpMem == NULL) { 129 dprintf(("OS2Heap::Alloc, lpMem == NULL"));130 return(NULL);130 dprintf(("OS2Heap::Alloc, lpMem == NULL")); 131 return(NULL); 131 132 } 132 133 if(dwFlags & HEAP_ZERO_MEMORY) { 133 memset((char *)lpMem, 0, dwBytes+HEAP_OVERHEAD);134 memset(lpMem, 0, dwBytes+HEAP_OVERHEAD); 134 135 } 135 136 totalAlloc += dwBytes; 136 137 138 //align at 8 byte boundary 139 lpHeapObj = (HEAPELEM *)(((ULONG)lpMem+7) & ~7); 140 lpHeapObj->lpMem = lpMem; 141 137 142 if(hmutex) 138 hmutex->enter(); 139 143 hmutex->enter(); 144 145 lpHeapObj->next = heapelem; 146 lpHeapObj->prev = NULL; 147 lpHeapObj->magic = MAGIC_NR_HEAP; 140 148 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; 157 152 158 153 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); 269 157 } 270 158 //****************************************************************************** … … 272 160 DWORD OS2Heap::Size(DWORD dwFlags, PVOID lpMem) 273 161 { 274 HEAPELEM *helem = (HEAPELEM *)((char *)lpMem - sizeof(HEAPELEM));162 HEAPELEM *helem = GET_HEAPOBJ(lpMem); 275 163 276 164 if(lpMem == NULL) { … … 291 179 } 292 180 293 return(_msize( (char *)lpMem - sizeof(HEAPELEM)) - HEAP_OVERHEAD);181 return(_msize(helem->lpMem) - HEAP_OVERHEAD); 294 182 } 295 183 //****************************************************************************** … … 297 185 LPVOID OS2Heap::ReAlloc(DWORD dwFlags, LPVOID lpMem, DWORD dwBytes) 298 186 { 299 HEAPELEM *helem = (HEAPELEM *)((char *)lpMem - sizeof(HEAPELEM));187 HEAPELEM *helem = GET_HEAPOBJ(lpMem); 300 188 LPVOID lpNewMem; 301 189 int i, oldSize; … … 334 222 BOOL OS2Heap::Free(DWORD dwFlags, LPVOID lpMem) 335 223 { 336 HEAPELEM *helem = (HEAPELEM *)((char *)lpMem - sizeof(HEAPELEM));224 HEAPELEM *helem = GET_HEAPOBJ(lpMem); 337 225 338 226 if(lpMem == NULL) { … … 372 260 } 373 261 374 free( (void *)helem);262 free(helem->lpMem); 375 263 return(TRUE); 376 264 } -
trunk/src/kernel32/os2heap.h
r1118 r6184 1 /* $Id: os2heap.h,v 1. 4 1999-10-04 09:55:57sandervl Exp $ */1 /* $Id: os2heap.h,v 1.5 2001-07-06 13:47:19 sandervl Exp $ */ 2 2 3 3 /* … … 18 18 19 19 #define MAGIC_NR_HEAP 0x87654321 20 //must be a multiple of 8 bytes (alignment) 20 21 typedef struct _tagHEAPELEM { 21 22 DWORD magic; //magic number 23 LPVOID lpMem; //pointer returned by malloc 22 24 struct _tagHEAPELEM *prev; 23 25 struct _tagHEAPELEM *next; 24 DWORD flags; //set by LocalAlloc only25 DWORD lockCnt; //LocalLock/Unlock26 26 } HEAPELEM; 27 27 28 #define HEAP_OVERHEAD (sizeof(HEAPELEM)+60) 29 //#define HEAP_OVERHEAD sizeof(HEAPELEM) 28 //extra overhead needed for quake 2 or 3 (a long time ago...) 29 //#define HEAP_OVERHEAD (sizeof(HEAPELEM)+60) 30 //+8 to make sure we can align the pointer at 8 byte boundary 31 #define HEAP_OVERHEAD (sizeof(HEAPELEM)+8) 32 33 #define GET_HEAPOBJ(ptr) (HEAPELEM *)((char *)ptr - sizeof(HEAPELEM)); 30 34 31 35 class OS2Heap … … 44 48 BOOL Validate(DWORD dwFlags, LPCVOID lpMem); 45 49 BOOL Walk(void *lpEntry); 46 47 LPVOID Alloc(DWORD dwFlags, DWORD dwBytes, DWORD LocalAllocFlags);48 BOOL Lock(LPVOID lpMem);49 BOOL Unlock(LPVOID lpMem);50 int GetLockCnt(LPVOID lpMem);51 DWORD GetFlags(LPVOID lpMem);52 50 53 51 static OS2Heap *find(HANDLE hHeap);
Note:
See TracChangeset
for help on using the changeset viewer.