Files
TempleOS-Rijn/LT/Utils/HeapLog.APZ
T
2018-09-08 21:45:20 +02:00

130 lines
3.0 KiB
Plaintext

#help_index "Debugging"
class HeapLogStruct
{
HeapLogStruct *next,*last;
U1 *add;
U1 *caller1;
U1 *caller2;
U1 *caller3;
U1 *caller4;
};
class HeapLogHashStruct
{
HeapLogStruct *next,*last;
};
#define HEAPLOG_HASH_SIZE 0x1000
TssStruct *heaplog_tss=NULL,heaplog_test_tss;
HeapLogHashStruct *heaplog_root;
void HeapLogTsk()
{
while (TRUE)
SwapInNext;
}
void HeapLogMAlloc(U1 *add)
{
HeapLogStruct *temph;
U8 i,old_flags;
BoolU4 old_val;
if (Fs==heaplog_test_tss) {
old_val=LBtr(&sys_semas[SYS_SEMA_HEAPLOG],0);
temph=MAlloc(sizeof(HeapLogStruct),heaplog_tss);
LAssignBit(&sys_semas[SYS_SEMA_HEAPLOG],0,old_val);
temph->add=add;
temph->caller1=Caller(2);
temph->caller2=Caller(3);
temph->caller3=Caller(4);
temph->caller4=Caller(5);
i=(add>>2)&(HEAPLOG_HASH_SIZE-1);
old_flags=GetFlags;
Cli;
InsQue(temph,heaplog_root[i].last);
SetFlags(old_flags);
}
}
void HeapLogFree(U1 *add)
{
U8 i,old_flags;
HeapLogStruct *temph;
BoolU4 old_val;
if (!add) return;
if (Fs==heaplog_test_tss) {
i=(add>>2)&(HEAPLOG_HASH_SIZE-1);
old_flags=GetFlags;
Cli;
temph=heaplog_root[i].next;
while (temph!=&heaplog_root[i]) {
if (add==temph->add) {
RemQue(temph);
SetFlags(old_flags);
old_val=LBtr(&sys_semas[SYS_SEMA_HEAPLOG],0);
Free(temph,heaplog_tss);
LAssignBit(&sys_semas[SYS_SEMA_HEAPLOG],0,old_val);
return;
}
temph=temph->next;
}
SetFlags(old_flags);
}
}
public void HeapLogRep()
{
U8 i,total=0;
HeapLogStruct *temph;
BoolU4 old_val=LBtr(&sys_semas[SYS_SEMA_HEAPLOG],0);
for (i=0;i<HEAPLOG_HASH_SIZE;i++) {
temph=heaplog_root[i].next;
while (temph!=&heaplog_root[i]) {
PrintF("$$FG,RED$$%08X$$FG$$ %P %P %P %P\r\n",MSize(temph->add),
temph->caller1,temph->caller2,temph->caller3,
temph->caller4);
total+=MSize(temph->add);
temph=temph->next;
}
}
LAssignBit(&sys_semas[SYS_SEMA_HEAPLOG],0,old_val);
PrintF("\r\n$$FG,LTRED$$Total:%08X$$FG$$\r\n",total);
}
public void HeapLog(BoolU4 val=TRUE,TssStruct *tss=NULL)
{
U8 i;
if (val) {
if (Bt(&sys_semas[SYS_SEMA_HEAPLOG],0))
coutln "HeapLog Already Active";
else {
if (!tss) tss=Fs;
heaplog_test_tss=tss;
heaplog_tss=Spawn(&HeapLogTsk);
ext[EXT_HEAPLOG_MALLOC]=&HeapLogMAlloc;
ext[EXT_HEAPLOG_FREE]=&HeapLogFree;
heaplog_root=MAlloc(sizeof(HeapLogHashStruct)*HEAPLOG_HASH_SIZE);
for (i=0;i<HEAPLOG_HASH_SIZE;i++) {
heaplog_root[i].next=&heaplog_root[i];
heaplog_root[i].last=&heaplog_root[i];
}
LBts(&sys_semas[SYS_SEMA_HEAPLOG],0);
}
} else {
if (!LBtr(&sys_semas[SYS_SEMA_HEAPLOG],0))
coutln "HeapLog Not Active";
else {
Kill(heaplog_tss);
heaplog_tss=NULL;
Free(heaplog_root);
ext[EXT_HEAPLOG_MALLOC]=NULL;
ext[EXT_HEAPLOG_FREE]=NULL;
}
}
}
#help_index ""