2005-02-14 21:58:07 -05:00
|
|
|
! Copyright (C) 2004, 2005 Slava Pestov.
|
|
|
|
! See http://factor.sf.net/license.txt for BSD license.
|
|
|
|
IN: memory
|
2005-09-11 20:46:55 -04:00
|
|
|
USING: arrays errors generic hashtables io kernel
|
|
|
|
kernel-internals lists math namespaces parser prettyprint
|
|
|
|
sequences strings unparser vectors words ;
|
2004-11-25 21:53:27 -05:00
|
|
|
|
2005-09-24 15:21:17 -04:00
|
|
|
: generations ( -- n ) 15 getenv ;
|
2005-05-12 01:02:39 -04:00
|
|
|
|
2005-09-24 15:21:17 -04:00
|
|
|
: full-gc ( -- ) generations 1 - gc ;
|
|
|
|
|
|
|
|
: image ( -- path )
|
|
|
|
#! Current image name.
|
|
|
|
16 getenv ;
|
2005-05-12 01:02:39 -04:00
|
|
|
|
2005-04-30 14:27:40 -04:00
|
|
|
: save
|
|
|
|
#! Save the current image.
|
2005-09-24 15:21:17 -04:00
|
|
|
image save-image ;
|
2005-05-11 00:43:52 -04:00
|
|
|
|
2005-02-18 19:02:06 -05:00
|
|
|
! Printing an overview of heap usage.
|
|
|
|
|
2005-08-21 20:50:14 -04:00
|
|
|
: kb.
|
|
|
|
1024 /i number>string
|
|
|
|
6 CHAR: \s pad-left write
|
|
|
|
" KB" write ;
|
2004-11-25 21:53:27 -05:00
|
|
|
|
2005-02-14 21:58:07 -05:00
|
|
|
: (room.) ( free total -- )
|
|
|
|
2dup swap - swap ( free used total )
|
|
|
|
kb. " total " write
|
|
|
|
kb. " used " write
|
|
|
|
kb. " free" print ;
|
|
|
|
|
|
|
|
: room. ( -- )
|
|
|
|
room
|
2005-05-11 00:43:52 -04:00
|
|
|
0 swap [
|
2005-08-21 20:50:14 -04:00
|
|
|
"Generation " write over pprint ":" write
|
2005-09-16 22:47:28 -04:00
|
|
|
uncons (room.) 1+
|
2005-05-11 00:43:52 -04:00
|
|
|
] each drop
|
2005-05-11 00:52:27 -04:00
|
|
|
"Semi-space: " write kb. terpri
|
|
|
|
"Cards: " write kb. terpri
|
|
|
|
"Code space: " write (room.) ;
|
2004-11-25 21:53:27 -05:00
|
|
|
|
2005-02-18 19:02:06 -05:00
|
|
|
! Some words for iterating through the heap.
|
2005-02-14 21:58:07 -05:00
|
|
|
|
2005-08-19 21:46:12 -04:00
|
|
|
: (each-object) ( quot -- )
|
2005-09-14 00:37:50 -04:00
|
|
|
next-object dup
|
2005-09-24 15:21:17 -04:00
|
|
|
[ swap [ call ] keep (each-object) ] [ 2drop ] if ; inline
|
2005-08-19 21:46:12 -04:00
|
|
|
|
2005-02-17 22:49:19 -05:00
|
|
|
: each-object ( quot -- )
|
2005-09-14 00:37:50 -04:00
|
|
|
#! Applies the quotation to each object in the image.
|
2005-09-21 01:12:16 -04:00
|
|
|
[ begin-scan [ (each-object) ] keep ]
|
|
|
|
[ end-scan ] cleanup drop ; inline
|
2005-02-17 22:49:19 -05:00
|
|
|
|
2005-11-12 00:37:24 -05:00
|
|
|
: (instances) ( obj quot seq -- )
|
|
|
|
>r over >r call [ r> r> push ] [ r> r> 2drop ] if ; inline
|
|
|
|
|
2005-10-01 01:44:49 -04:00
|
|
|
: instances ( quot -- seq )
|
2005-11-12 00:37:24 -05:00
|
|
|
#! Return a vector of all objects that return true when the
|
2005-02-20 20:38:24 -05:00
|
|
|
#! quotation is applied to them.
|
2005-11-12 00:37:24 -05:00
|
|
|
10000 <vector> [
|
|
|
|
-rot [ (instances) ] 2keep
|
|
|
|
] each-object nip ; inline
|
2005-02-18 19:02:06 -05:00
|
|
|
|
2005-08-15 03:25:39 -04:00
|
|
|
G: each-slot ( obj quot -- )
|
2005-08-22 15:33:18 -04:00
|
|
|
[ over ] standard-combination ; inline
|
2005-02-20 19:03:37 -05:00
|
|
|
|
2005-07-25 17:13:35 -04:00
|
|
|
M: array each-slot ( array quot -- ) each ;
|
2005-02-20 19:03:37 -05:00
|
|
|
|
2005-07-25 17:13:35 -04:00
|
|
|
M: object each-slot ( obj quot -- )
|
|
|
|
over class "slots" word-prop [
|
|
|
|
-rot [ >r swap first slot r> call ] 2keep
|
2005-02-20 19:03:37 -05:00
|
|
|
] each 2drop ;
|
|
|
|
|
|
|
|
: refers? ( to obj -- ? )
|
|
|
|
f swap [ pick eq? or ] each-slot nip ;
|
|
|
|
|
|
|
|
: references ( obj -- list )
|
|
|
|
#! Return a list of all objects that refer to a given object
|
2005-04-25 03:33:33 -04:00
|
|
|
#! in the image. If only one reference exists, find
|
|
|
|
#! something referencing that, and so on.
|
2005-02-20 20:38:24 -05:00
|
|
|
[ dupd refers? ] instances nip ;
|
2005-02-20 19:03:37 -05:00
|
|
|
|
2005-04-12 13:35:27 -04:00
|
|
|
: seq+ ( n index vector -- )
|
|
|
|
[ nth + ] 2keep set-nth ;
|
2005-02-18 20:37:01 -05:00
|
|
|
|
|
|
|
: heap-stat-step ( counts sizes obj -- )
|
2005-04-12 13:35:27 -04:00
|
|
|
[ dup size swap type rot seq+ ] keep
|
|
|
|
1 swap type rot seq+ ;
|
2005-02-18 20:37:01 -05:00
|
|
|
|
2005-07-24 22:59:23 -04:00
|
|
|
: heap-stats ( -- counts sizes )
|
2005-02-18 20:37:01 -05:00
|
|
|
#! Return a list of instance count/total size pairs.
|
2005-09-11 20:46:55 -04:00
|
|
|
num-types zero-array num-types zero-array
|
2005-07-24 22:59:23 -04:00
|
|
|
[ >r 2dup r> heap-stat-step ] each-object ;
|
2005-02-18 20:37:01 -05:00
|
|
|
|
2005-10-29 23:25:38 -04:00
|
|
|
: heap-stat. ( { instances bytes type } -- )
|
2005-09-14 00:37:50 -04:00
|
|
|
dup first 0 = [
|
|
|
|
dup third type>class pprint ": " write
|
|
|
|
dup second pprint " bytes, " write
|
|
|
|
dup first pprint " instances" print
|
|
|
|
] unless drop ;
|
2005-02-18 19:02:06 -05:00
|
|
|
|
|
|
|
: heap-stats. ( -- )
|
|
|
|
#! Print heap allocation breakdown.
|
2005-09-14 00:37:50 -04:00
|
|
|
heap-stats dup length 3array flip [ heap-stat. ] each ;
|