]> gitweb.factorcode.org Git - factor.git/commitdiff
Fix room.
authorslava <slava@factorcode.org>
Tue, 26 Sep 2006 05:08:05 +0000 (05:08 +0000)
committerslava <slava@factorcode.org>
Tue, 26 Sep 2006 05:08:05 +0000 (05:08 +0000)
12 files changed:
TODO.FACTOR.txt
library/bootstrap/primitives.factor
library/compiler/inference/known-words.factor
library/tools/memory.factor
library/tools/memory.facts
vm/compiler.c
vm/compiler.h
vm/heap.c
vm/heap.h
vm/memory.c
vm/memory.h
vm/primitives.c

index bd0c37c77ea4cc55a6380769442d953f2ac82d59..1ddc5dab1e0ad741e0928324c1748532c0096bca 100644 (file)
@@ -3,9 +3,8 @@
 - signal 4 on datastack underflow on mac intel??
 - test alien-indirect
 - code GC:
-  - get code heap load/save working
-  - get room. working
-  - compact the heap on save
+  - discard the free block at the end of the code heap on save
+  - minor GC takes too long now
 
 + ui:
 
index d869b7d4cb4ac146ea104dbc05a57a93abbf347a..3f3c9eb53f057a145d3b1307eee09af1c01c4c7c 100644 (file)
@@ -133,7 +133,8 @@ call
     { "set-retainstack" "kernel"            }
     { "set-callstack" "kernel"              }
     { "exit" "kernel"                       }
-    { "room" "memory"                       }
+    { "data-room" "memory"                  }
+    { "code-room" "memory"                  }
     { "os-env" "kernel"                     }
     { "millis" "kernel"                     }
     { "type" "kernel"                       }
index 70ebdaa8c8a559e6c0fcbebfd6a405870d87870d..d9405239b8decabe76aa2cfd3f515756153820d9 100644 (file)
@@ -239,7 +239,8 @@ t over set-effect-terminated?
 \ gc-time { } { integer } <effect> "infer-effect" set-word-prop
 \ save-image { string } { } <effect> "infer-effect" set-word-prop
 \ exit { integer } { } <effect> "infer-effect" set-word-prop
-\ room { } { integer integer integer integer array } <effect> "infer-effect" set-word-prop
+\ data-room { } { integer integer array } <effect> "infer-effect" set-word-prop
+\ code-room { } { integer integer } <effect> "infer-effect" set-word-prop
 \ os-env { string } { object } <effect> "infer-effect" set-word-prop
 \ millis { } { integer } <effect> "infer-effect" set-word-prop
 
index bb6de3e6df032e15f0b67f0d1f32856eab8fb7be..1098f153e268446213a53a50822224c0572af013 100644 (file)
@@ -26,15 +26,15 @@ strings styles vectors words ;
     tabular-output ;
 
 : room. ( -- )
-    room [
+    [
         { "" "Total" "Used" "Free" } ,
-        0 [
+        data-room 0 [
             "Generation " pick number>string append
             >r first2 r> total/used/free, 1+
         ] reduce drop
         "Semi-space" total,
         "Cards" total,
-        "Code space" total/used/free,
+        code-room "Code space" total/used/free,
     ] { } make simple-table ;
 
 ! Some words for iterating through the heap.
index e9ee8ee10d05f3552fa7ebdbe100f3e0fdb93112..86758291e03b2b96992ba09dd7b258265c202dcf 100644 (file)
@@ -10,9 +10,15 @@ HELP: gc-time ( -- n )
 { $description "Outputs the total time spent in garbage collection during this Factor session." }
 { $examples "This word is used by " { $link time } " to measure the time spent in garbage collection during the execution of a quotation." } ;
 
-HELP: room ( -- code-free code-total cards semi generations )
-{ $values { "code-free" "bytes free in the code heap" } { "code-total" "total bytes in the code heap" } { "cards" "number of bytes reserved for card marking" } { "semi" "number of bytes reserved for tenured semi-space" } { "generations" "array of free/total bytes pairs" } }
-{ $description "Queries the runtime for memory usage information. To see this in a human-readable form, call " { $link room. } " instead." } ;
+HELP: data-room ( -- cards semi generations )
+{ $values { "cards" "number of bytes reserved for card marking" } { "semi" "number of bytes reserved for tenured semi-space" } { "generations" "array of free/total bytes pairs" } }
+{ $description "Queries the runtime for memory usage information. Use " { $link room. } " for a pretty memory usage display." }
+{ $see-also code-room } ;
+
+HELP: code-room ( -- code-free code-total )
+{ $values { "code-free" "bytes free in the code heap" } { "code-total" "total bytes in the code heap" } }
+{ $description "Queries the runtime for memory usage information. Use " { $link room. } " for a pretty memory usage display." }
+{ $see-also data-room } ;
 
 HELP: size ( obj -- n )
 { $values { "obj" "an object" } { "n" "a size in bytes" } }
index c7786c39e4cdbedf13bff6c270b92d40f4cebb00..3fc8ad561519e3b0deb4e4554ff6439892644c76 100644 (file)
@@ -290,3 +290,9 @@ void primitive_finalize_compile(void)
        iterate_code_heap(finalize_code_block);
        flush_icache(compiling.base,compiling.limit - compiling.base);
 }
+
+void primitive_code_room(void)
+{
+       box_unsigned_cell(heap_free_space(&compiling));
+       box_unsigned_cell(compiling.limit - compiling.base);
+}
index f1b8ac558d6eb8d7414bf71752a37a691cdd1422..300dc05cee1e7e289ff928e597915e07b6c9f9e1 100644 (file)
@@ -58,14 +58,10 @@ typedef struct {
 
 void relocate_code_block(F_COMPILED *relocating, CELL code_start,
        CELL reloc_start, CELL literal_start, CELL words_start);
-
 void finalize_code_block(F_COMPILED *relocating, CELL code_start,
        CELL reloc_start, CELL literal_start, CELL words_start);
-
 void collect_literals(void);
-
 void init_compiler(CELL size);
-
 void primitive_add_compiled_block(void);
-
 void primitive_finalize_compile(void);
+void primitive_code_room(void);
index 732c74016cc470508b3ce9e76d14398400680ef9..e07ddeead3547ea6276f7cbe7981ab67de5c5e2f 100644 (file)
--- a/vm/heap.c
+++ b/vm/heap.c
@@ -132,3 +132,18 @@ void free_unmarked(HEAP *heap)
        if(prev)
                prev->next_free = NULL;
 }
+
+CELL heap_free_space(HEAP *heap)
+{
+       CELL size = 0;
+       F_BLOCK *scan = (F_BLOCK *)heap->base;
+
+       while(scan)
+       {
+               if(scan->status == B_FREE)
+                       size += scan->size;
+               scan = next_block(heap,scan);
+       }
+
+       return size;
+}
index 56cb03a2ca01fbc4ae962310b5dc3e63c2a28d26..06dc330739ab2ab34411f8f6a1ec9bd8d4329480 100644 (file)
--- a/vm/heap.h
+++ b/vm/heap.h
@@ -22,6 +22,7 @@ void new_heap(HEAP *heap, CELL size);
 void build_free_list(HEAP *heap, CELL size);
 CELL heap_allot(HEAP *heap, CELL size);
 void free_unmarked(HEAP *heap);
+CELL heap_free_space(HEAP *heap);
 
 INLINE F_BLOCK *next_block(HEAP *heap, F_BLOCK *block)
 {
index 97860c0620ddfedc050d32499d3137f92990a2d0..f9fa21d905b9eb109633a2411590b56da8370d4e 100644 (file)
@@ -159,12 +159,10 @@ void primitive_clone(void)
        drepl(clone(dpeek()));
 }
 
-void primitive_room(void)
+void primitive_data_room(void)
 {
        F_ARRAY *a = array(ARRAY_TYPE,gen_count,F);
        int gen;
-       box_unsigned_cell(0);
-       box_unsigned_cell(compiling.limit - compiling.base);
        box_unsigned_cell(cards_end - cards);
        box_unsigned_cell(prior.limit - prior.base);
        for(gen = 0; gen < gen_count; gen++)
index 5e4cc1148f55d0959f5d91912ef1c29acf8474d7..18fbf6988f2b72ae21de08fb412ef0119ea6b1c9 100644 (file)
@@ -87,7 +87,7 @@ CELL untagged_object_size(CELL pointer);
 CELL unaligned_object_size(CELL pointer);
 CELL object_size(CELL pointer);
 CELL binary_payload_start(CELL pointer);
-void primitive_room(void);
+void primitive_data_room(void);
 void primitive_type(void);
 void primitive_tag(void);
 void primitive_slot(void);
index a40cf3444ef051daf6a1e8623c2f31dbff609691..c4117e96b935676847f3306ea29ae6e4f3e1a27e 100644 (file)
@@ -102,7 +102,8 @@ void* primitives[] = {
        primitive_set_retainstack,
        primitive_set_callstack,
        primitive_exit,
-       primitive_room,
+       primitive_data_room,
+       primitive_code_room,
        primitive_os_env,
        primitive_millis,
        primitive_type,