diff --git a/s48/meta-gc/gc-sized-fast.scm b/s48/meta-gc/gc-sized-fast.scm new file mode 100644 index 0000000..1482c0c --- /dev/null +++ b/s48/meta-gc/gc-sized-fast.scm @@ -0,0 +1,103 @@ +;; Copyright (C) Johan Ceuppens 2013 +;; +;; This program is free software: you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 2 of the License, or +;; (at your option) any later version. +;; +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. +;; +;; You should have received a copy of the GNU General Public License +;; along with this program. If not, see . + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; Fixed chunk size gc, can be used in meta-gc.scm API +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +(define (make-sized-fast-gc) + (let ((*heap '()) + (*null '()) + (*max-datasize 1024) + (*datasize 0) + (*currentn 0) + (*max-chunksize 8) + (*dynamic-data '()) + ) + + (define (malloc) + (add-to-heap! 1) + ) + + (define (calloc nchunks) + (add-to-heap! nchunks) + ) + + ;; private procedures + + (define (get-heap) *heap) + + ;; data is a string + (define (get-data-size d) (string-length d)) + + (define (generate-error msg) + (cond ((eq? msg 'memory-exhausted) + (display "memory exhausted")(newline)) + )) + + (define (add-to-heap! n) + (do ((n2 0 (+ n2 1))) + ((>= n2 n) *heap) + (set! *heap (append (get-heap) (list (make-chunk))))) + ) + + (define (make-chunk) + (cons 'chunk *null)) + + ;;NOTE append null string after <8 + ;; data is a string + (define (split-data data) + (let ((s "")) + (let ((retl '())) + (do ((n2 0 (+ n2 1))) + ((>= n2 (string-length data)) + retl) + (do ((n 0 (+ n 1))) + ((or (>= n 8)(>= (+ n2 n) (string-length data))) + (append retl (list s))(set! n2 (+ n2 n))) + (string-append s (string-ref data n)) + )) + ))) + + ;; FIX over *currentn + (define (set-data-rec! lst n) + (cond ((eq? n 0) + '()) + ;; reverses + (else (append (list (list-ref lst n)) + (set-data-rec! lst (- n 1)))))) + + + (define (set-data! chunk data) + (let ((lst (split-data data))) + (set-data-rec! lst (length lst)) + (set! *currentn (+ n *currentn)) + )) + + (define (set-chunk-data! chunk) + (set! *datasize (+ *datasize (get-data-size chunk))) + (if (> *datasize *max-datasize) + (generate-error 'memory-exhausted) + ;; The data is dynamically bound in this actor + (set-data! chunk *dynamic-data) + )) + + (define (dispatch msg) + (cond ((eq? msg 'malloc) malloc) + ((eq? msg 'calloc) calloc) + (else (display "make-gc : message not understood : ")(display msg)(newline)) + )) + dispatch)) diff --git a/s48/meta-gc/gc-sized.scm b/s48/meta-gc/gc-sized.scm new file mode 100644 index 0000000..16b45d8 --- /dev/null +++ b/s48/meta-gc/gc-sized.scm @@ -0,0 +1,109 @@ +;; Copyright (C) Johan Ceuppens 2013 +;; +;; This program is free software: you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 2 of the License, or +;; (at your option) any later version. +;; +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. +;; +;; You should have received a copy of the GNU General Public License +;; along with this program. If not, see . + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; Fixed chunk size gc, can be used in meta-gc.scm API +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +(load "stringutil.scm") + +(define (make-sized-gc) + (let ((*heap '()) + (*null '()) + (*max-datasize 1024) + (*datasize 0) + (*currentn 0) ;; right write mark + (*max-chunksize 8) + (*dynamic-data '()) + ) + + (define (malloc) + (add-to-heap! 1) + ) + + (define (calloc nchunks) + (add-to-heap! nchunks) + ) + + ;; private procedures + + (define (get-heap) *heap) + + ;; data is a string + (define (get-data-size d) (string-length d)) + + (define (generate-error msg) + (cond ((eq? msg 'memory-exhausted) + (display "memory exhausted")(newline)) + )) + + (define (add-to-heap! n) + ((lambda (n) + (if (= n 0) + '() + (append (list (make-chunk)) (add-to-heap! (- n 1))))))) + + (define (make-chunk) + (cons 'chunk *null)) + + ;;NOTE append null string after <8 + ;; data is a string + (define (split-data data) + (let ((split-data-func (lambda (datastr) + (append (list (substring datastr 0 8)) +4 (cond ((< (string-length datastr) 8) + datastr) + (else + ;; this might be a guilism + (split-data-func (substring data 8 (string-length data))))))) + )) + (split-data-func data))) + + (define (split-data2 data) + (let ((split-data-func2 (lambda (datalist) + (append (sublist datalist 0 8) + (cond ((< (length datalist) 8) + datalist) + (else + (split-data-func2 (sublist datalist 8 (- (string-length datalist) 8))))))))) + (map split-data-func2 (string->list data)))) + + ;; FIX over *currentn + (define (set-data-rec! lst n) + (cond ((= n (length lst)) + '()) + ;; reverses + (else (append (list (list-ref lst n)) + (set-data-rec! lst (- n 1)))))) + + (define (set-data! chunk data) + (let* ((lst (split-data data))) + (set! *heap (set-data-rec! lst (length lst))) + (set! *currentn (+ n *currentn)) + )) + + (define (set-chunk-data! chunk) + (set! *datasize (+ *datasize (get-data-size chunk))) + (if (> *datasize *max-datasize) + (generate-error 'memory-exhausted) + ;; The data is dynamically bound in this actor + (set-data! chunk *dynamic-data) + )) + + (define (dispatch msg) + (cond ((eq? msg 'malloc) malloc) + ((eq? msg 'calloc) calloc) + (else (display "make-gc : message not understood : ")(display msg)(newline)) + )) + dispatch)) diff --git a/s48/meta-gc/gc.scm b/s48/meta-gc/gc.scm new file mode 100644 index 0000000..f76e1bd --- /dev/null +++ b/s48/meta-gc/gc.scm @@ -0,0 +1,70 @@ +;; Copyright (C) Johan Ceuppens 2013 +;; +;; This program is free software: you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 2 of the License, or +;; (at your option) any later version. +;; +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. +;; +;; You should have received a copy of the GNU General Public License +;; along with this program. If not, see . + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; One chunk per memory allocation, can be used in meta-gc.scm API +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(define (make-gc) + (let ((*heap '()) + (*null '()) + (*max-datasize 1024) + (*datasize 0) + (*dynamic-data '()) + ) + + (define (malloc) + (add-to-heap! 1) + ) + (define (calloc nchunks) + (add-to-heap! nchunks) + ) + + + ;; private procedures + + (define (get-heap) *heap) + + ;; data is a string + (define (get-data-size d) (string-length d)) + + (define (generate-error msg) + (cond ((eq? msg 'memory-exhausted) + (display "memory exhausted")(newline)) + )) + + (define (add-to-heap! n) + (set! *heap (append (get-heap) (list (make-chunk))))) + + (define (make-chunk) + (cons 'chunk *null)) + + (define (set-data! chunk data) + (set-cdr! chunk data)) + + (define (set-chunk-data! chunk) + (set! *datasize (+ *datasize (get-data-size chunk))) + (if (> *datasize *max-datasize) + (generate-error 'memory-exhausted) + ;; The data is dynamically bound in this actor + (set-data! chunk *dynamic-data) + )) + + (define (dispatch msg) + (cond ((eq? msg 'malloc) malloc) + ((eq? msg 'calloc) calloc) + (else (display "make-gc : message not understood : ")(display msg)(newline)) + )) + dispatch)) diff --git a/s48/meta-gc/meta-gc.scm b/s48/meta-gc/meta-gc.scm new file mode 100644 index 0000000..2678cae --- /dev/null +++ b/s48/meta-gc/meta-gc.scm @@ -0,0 +1,49 @@ +;; Copyright (C) Johan Ceuppens 2013 +;; +;; This program is free software: you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 2 of the License, or +;; (at your option) any later version. +;; +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. +;; +;; You should have received a copy of the GNU General Public License +;; along with this program. If not, see . + +(load "gc.scm") +(load "gc-sized.scm") +(load "gc-sized-fast.scm") + +(define (make-meta-gc gc-actor-maker) + (let ((*gc-program (gc-actor-maker)) + ) + + ;; interrupt system : FIXME sort of hooks + (define (signal number) + (cond ((= number 9) + ;;(display "exiting meta-gc...") + ;;,exit + 0) + ((= number 7) + ;;(display "exiting meta-gc...") + ;;,exit + 0) + (else (display "make-meta-gc : SIGNAL == ")(display number)(display " unknown signal to gc") + (newline) + ))) + + (define (run) + 0) + + (define (dispatch msg) + (cond ((eq? msg 'run) run) + ((eq? msg 'signal) signal) + ((eq? msg 'int) signal) + ((eq? msg 'interrupt) signal) + + (else (display "make-meta-gc : message not understood : ")(display msg)(newline) + ))) + dispatch)) diff --git a/s48/meta-gc/meta-hook.scm b/s48/meta-gc/meta-hook.scm new file mode 100644 index 0000000..b46af6e --- /dev/null +++ b/s48/meta-gc/meta-hook.scm @@ -0,0 +1,28 @@ +;; Copyright (C) Johan Ceuppens 2013 +;; +;; This program is free software: you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 2 of the License, or +;; (at your option) any later version. +;; +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. +;; +;; You should have received a copy of the GNU General Public License +;; along with this program. If not, see . + +(load "meta-gc.scm") + +(define (make-gc-hook) + (define (add-hook) + ;;FIXME fill in SMOB system in C + #f) + + (define (dispatch msg) + (cond ((eq? msg 'add-hook) add-hook) + (else (display "make-gc-hook : message not understood : ")(display msg)(newline) + ))) + + dispatch) diff --git a/s48/meta-gc/meta.scm b/s48/meta-gc/meta.scm new file mode 100644 index 0000000..d4a9cec --- /dev/null +++ b/s48/meta-gc/meta.scm @@ -0,0 +1,47 @@ +;; Copyright (C) Johan Ceuppens 2013 +;; +;; This program is free software: you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 2 of the License, or +;; (at your option) any later version. +;; +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. +;; +;; You should have received a copy of the GNU General Public License +;; along with this program. If not, see . + +(load "meta-gc.scm") + +;; special REPL +;; You can add REPL functions such as ((make-meta) 'cons our-cons) +(define (make-meta) + (let ((*applicants '())) + + (define (add-hook symbol fun) + (set! *applicants (append *applicants (list (cons symbol fun))))) + + (define (search-applicants msgsymbol) + (do ((l *applicants (cdr *applicants))) + ((cond ((null? l) + #f) + ((eq? (caar *applicants) msgsymbol) + (cdar *applicants)) + )))) + + ;; dynamically bound f- function + (define (post-applicants args) + (if (procedure? f-) + (f- args))) + + (define (dispatch msg) + (cond ((eq? msg 'add-hook) add-hook) + ((let ((f- (search-applicants msg))) + (if f- + post-applicants))) + (else (display "make-meta : message not understood : ")(display msg)(newline) + ))) + + dispatch)) diff --git a/s48/meta-gc/stringutil.scm b/s48/meta-gc/stringutil.scm new file mode 100644 index 0000000..4a2a550 --- /dev/null +++ b/s48/meta-gc/stringutil.scm @@ -0,0 +1,20 @@ +;; Copyright (C) Johan Ceuppens 2013 +;; +;; This program is free software: you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 2 of the License, or +;; (at your option) any later version. +;; +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. +;; +;; You should have received a copy of the GNU General Public License +;; along with this program. , see . + +(define (sublist list start number) + (cond ((> start 0) (sublist (cdr list) (- start 1) number)) + ((> number 0) (cons (car list) + (sublist (cdr list) 0 (- number 1)))) + (else '())))