[Oberon] PO2013 - Show Heap Blocks

Joerg joerg.straube at iaeth.ch
Tue Jun 23 11:32:26 CEST 2020


Tomas

Making a drawing might help.

For your drawing, assume the following declarations were done:
TYPE
  FreeBlock = POINTER TO BlockInfo;
  BlockInfo = RECORD
    size: INTEGER;   (* 0 *)
    mark: INTEGER; (* 4 *)
    next: FreeBlock (* 8 *)
  END;
VAR
  list0, list1, list2, list3: FreeBlock;

1) draw the states if all listX immediatly after Init() is called
2) draw the states of all listX during the first call to New() with size 32. When analyzing this step you will see that ALL lists will be modified somehow...

br
Jörg

> Am 23.06.2020 um 11:47 schrieb Paul Reed <paulreed at paddedcell.com>:
> 
> Hi Tomas,
> 
>> Trying to read heap allocation code...
>> list3 points to the last free 32-block, it is a chain of 32-blocks
>> going back to HeapOrg(60000H)
> 
> Each free list is a chain of blocks that is terminated with a next pointer of NIL (ie a singly-linked list).
> 
> (The block at Kernel.heapOrg [80000H in the published system] may be allocated, not free, so that's not what terminates the list.)
> 
> 
>> I do not see yet, which part of the code terminates the list with 0,
>> where, when?
> 
> In Kernel.Init, the lists are each initialised to NIL.
> 
> Each free block which is added to the list is added at the front (head) of the list, and its next pointer points to the rest of the list (which may be NIL).
> 
> It is possible to add items onto a singly-linked list at the other end (tail), if you keep a note of the tail, but if the order doesn't matter, it's not necessary.
> 
> HTH
> Paul
> --
> 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