Changeset View
Changeset View
Standalone View
Standalone View
intern/guardedalloc/intern/mallocn_guarded_impl.c
| Show First 20 Lines • Show All 729 Lines • ▼ Show 20 Lines | |||||
| { | { | ||||
| MemHead *membl; | MemHead *membl; | ||||
| MemPrintBlock *pb, *printblock; | MemPrintBlock *pb, *printblock; | ||||
| unsigned int totpb, a, b; | unsigned int totpb, a, b; | ||||
| size_t mem_in_use_slop = 0; | size_t mem_in_use_slop = 0; | ||||
| mem_lock_thread(); | mem_lock_thread(); | ||||
| if (totblock != 0) { | |||||
| /* put memory blocks into array */ | /* put memory blocks into array */ | ||||
| printblock = malloc(sizeof(MemPrintBlock) * totblock); | printblock = malloc(sizeof(MemPrintBlock) * totblock); | ||||
| if (UNLIKELY(!printblock)) { | |||||
| mem_unlock_thread(); | |||||
| print_error("malloc returned null while generating stats"); | |||||
| return; | |||||
| } | |||||
| } | |||||
| else { | |||||
| printblock = NULL; | |||||
| } | |||||
| pb = printblock; | pb = printblock; | ||||
| totpb = 0; | totpb = 0; | ||||
| membl = membase->first; | membl = membase->first; | ||||
| if (membl) | if (membl) | ||||
| membl = MEMNEXT(membl); | membl = MEMNEXT(membl); | ||||
| while (membl) { | while (membl && pb) { | ||||
| pb->name = membl->name; | pb->name = membl->name; | ||||
| pb->len = membl->len; | pb->len = membl->len; | ||||
| pb->items = 1; | pb->items = 1; | ||||
| totpb++; | totpb++; | ||||
| pb++; | pb++; | ||||
| #ifdef USE_MALLOC_USABLE_SIZE | #ifdef USE_MALLOC_USABLE_SIZE | ||||
| if (!membl->mmap && membl->alignment == 0) { | if (!membl->mmap && membl->alignment == 0) { | ||||
| mem_in_use_slop += (sizeof(MemHead) + sizeof(MemTail) + malloc_usable_size((void *)membl)) - | mem_in_use_slop += (sizeof(MemHead) + sizeof(MemTail) + malloc_usable_size((void *)membl)) - | ||||
| membl->len; | membl->len; | ||||
| } | } | ||||
| #endif | #endif | ||||
| if (membl->next) | if (membl->next) | ||||
| membl = MEMNEXT(membl->next); | membl = MEMNEXT(membl->next); | ||||
| else | else | ||||
| break; | break; | ||||
| } | } | ||||
| /* sort by name and add together blocks with the same name */ | /* sort by name and add together blocks with the same name */ | ||||
| if (totpb > 1) { | |||||
| qsort(printblock, totpb, sizeof(MemPrintBlock), compare_name); | qsort(printblock, totpb, sizeof(MemPrintBlock), compare_name); | ||||
| } | |||||
| for (a = 0, b = 0; a < totpb; a++) { | for (a = 0, b = 0; a < totpb; a++) { | ||||
| if (a == b) { | if (a == b) { | ||||
| continue; | continue; | ||||
| } | } | ||||
| else if (strcmp(printblock[a].name, printblock[b].name) == 0) { | else if (strcmp(printblock[a].name, printblock[b].name) == 0) { | ||||
| printblock[b].len += printblock[a].len; | printblock[b].len += printblock[a].len; | ||||
| printblock[b].items++; | printblock[b].items++; | ||||
| } | } | ||||
| else { | else { | ||||
| b++; | b++; | ||||
| memcpy(&printblock[b], &printblock[a], sizeof(MemPrintBlock)); | memcpy(&printblock[b], &printblock[a], sizeof(MemPrintBlock)); | ||||
| } | } | ||||
| } | } | ||||
| totpb = b + 1; | totpb = b + 1; | ||||
| /* sort by length and print */ | /* sort by length and print */ | ||||
| if (totpb > 1) { | |||||
| qsort(printblock, totpb, sizeof(MemPrintBlock), compare_len); | qsort(printblock, totpb, sizeof(MemPrintBlock), compare_len); | ||||
| } | |||||
| printf("\ntotal memory len: %.3f MB\n", (double)mem_in_use / (double)(1024 * 1024)); | printf("\ntotal memory len: %.3f MB\n", (double)mem_in_use / (double)(1024 * 1024)); | ||||
| printf("peak memory len: %.3f MB\n", (double)peak_mem / (double)(1024 * 1024)); | printf("peak memory len: %.3f MB\n", (double)peak_mem / (double)(1024 * 1024)); | ||||
| printf("slop memory len: %.3f MB\n", (double)mem_in_use_slop / (double)(1024 * 1024)); | printf("slop memory len: %.3f MB\n", (double)mem_in_use_slop / (double)(1024 * 1024)); | ||||
| printf(" ITEMS TOTAL-MiB AVERAGE-KiB TYPE\n"); | printf(" ITEMS TOTAL-MiB AVERAGE-KiB TYPE\n"); | ||||
| for (a = 0, pb = printblock; a < totpb; a++, pb++) { | for (a = 0, pb = printblock; a < totpb; a++, pb++) { | ||||
| printf("%6d (%8.3f %8.3f) %s\n", | printf("%6d (%8.3f %8.3f) %s\n", | ||||
| pb->items, | pb->items, | ||||
| (double)pb->len / (double)(1024 * 1024), | (double)pb->len / (double)(1024 * 1024), | ||||
| (double)pb->len / 1024.0 / (double)pb->items, | (double)pb->len / 1024.0 / (double)pb->items, | ||||
| pb->name); | pb->name); | ||||
| } | } | ||||
| if (printblock != NULL) { | |||||
| free(printblock); | free(printblock); | ||||
| } | |||||
| mem_unlock_thread(); | mem_unlock_thread(); | ||||
| #ifdef HAVE_MALLOC_STATS | #ifdef HAVE_MALLOC_STATS | ||||
| printf("System Statistics:\n"); | printf("System Statistics:\n"); | ||||
| malloc_stats(); | malloc_stats(); | ||||
| #endif | #endif | ||||
| } | } | ||||
| ▲ Show 20 Lines • Show All 480 Lines • Show Last 20 Lines | |||||