MEMMON)
that specified the file for monitoring outputMEMMON can be defined to be a pipe, so that
storage management can be visualized while the program being monitor is
running
...
StrLen(ts) = slen;
StrLoc(ts) = s;
if (!collect(Strings, slen))
return NULL;
s = StrLoc(ts);
}
MMStr(slen); /* string allocation */
strtotal += slen;
...
struct region *rp = NULL;
if (DiffPtrs(blkend, blkfree) < nbytes) {
if (!collect(Blocks, nbytes))
return NULL;
}
MMAlc((word)nbytes, t_code); /* block allocation */
...
if (InRange(blkbase, block, blkfree)) {
type = BlkType(block);
if ((uword)type <= MaxType) {
endblock = block + BlkSize(block);
MMMark(block, (int)type); /* block marked */
}
## Icon MemMon output # # program: ./rsg # date: Fri May 18 09:35:34 1990 4< 155484:68160/68160 223680:0/46080 269760:0/92160 2+4524F4528+2048A6578+256A6836+202A7040+10000X 0" > = 155484:68160/68160 223680:0/46080 269760:0/92160 5L23lL21l16T10h7eL9lLl80+7%rteLlLl115+%rteLlLl150+%rteLlLl185+%rteLlLl 220+%rte6RLlLl255+%rteRLlLl296+%rteRLlLl337+%rtLl2478+2048A41"5ueL23l10c LlcRccRccRccRccc397+%rt35"ueLlcLlcRccRccRccc599+%rt32"ueLlcLlcRccRccRc cc775+%rt148"ueLlcLlccc951+%rt46"ueLlcLlcRcRcRcRcRcRcRcc1059+%rt50"ueL lcLlcccLlcccLlcccLlcccLlccc1269+%rt56"ueLlcLlcccLlcccLlcccLlcccLlccc1609+%rt 84"ueLlcLlcccLlcccLlcccLlcccLlcccLlcccLlcccLlcccLlcclc1949+%rt64"ueLlc LlccRccLlccRccLlccRccLlccRccRcc2544+%rt62"ueLlcLlcccLlcccLlcccLlcccLlc ccLlccc2916+%rt34"ueLlcLlcccLlcccLlccc3314+%rt28"ueLlcLlcRccRcc3538+%rt 17"ueLlcLlcccLlccc3678+%rt54"ueLlcLlcccLlcccLlcccLlcccLlcccLlcccLlcccL lccc3844+%rt37"ueLlcLlcccLlcccLlcccLlccc4358+%rt8"uRL9lL21lL7lL9lL19l0" 138"L9lL17l1"L19lL15lL9lL25l18"1"L9lL21l8"2"L11lL17l4"L9lL17l7"1"L9lL13l "L19lL11lL9lL21l5"1"L9lL17l3"1"L9lL13l9"1"L9lLl"LlL7l"428+ARL9lL21lL7l L9lL19l0"138"L9lL17l1"L19lL15lL9lL25l3"1"L9lL21l7"2"L15lL17l6"L9lL21l9" 1"L9lL17l6"1"L9lL13l"L19lL11lL9lL21l11"1"L9lL17l18"1"L9lL13l6"1"L9lLl" LlL7l"RL9lL21lL7lL9lL19l0"138"L9lL17l1"L19lL15lL9lL25l7"1"L9lL21l9"2"L 11lL17l4"L9lL17l6"1"L9lL13l"L19lL11lL9lL21l11"1"L9lL17l7"1"L9lL13l6"1" L9lLl"LlL7l"RL9lL21lL7lL9lL19l0"138"L9lL17l1"L19lL15lL9lL25l18"1"L9lL21l 6"2"L15lL17l6"L9lL21l9"1"L9lL17l11"1"L9lL13l"L19lL11lL9lL21l7"1"L9lL17l
just prior to garbage collection:

data to be saved highlighted:

data to be discarded highlighted:

saved data compacted:

global uses, lineno, width
procedure main(args)
local word, line
width := 15 # width of word field
uses := table("")
lineno := 0
every tabulate(words()) # tabulate all the citations
output() # print the citations
end
...
procedure tabulate(word)
if uses[word][-2 -:*lineno] == lineno then return
else {
uses[word] ||:= lineno || ", " # new line number
return
}
end
procedure output()
local word
write()
uses := sort(uses,3) # sort citations
while word := get(uses) do
write(left(word, width), get(uses)[1:-2])
end
...
procedure tabulate(word)
if /uses[word] := [lineno] then return
else {
if uses[word][-1] ~= lineno then put(uses[word] ,lineno)
return
}
end
...
procedure output()
local word, line, numbers
write()
uses := sort(uses,3) # sort citations
while word := get(uses) do {
line := ""
numbers := get(uses)
while line ||:= get(numbers) || ", "
write(left(word, width), line[1:-2])
}
end
procedure tabulate(word)
/uses[word] := set()
insert(uses[word], lineno)
return
end
...
procedure output()
local word, line, numbers
write()
uses := sort(uses,3)
while word := get(uses) do {
line := ""
numbers := sort(get(uses))
while line ||:= get(numbers) || ", "
write(left(word, width), line[1:-2])
}
end
procedure tabulate(word)
/uses[word] := table()
uses[word][lineno] := 1
return
end
...
procedure output()
local word, line, numbers
write()
uses := sort(uses,3)
while word := get(uses) do {
line := ""
numbers := sort(get(uses),3)
while line ||:= get(numbers) || ", " do
get(numbers)
write(left(word,width), line[1:-2])
}
end