123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154 |
- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- %%% "SysLisp" part of the HEAP-STATS package.
- %%%
- %%% Author: Cris Perdue
- %%% December 1982
- %%% Documented January 1983
- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- on SysLisp;
- compiletime <<
- put('igetv,'assign!-op,'iputv);
- >>;
- %%% Magic constants defining the layout of a "heap-stats" object.
- compiletime <<
- Internal WConst TemplateX = 2,
- StringTabX = 3,
- StringSpaceX = 4,
- VectTabX = 5,
- VectSpaceX = 6,
- WordTabX = 7,
- WordSpaceX = 8,
- Pairs = 9,
- Strings = 10,
- HalfWords = 11,
- WordVecs = 12,
- Vectors = 13;
- >>;
- %%% This procedure sweeps the heap and collects statistics into
- %%% its argument, which is a heap-stats object. This routine may
- %%% be called as part of a garbage collection, so it may not do
- %%% any allocation whatsoever from the heap. Moderate size
- %%% integers are assumed to have in effect no tag.
- syslsp procedure HeapStats(Results);
- begin
- scalar CurrentItem,
- ObjLen,
- Last,
- HistoSize,
- StdTemplate,
- StringHTab,
- StringSpaceTab,
- VectHTab,
- VectSpaceTab,
- WordHTab,
- WordSpaceTab,
- Len;
- %% Check that the argument looks reasonable.
- if neq(isizev(Results), 13) then
- return nil;
- StdTemplate := igetv(Results,TemplateX);
- StringHTab := igetv(Results,StringTabX);
- StringSpaceTab := igetv(Results,StringSpaceX);
- VectHTab := igetv(Results,VectTabX);
- VectSpaceTab := igetv(Results,VectSpaceX);
- WordHTab := igetv(Results,WordTabX);
- WordSpaceTab := igetv(Results,WordSpaceX);
- %% Check the various subobjects of the argument to see that
- %% they look reasonable. The returns are all errors effectively.
- HistoSize := isizev(StdTemplate) + 1;
- if neq(isizev(StringHTab),HistoSize) then return 1;
- if neq(isizev(StringSpaceTab),HistoSize) then return 2;
- if neq(isizev(VectHTab),HistoSize) then return 3;
- if neq(isizev(VectSpaceTab),HistoSize) then return 4;
- if neq(isizev(WordHTab),HistoSize) then return 5;
- if neq(isizev(WordSpaceTab),HistoSize) then return 6;
- igetv(Results,Pairs) := 0;
- igetv(Results,Strings) := 0;
- igetv(Results,HalfWords) := 0;
- igetv(Results,WordVecs) := 0;
- igetv(Results,Vectors) := 0;
- FillVector(StringHTab,0);
- FillVector(StringSpaceTab,0);
- FillVector(VectHTab,0);
- FillVector(VectSpaceTab,0);
- FillVector(WordHTab,0);
- FillVector(WordSpaceTab,0);
- Last := HeapLast();
- CurrentItem := HeapLowerBound();
- while CurrentItem < Last do
- begin
- case Tag @CurrentItem of
- BTRTAG, CODE, NEGINT, POSINT, ID, UNBOUND,
- STR, BYTES, FIXN, FLTN, BIGN, WRDS, Halfwords, PAIR, VECT, EVECT:
- << ObjLen := 2; % must be first of pair
- igetv(Results,Pairs) := igetv(Results,Pairs) + 1;
- >>;
- HBYTES:
- << Len := StrLen CurrentItem;
- ObjLen := 1 + StrPack Len;
- igetv(Results,Strings) := igetv(Results,Strings) + 1;
- Histo(StdTemplate,StringHTab,Len+1,StringSpaceTab,ObjLen);
- >>;
- HHalfwords:
- << ObjLen := 1 + HalfWordPack HalfWordLen CurrentItem;
- igetv(Results,HalfWords) := igetv(Results,HalfWords) + 1;
- >>;
- HWRDS:
- << Len := WrdLen CurrentItem;
- ObjLen := 1 + WrdPack Len;
- igetv(Results,WordVecs) := igetv(Results,WordVecs) + 1;
- Histo(StdTemplate,WordHTab,Len+1,WordSpaceTab,ObjLen);
- >>;
- HVECT:
- << Len := VecLen CurrentItem;
- ObjLen := 1 + VectPack Len;
- igetv(Results,Vectors) := igetv(Results,Vectors) + 1;
- Histo(StdTemplate,VectHTab,Len+1,VectSpaceTab,ObjLen);
- >>;
- default:
- Error(0,"Illegal item in heap at %o", CurrentItem);
- end; % case
- CurrentItem := CurrentItem + ObjLen;
- end;
- Results;
- end;
- %%% Internal utility routine used by heapstats to accumulate
- %%% values into the statistics tables. The template is a
- %%% histogram template. The table is a histogram table. The
- %%% "value" is tallied into the appropriate bucket of the table
- %%% based on the template. Spacetab is similar to "table", but
- %%% the value of "space" will be added rather than tallied into
- %%% spacetab.
- Syslsp procedure Histo(Template,Table,Value,SpaceTab,Space);
- begin
- for i := 0 step 1 until isizev(Template) do
- if igetv(Template,i) >= Value then
- << igetv(Table,i) := igetv(Table,i) + 1;
- igetv(SpaceTab,i) := igetv(SpaceTab,i) + Space;
- return;
- >>;
- if Value > igetv(Template,isizev(Template)) then
- << igetv(Table,isizev(Template)+1)
- := igetv(Table,isizev(Template)+1) + 1;
- igetv(SpaceTab,isizev(Template)+1)
- := igetv(SpaceTab,isizev(Template)+1) + Space;
- >>;
- end;
- SysLsp procedure FillVector(v,k);
- for i := 0 step 1 until isizev(v) do
- igetv(v,i) := k;
|