[Oberon] PO2013 - Show Heap Blocks

Joerg joerg.straube at iaeth.ch
Fri Jun 19 17:23:04 CEST 2020


John

Seems like variadic but it is not.
printf() has fix 4 arguments as I found out that this is enough for most cases. the first is the string with formatting commands, then two INTEGERs and one string (for a filename or so)

If after a % there is a number, d, h or s it’s interpreted as argument else it’s just a %.

br
Jörg

> Am 19.06.2020 um 16:56 schrieb John R. Strohm <strohm at airmail.net>:
> 
> Out.printf(), with VARIADIC arguments, in Oberon???
> 
> And that %d%) bothers me, for some reason...
> 
> --- joerg.straube at iaeth.ch wrote:
> 
> From: Jörg <joerg.straube at iaeth.ch>
> To: ETH Oberon and related systems <oberon at lists.inf.ethz.ch>
> Subject: Re: [Oberon] PO2013 - Show Heap Blocks
> Date: Fri, 19 Jun 2020 10:37:08 +0200
> 
> Tomas
> 
> The following line will give you the stats as well:
>  Out.printf(“Heap space used: %d bytes (=%d%)\n“,
>    Kernel.allocated,
>    Kernel.allocated * 100 DIV (Kernel.heapLim - Kernel.heapOrg), ““);
> 
> That‘s basically what System.Watch does.
> 
> br
> Jörg
> 
> 
>> Am 19.06.2020 um 10:12 schrieb Tomas Kral <thomas.kral at email.cz>:
>> 
>> Hi,
>> 
>> This is my understanding so far, it stats the heap.
>> It also shows free block last to the limit, because heap ends 16 bytes
>> earlier, so is not MOD 32.
>> 
>> MODULE Heap; (*TK 14.6.2020 show heap blocks*)
>> IMPORT S := SYSTEM, Kernel, Out;
>> 
>> VAR heapOrg, MemLim, heapLim: INTEGER;
>> 
>> PROCEDURE Scan*;
>>   VAR p, q, mark, tag, size, used, free: LONGINT;
>> BEGIN p := heapOrg; used := 0; free := 0;
>>   Out.Hex(heapOrg); Out.Ln; (*60000H 4-bit colour display*)
>>   Out.Hex(heapLim); Out.Ln; (*9FEF0H*)
>>   REPEAT S.GET(p+4, mark); q := p; (*mark: 0 used, -1 freed, >0 marked*)
>>     IF mark = -1 THEN S.GET(p, size)
>>     ELSE S.GET(p, tag); S.GET(tag, size); (*size := p - q*) END ;
>>     IF (size MOD 32 # 0) & (size MOD 64 # 0) & (size MOD 128 # 0) & (size MOD 256 # 0) THEN
>>       Out.Hex(p); Out.Hex(size); Out.Hex(mark); Out.Ln (*free block to 9FEF0H*)
>>     END ;
>>     IF mark > 0 THEN INC(used, size) (*none after kernel scan*)
>>     ELSIF mark = 0 THEN INC(used, size) 
>>     ELSIF mark = -1 THEN INC(free, size) END ;
>>     INC(p, size)
>>   UNTIL p >= heapLim(*-30000H*) ;
>>   Out.Int(used, 8); (*value*) Out.Int(used*100 DIV free, 3); (*percentage*)
>>   Out.Hex(free+used); Out.Ln (*3FEF0 = 9FEF0H-60000H, or less if fragmented*)
>> END Scan;
>> 
>> PROCEDURE Lists*;
>>   VAR p, list0, list1, list2, list3: INTEGER;
>> BEGIN
>>   p := S.ADR(Kernel.MemLim);
>>   S.GET(p+8, list0);
>>   S.GET(p+12, list1);
>>   S.GET(p+16, list2);
>>   S.GET(p+20, list3);
>>   Out.Hex(list3); Out.Hex(list2); Out.Hex(list1); Out.Hex(list0); Out.Ln
>> END Lists;
>> 
>> BEGIN S.GET(12, MemLim); S.GET(24, heapOrg); heapLim := MemLim
>> END Heap.
>> 
>> Heap.Scan
>> Heap.Lists
>> 
>> 
>> -- 
>> Tomas Kral <thomas.kral at email.cz>
>> --
>> Oberon at lists.inf.ethz.ch mailing list for ETH Oberon and related systems
>> https://lists.inf.ethz.ch/mailman/listinfo/oberon
> 
> --
> Oberon at lists.inf.ethz.ch mailing list for ETH Oberon and related systems
> https://lists.inf.ethz.ch/mailman/listinfo/oberon
> 
> 
> --
> Oberon at lists.inf.ethz.ch mailing list for ETH Oberon and related systems
> https://lists.inf.ethz.ch/mailman/listinfo/oberon



More information about the Oberon mailing list