3
$Id: gc.scm,v 14.20 2005/07/31 02:58:35 cph Exp $
3
$Id: gc.scm,v 14.23 2006/09/06 04:59:30 cph Exp $
5
5
Copyright 1986,1987,1988,1989,1990,1991 Massachusetts Institute of Technology
6
Copyright 1992,1993,2005 Massachusetts Institute of Technology
6
Copyright 1992,1993,2005,2006 Massachusetts Institute of Technology
8
8
This file is part of MIT/GNU Scheme.
30
30
(declare (usual-integrations))
32
32
(define (initialize-package!)
33
(set! gc-boot-loading? true)
33
(set! gc-boot-loading? #t)
34
34
(set! hook/gc-flip default/gc-flip)
35
35
(set! hook/purify default/purify)
36
36
(set! hook/stack-overflow default/stack-overflow)
37
37
(set! hook/hardware-trap default/hardware-trap)
38
38
(set! default-safety-margin 4500)
39
(set! pure-space-queue '())
40
(set! constant-space-queue '())
39
(set! pure-space-queue (list 'PURE-SPACE-QUEUE))
40
(set! constant-space-queue (list 'CONSTANT-SPACE-QUEUE))
41
41
(set! hook/gc-start default/gc-start)
42
42
(set! hook/gc-finish default/gc-finish)
43
43
(let ((fixed-objects (get-fixed-objects-vector)))
68
68
(define default-safety-margin)
70
70
(define (default/gc-flip safety-margin)
71
(define (real-default)
72
(gc-flip-internal safety-margin))
74
(cond ((not (null? pure-space-queue))
75
(let ((result (purify-internal pure-space-queue true safety-margin)))
76
(cond ((not (pair? result))
77
;; Wrong phase -- wait until next time.
80
(set! pure-space-queue (cdr pure-space-queue))
81
(queued-purification-failure)
84
(set! pure-space-queue '())
86
((not (null? constant-space-queue))
88
(purify-internal constant-space-queue false safety-margin)))
89
(cond ((not (pair? result))
90
;; Wrong phase -- wait until next time.
93
(set! constant-space-queue (cdr constant-space-queue))
94
(queued-purification-failure)
97
(set! constant-space-queue '())
73
(let ((items (cdr queue)))
76
(purify-internal (if (pair? (cdr items))
86
(set-cdr! queue (cdr items))
87
(queued-purification-failure)))
89
(or (try-queue pure-space-queue #t)
90
(try-queue constant-space-queue #f)
91
(gc-flip-internal safety-margin))))
102
93
(define (queued-purification-failure)
103
(warn "Unable to purify all queued items; dequeuing one"))
94
(warn "Unable to purify all queued items; dequeuing one."))
105
96
(define (default/purify item pure-space? queue?)
106
97
(if (not (if pure-space? (object-pure? item) (object-constant? item)))
110
(purify-internal item
112
default-safety-margin)))
113
(cond ((not (pair? result))
114
;; Wrong phase -- try again.
118
(error "PURIFY: not enough room in constant space"
123
(with-absolutely-no-interrupts
99
(let ((queue (if pure-space? pure-space-queue constant-space-queue)))
100
(with-absolutely-no-interrupts
125
(set! pure-space-queue (cons item pure-space-queue))
102
(set-cdr! queue (cons item (cdr queue)))
128
(with-absolutely-no-interrupts
130
(set! constant-space-queue (cons item constant-space-queue))
106
(purify-internal item
108
default-safety-margin)))
109
(cond ((not (pair? result))
110
;; Wrong phase -- try again.
114
(error "PURIFY: not enough room in constant space"
133
117
(define (default/stack-overflow)
134
118
(abort->nearest "Aborting!: maximum recursion depth exceeded"))
209
193
safety-margin)))))
211
195
(define (flush-purification-queue!)
212
(if (or (not (null? pure-space-queue))
213
(not (null? constant-space-queue)))
196
(if (or (pair? (cdr pure-space-queue))
197
(pair? (cdr constant-space-queue)))
216
200
(flush-purification-queue!))))
219
203
;; Purify an item -- move it into pure space and clean everything by
220
204
;; doing a gc-flip.
221
205
(hook/purify item
222
(if (default-object? pure-space?) true pure-space?)
223
(if (default-object? queue?) true queue?))
206
(if (default-object? pure-space?) #t pure-space?)
207
(if (default-object? queue?) #t queue?))
226
210
(define (constant-space/in-use)