init meta-circular gc

This commit is contained in:
Johan Ceupens 2013-12-20 03:43:26 +01:00
parent 9e9ac82ba0
commit 7b6041f961
7 changed files with 426 additions and 0 deletions

View File

@ -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 <http://www.gnu.org/licenses/>.
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 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))

109
s48/meta-gc/gc-sized.scm Normal file
View File

@ -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 <http://www.gnu.org/licenses/>.
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 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))

70
s48/meta-gc/gc.scm Normal file
View File

@ -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 <http://www.gnu.org/licenses/>.
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 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))

49
s48/meta-gc/meta-gc.scm Normal file
View File

@ -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 <http://www.gnu.org/licenses/>.
(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))

28
s48/meta-gc/meta-hook.scm Normal file
View File

@ -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 <http://www.gnu.org/licenses/>.
(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)

47
s48/meta-gc/meta.scm Normal file
View File

@ -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 <http://www.gnu.org/licenses/>.
(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))

View File

@ -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 <http://www.gnu.org/licenses/>.
(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 '())))