From 2359e54661a4266cbd0d153ec1658f699dfac0ad Mon Sep 17 00:00:00 2001 From: dzaima Date: Wed, 8 Jun 2022 15:24:09 +0300 Subject: [PATCH] a bit saner heap format --- src/load.c | 3 +++ src/opt/mm_buddyTemplate.c | 14 ++++---------- src/utils/file.c | 14 ++++++++++---- src/utils/file.h | 2 +- 4 files changed, 18 insertions(+), 15 deletions(-) diff --git a/src/load.c b/src/load.c index bd5c3d03..aab27eb3 100644 --- a/src/load.c +++ b/src/load.c @@ -488,6 +488,9 @@ B bqn_execFile(B path, B args) { // consumes both } void bqn_exit(i32 code) { + #ifdef DUMP_ON_EXIT + cbqn_heapDump(); + #endif rtWrap_print(); CTR_FOR(CTR_PRINT) print_allocStats(); diff --git a/src/opt/mm_buddyTemplate.c b/src/opt/mm_buddyTemplate.c index 57266044..4cfbc3fd 100644 --- a/src/opt/mm_buddyTemplate.c +++ b/src/opt/mm_buddyTemplate.c @@ -102,21 +102,15 @@ void BN(forFreedHeap)(V2v f) { #define str0(X) #X #define str1(X) str0(X) +void writeNum(FILE* f, u64 v, i32 len); void BN(dumpHeap)(FILE* f) { for (u64 i = 0; i < alSize; i++) { AllocInfo ci = al[i]; u64 addrI = (u64) ci.p; + writeNum(f, ci.sz, 8); + writeNum(f, addrI, 8); char* prefix = str1(BN()); - u64 vals[3]; - vals[0] = ci.sz; - vals[1] = addrI; - vals[2] = strlen(prefix)-1; - for (i32 i = 0; i < 3; i++) { - u8 buf[8]; - for (i32 j = 0; j < 8; j++) buf[j] = (vals[i]>>(8*j)) & 0xff; - fwrite(&buf, 1, 8, f); - } - fwrite(prefix, 1, vals[2], f); + fwrite(prefix, 1, strlen(prefix)+1, f); fwrite(ci.p, 1, ci.sz, f); } fflush(f); diff --git a/src/utils/file.c b/src/utils/file.c index 27ac52f9..f2eea274 100644 --- a/src/utils/file.c +++ b/src/utils/file.c @@ -351,6 +351,11 @@ char path_type(B path) { thrM("Unexpected file type"); } void mmX_dumpHeap(FILE* f); +void writeNum(FILE* f, u64 v, i32 len) { + u8 buf[8]; + for (i32 i = 0; i < len; i++) buf[i] = (v>>(8*i)) & 0xff; + fwrite(buf, 1, len, f); +} void cbqn_heapDump() { char* name = "CBQNHeapDump"; FILE* f = fopen(name, "w"); @@ -359,12 +364,13 @@ void cbqn_heapDump() { return; } // fwrite(&size, 8, 1, f); - u8 t8 = 0; + u8 t8 = 1; fwrite(&t8, 1, 1, f); // version + fwrite("CBQN", 1, 5, f); - // sizeof(ur), sizeof(usz) - u8 urW[4]; for (i32 i = 0; i < 4; i++) urW[i] = (sizeof(ur )>>(8*i)) & 0xff; fwrite( &urW, 1, 4, f); - u8 uszW[4]; for (i32 i = 0; i < 4; i++) uszW[i] = (sizeof(usz)>>(8*i)) & 0xff; fwrite(&uszW, 1, 4, f); + writeNum(f, sizeof(ur ), 4); + writeNum(f, sizeof(usz), 4); + writeNum(f, getpid(), 8); // t_names #define F(X) { t8=t_##X; fwrite(&t8, 1, 1, f); char* s = #X; fwrite(s, 1, strlen(s)+1, f); } diff --git a/src/utils/file.h b/src/utils/file.h index 1bf1281a..a5cdad9f 100644 --- a/src/utils/file.h +++ b/src/utils/file.h @@ -24,4 +24,4 @@ void file_wBytes(FILE* file, B name, B x); // doesn't consume B path_list(B path); // consumes char path_type(B path); // consumes -void cbqn_heapDump(); +void cbqn_heapDump(void);