Changeset 10903 for branches/jch-memory/psLib/src/sys/psMemory.c
- Timestamp:
- Jan 4, 2007, 12:34:06 PM (19 years ago)
- File:
-
- 1 edited
-
branches/jch-memory/psLib/src/sys/psMemory.c (modified) (17 diffs)
Legend:
- Unmodified
- Added
- Removed
-
branches/jch-memory/psLib/src/sys/psMemory.c
r10902 r10903 9 9 * @author Joshua Hoblitt, University of Hawaii 10 10 * 11 * @version $Revision: 1.88.2.1 2$ $Name: not supported by cvs2svn $12 * @date $Date: 2007-01-04 2 1:55:39$11 * @version $Revision: 1.88.2.13 $ $Name: not supported by cvs2svn $ 12 * @date $Date: 2007-01-04 22:34:06 $ 13 13 * 14 14 * Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii … … 72 72 fprintf(stderr, "\n"); 73 73 74 #define PS_MEM_ABORT_CORRUPT(ptr) \ 75 PS_MEM_ABORT(file, "Memory corruption detected in block %lu, allocated at %s (%s:%d) by thread id %lu", \ 76 (unsigned long)ptr->id, \ 77 ptr->func, \ 78 ptr->file, \ 79 ptr->lineno,\ 80 ptr->tid); 81 82 static bool badMemBlock(const psMemBlock *memBlock); 74 #define HANDLE_BAD_BLOCK(memBlock) \ 75 if (badMemBlock(stderr, memBlock)) { \ 76 psMemBlockPrint(stderr, memBlock); \ 77 PS_MEM_ABORT(__func__, "Unsafe to Continue"); \ 78 } 79 80 static bool badMemBlock(FILE *output, const psMemBlock *memBlock); 83 81 84 82 // pointer to the last mem block that was allocated … … 151 149 * N.b. If the block wasn't allocated by psAlloc, it will appear corrupted 152 150 */ 153 static bool badMemBlock( const psMemBlock *memBlock)151 static bool badMemBlock(FILE *output, const psMemBlock *memBlock) 154 152 { 155 153 // n.b. since this is called by psMemCheckCorruption while the memblock … … 160 158 // as they make be changed out from underneath us by new memory allocation 161 159 if (memBlock == NULL) { 162 PS_MEM_ERROR(PS_ERR_MEMORY_CORRUPTION, true, 163 _("NULL memory block found.")); 160 fprintf(output, _("NULL memory block found.")); 164 161 return true; 165 162 } … … 167 164 if (memBlock->refCounter == 0) { 168 165 // using an unreferenced block of memory, are you? 169 PS_MEM_ERROR(PS_ERR_MEMORY_CORRUPTION, true, 170 _("Memory block %lu was freed but still being used."), 171 (unsigned long)memBlock->id); 166 fprintf(output, _("Memory block was freed but still being used.")); 172 167 return true; 173 168 } 174 169 175 170 if (memBlock->startblock != P_PS_MEMMAGIC || memBlock->endblock != P_PS_MEMMAGIC) { 176 PS_MEM_ERROR(PS_ERR_MEMORY_CORRUPTION, true, 177 _("Memory block %lu is corrupted; buffer underflow detected."), 178 (unsigned long)memBlock->id); 171 fprintf(output, _("Memory block is corrupted; buffer underflow detected.")); 179 172 return true; 180 173 } 181 174 if (*(psPtr *)((int8_t *) (memBlock + 1) + memBlock->userMemorySize) != P_PS_MEMMAGIC) { 182 PS_MEM_ERROR(PS_ERR_MEMORY_CORRUPTION, true, 183 _("Memory block %lu is corrupted; buffer overflow detected."), 184 (unsigned long)memBlock->id); 175 fprintf(output, 176 _("Memory block is corrupted; buffer overflow detected.")); 185 177 return true; 186 178 } … … 197 189 { 198 190 static psMemId incr = 10; // "p_psMemAllocID += incr" 199 bool abort_on_error = false; 200 201 if (psMemCheckCorruption(stderr, abort_on_error) > 0) { 191 192 if (psMemCheckCorruption(stderr, false) > 0) { 202 193 fprintf(stderr, "Detected memory corruption\n"); // somewhere to set a breakpoint 203 194 } … … 324 315 int psMemCheckCorruption(FILE *output, bool abort_on_error) 325 316 { 326 psS32 nbad = 0; // number of bad blocks327 328 317 // get exclusive access to the memBlock list to avoid it changing on us 329 318 // while we use it. 330 319 MUTEX_LOCK(&memBlockListMutex); 331 320 321 psS32 nbad = 0; // number of bad blocks 332 322 for (psMemBlock *memBlock = lastMemBlockAllocated; memBlock != NULL; memBlock = memBlock->nextBlock) { 333 if (badMemBlock( memBlock)) {323 if (badMemBlock(output, memBlock)) { 334 324 nbad++; 335 325 336 fprintf(output, 337 "Memory corruption detected in memBlock %lu\n" 338 "\tSize %zd\n" 339 "\tPosts: %p %p %p\n" 340 "\tAllocated at %s (%s:%d) by thread %lu\n", 341 memBlock->id, 342 memBlock->userMemorySize, 343 memBlock->startblock, memBlock->endblock, (memBlock + 1 + memBlock->userMemorySize), 344 memBlock->func, memBlock->file, memBlock->lineno, memBlock->tid); 326 psMemBlockPrint(output, memBlock); 345 327 346 328 if (abort_on_error) { … … 461 443 psMemBlock *memBlock = ((psMemBlock *)ptr) - 1; 462 444 463 if (badMemBlock(memBlock)) { 464 PS_MEM_ABORT(file, "Memory corruption detected in block %lu, allocated at %s (%s:%d) by thread id %lu", 465 (unsigned long)memBlock->id, 466 memBlock->func, 467 memBlock->file, 468 memBlock->lineno, 469 memBlock->tid); 470 } 445 HANDLE_BAD_BLOCK(memBlock); 471 446 472 447 if (size == memBlock->userMemorySize) { … … 483 458 if (memBlock == NULL) { 484 459 MUTEX_UNLOCK(&memBlockListMutex); 485 PS_MEM_ABORT(__func__, "Failed to reallocate %zd bytes at %s (%s:%d)", size, func, file, lineno); 460 fprintf(stderr, "Problem reallocating block\n"); 461 psMemBlockPrint(stderr, ((psMemBlock *)ptr) - 1); 462 PS_MEM_ABORT(__func__, "Failed to reallocate to %zd bytes at %s (%s:%d)", size, func, file, lineno); 486 463 } 487 464 } … … 586 563 psMemBlock *memBlock = ((psMemBlock *) ptr) - 1; 587 564 588 if (badMemBlock(memBlock)) { 589 PS_MEM_ABORT_CORRUPT(memBlock); 590 } 565 HANDLE_BAD_BLOCK(memBlock); 591 566 592 567 return memBlock->refCounter; … … 604 579 psMemBlock* memBlock = ((psMemBlock *) ptr) - 1; 605 580 606 if (badMemBlock(memBlock)) { 607 PS_MEM_ABORT_CORRUPT(memBlock); 608 } 581 HANDLE_BAD_BLOCK(memBlock); 609 582 610 583 memBlock->refCounter++; … … 664 637 psMemBlock *memBlock = ((psMemBlock *) ptr) - 1; 665 638 666 if (badMemBlock(memBlock)) { 667 PS_MEM_ABORT_CORRUPT(memBlock); 668 return NULL; 669 } 639 HANDLE_BAD_BLOCK(memBlock); 670 640 671 641 if (memBlock->refCounter < 1) { … … 732 702 psMemBlock* memBlock = ((psMemBlock *)ptr) - 1; 733 703 734 if (badMemBlock(memBlock)) { 735 PS_MEM_ABORT_CORRUPT(memBlock); 736 } 704 HANDLE_BAD_BLOCK(memBlock); 737 705 738 706 memBlock->freeFunc = freeFunc; … … 747 715 psMemBlock* memBlock = ((psMemBlock *)ptr) - 1; 748 716 749 if (badMemBlock(memBlock)) { 750 PS_MEM_ABORT_CORRUPT(memBlock); 751 } 717 HANDLE_BAD_BLOCK(memBlock); 752 718 753 719 return memBlock->freeFunc; … … 1025 991 psMemBlock* memBlock = ((psMemBlock *) ptr) - 1; 1026 992 1027 if (badMemBlock(memBlock)) { 1028 PS_MEM_ABORT_CORRUPT(memBlock); 1029 } 993 HANDLE_BAD_BLOCK(memBlock); 1030 994 1031 995 return memBlock->persistent; … … 1041 1005 psMemBlock* memBlock = ((psMemBlock *) ptr) - 1; 1042 1006 1043 if (badMemBlock(memBlock)) { 1044 PS_MEM_ABORT_CORRUPT(memBlock); 1045 } 1007 HANDLE_BAD_BLOCK(memBlock); 1046 1008 1047 1009 memBlock->persistent = value; … … 1110 1072 "\tPrevious Block: %p Next Block: %p\n" 1111 1073 "\tFree function: %p\n" 1112 "\tSize: %zd Reference count: %lu \nPersistent: %s\n"1074 "\tSize: %zd Reference count: %lu Persistent: %s\n" 1113 1075 "\tPosts: %p %p %p\n" 1114 "\tAllocated at %s (%s:%d) by thread %lu\n", 1076 "\tAllocated in %s at (%s:%d)\n" 1077 "\t\tby Thread ID %lu\n", 1115 1078 memBlock->id, 1116 1079 memBlock->previousBlock, memBlock->nextBlock,
Note:
See TracChangeset
for help on using the changeset viewer.
