klisp

an open source interpreter for the Kernel Programming Language.
git clone http://git.hanabi.in/repos/klisp.git
Log | Files | Refs | README

commit a0e33a2cb5c8b9eee69edff6346817a17249c29a
parent 3abe4c413192db697ecf8fc6dc1cdaef534546b0
Author: Andres Navarro <canavarro82@gmail.com>
Date:   Sat, 16 Apr 2011 17:55:02 -0300

GC implementation complete. Bugs pending.

Diffstat:
Msrc/Makefile | 2+-
Msrc/kgc.c | 1-
Msrc/klispconf.h | 9++++++++-
Msrc/kmem.c | 15+++++++++++++++
Msrc/kstate.c | 4+++-
5 files changed, 27 insertions(+), 4 deletions(-)

diff --git a/src/Makefile b/src/Makefile @@ -60,7 +60,7 @@ kstate.o: kstate.c kstate.h klisp.h kobject.h kmem.h kstring.h klisp.h \ kground.h kenvironment.h kpair.h keval.h koperative.h kground.h \ krepl.h kcontinuation.h kapplicative.h kport.h ksymbol.h kport.h \ kstring.h kinteger.h kgc.h -kmem.o: kmem.c kmem.h klisp.h kerror.h klisp.h kstate.h +kmem.o: kmem.c kmem.h klisp.h kerror.h klisp.h kstate.h kgc.h kerror.o: kerror.c kerror.h klisp.h kstate.h klisp.h kmem.h kstring.h kpair.h kauxlib.o: kauxlib.c kauxlib.h klisp.h kstate.h klisp.h kenvironment.o: kenvironment.c kenvironment.h kpair.h kobject.h kerror.h \ diff --git a/src/kgc.c b/src/kgc.c @@ -700,7 +700,6 @@ void klispC_step (klisp_State *K) { } } - void klispC_fullgc (klisp_State *K) { if (K->gcstate <= GCSpropagate) { /* reset sweep marks to sweep all elements (returning them to white) */ diff --git a/src/klispconf.h b/src/klispconf.h @@ -13,6 +13,10 @@ #include <stdint.h> #include <stdbool.h> +/* temp defines till gc is stabilized */ +#define KUSE_GC 1 +/* Print msgs when starting and ending gc */ +#define KDEBUG_GC 1 /* #define KTRACK_MARKS (true) @@ -30,7 +34,10 @@ ** mean larger pauses which mean slower collection.) You can also change ** this value dynamically. */ -#define KLISPI_GCPAUSE 200 /* 200% (wait memory to double before next GC) */ + +/* In lua that has incremental gc this is setted to 200, in + klisp as we don't yet have incremental gc, we set it to 400 */ +#define KLISPI_GCPAUSE 400 /* 400% (wait memory to quadruple before next GC) */ /* diff --git a/src/kmem.c b/src/kmem.c @@ -18,6 +18,7 @@ #include "klimits.h" #include "kmem.h" #include "kerror.h" +#include "kgc.h" /* ** About the realloc function: @@ -44,7 +45,21 @@ void *klispM_realloc_ (klisp_State *K, void *block, size_t osize, size_t nsize) { klisp_assert((osize == 0) == (block == NULL)); + /* TEMP: for now only Stop the world GC */ + #ifdef KUSE_GC + if (K->totalbytes - osize + nsize >= K->GCthreshold) { + #ifdef KDEBUG_GC + printf("GC START, total_bytes: %d\n", K->totalbytes); + #endif + klispC_fullgc(K); + #ifdef KDEBUG_GC + printf("GC END, total_bytes: %d\n", K->totalbytes); + #endif + } + #endif + block = (*K->frealloc)(K->ud, block, osize, nsize); + if (block == NULL && nsize > 0) { /* TEMP: try GC if there is no more mem */ /* TODO: make this a catchable error */ diff --git a/src/kstate.c b/src/kstate.c @@ -177,7 +177,9 @@ klisp_State *klisp_newstate (klisp_Alloc f, void *ud) { kinit_ground_env(K); /* set the threshold for gc start now that we have allocated all mem */ - K->GCthreshold = 4*K->totalbytes; +/* K->GCthreshold = 4*K->totalbytes; */ + /* TEST */ + K->GCthreshold = K->totalbytes + 1000; return K; }