Changeset 6184 for trunk/src/kernel32/os2heap.cpp
- Timestamp:
- Jul 6, 2001, 3:47:19 PM (24 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
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 }
Note:
See TracChangeset
for help on using the changeset viewer.