more memory-accounting repairs, so that sandbox tests now pass
svn: r12861
This commit is contained in:
parent
0786da10cb
commit
25b27a8b08
|
@ -152,7 +152,7 @@
|
||||||
(make-evaluator 'scheme/base
|
(make-evaluator 'scheme/base
|
||||||
'(define a (for/list ([i (in-range 10)])
|
'(define a (for/list ([i (in-range 10)])
|
||||||
(collect-garbage)
|
(collect-garbage)
|
||||||
(make-string 1000))))))
|
(make-string 500000))))))
|
||||||
=err> "out of memory"))
|
=err> "out of memory"))
|
||||||
|
|
||||||
;; i/o
|
;; i/o
|
||||||
|
@ -488,9 +488,13 @@
|
||||||
--eval--
|
--eval--
|
||||||
(define a '())
|
(define a '())
|
||||||
(define b 1)
|
(define b 1)
|
||||||
(for ([i (in-range 20)])
|
(length
|
||||||
|
(for/fold ([v null]) ([i (in-range 20)])
|
||||||
|
;; Increases size of sandbox:
|
||||||
(set! a (cons (make-bytes 500000) a))
|
(set! a (cons (make-bytes 500000) a))
|
||||||
(collect-garbage))
|
(collect-garbage)
|
||||||
|
;; Increases size of evaluation:
|
||||||
|
(cons (make-bytes 500000) v)))
|
||||||
=err> "out of memory"
|
=err> "out of memory"
|
||||||
b => 1))
|
b => 1))
|
||||||
|
|
||||||
|
|
|
@ -371,6 +371,13 @@ GC2_EXTERN void GC_fixup_variable_stack(void **var_stack,
|
||||||
The `stack_mem' argument indicates the start of the allocated memory
|
The `stack_mem' argument indicates the start of the allocated memory
|
||||||
that contains `var_stack'. It is used for backtraces. */
|
that contains `var_stack'. It is used for backtraces. */
|
||||||
|
|
||||||
|
GC2_EXTERN int GC_merely_accounting();
|
||||||
|
/*
|
||||||
|
Can be called by a mark or fixup traversal proc to determine whether
|
||||||
|
the traversal is merely for accounting, in which case some marking
|
||||||
|
can be skipped if the corresponding data should be charged to a
|
||||||
|
different object. */
|
||||||
|
|
||||||
GC2_EXTERN void GC_write_barrier(void *p);
|
GC2_EXTERN void GC_write_barrier(void *p);
|
||||||
/*
|
/*
|
||||||
Explicit write barrier to ensure that a write-barrier signal is not
|
Explicit write barrier to ensure that a write-barrier signal is not
|
||||||
|
|
|
@ -1404,6 +1404,12 @@ void GC_register_new_thread(void *t, void *c)
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int GC_merely_accounting()
|
||||||
|
{
|
||||||
|
NewGC *gc = GC_get_GC();
|
||||||
|
return gc->doing_memory_accounting;
|
||||||
|
}
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
/* administration / initialization */
|
/* administration / initialization */
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
|
@ -923,8 +923,10 @@ static int cont_proc_MARK(void *p) {
|
||||||
MARK_cjs(&c->cjs);
|
MARK_cjs(&c->cjs);
|
||||||
MARK_stack_state(&c->ss);
|
MARK_stack_state(&c->ss);
|
||||||
gcMARK(c->barrier_prompt);
|
gcMARK(c->barrier_prompt);
|
||||||
|
if (!GC_merely_accounting()) {
|
||||||
gcMARK(c->runstack_start);
|
gcMARK(c->runstack_start);
|
||||||
gcMARK(c->runstack_saved);
|
gcMARK(c->runstack_saved);
|
||||||
|
}
|
||||||
|
|
||||||
gcMARK(c->prompt_id);
|
gcMARK(c->prompt_id);
|
||||||
gcMARK(c->prompt_buf);
|
gcMARK(c->prompt_buf);
|
||||||
|
@ -961,8 +963,10 @@ static int cont_proc_FIXUP(void *p) {
|
||||||
FIXUP_cjs(&c->cjs);
|
FIXUP_cjs(&c->cjs);
|
||||||
FIXUP_stack_state(&c->ss);
|
FIXUP_stack_state(&c->ss);
|
||||||
gcFIXUP(c->barrier_prompt);
|
gcFIXUP(c->barrier_prompt);
|
||||||
|
if (!GC_merely_accounting()) {
|
||||||
gcFIXUP(c->runstack_start);
|
gcFIXUP(c->runstack_start);
|
||||||
gcFIXUP(c->runstack_saved);
|
gcFIXUP(c->runstack_saved);
|
||||||
|
}
|
||||||
|
|
||||||
gcFIXUP(c->prompt_id);
|
gcFIXUP(c->prompt_id);
|
||||||
gcFIXUP(c->prompt_buf);
|
gcFIXUP(c->prompt_buf);
|
||||||
|
@ -1600,12 +1604,16 @@ static int thread_val_MARK(void *p) {
|
||||||
gcMARK(pr->init_config);
|
gcMARK(pr->init_config);
|
||||||
gcMARK(pr->init_break_cell);
|
gcMARK(pr->init_break_cell);
|
||||||
|
|
||||||
{
|
if (!pr->runstack_owner
|
||||||
|
|| !GC_merely_accounting()
|
||||||
|
|| (*pr->runstack_owner == pr)) {
|
||||||
Scheme_Object **rs = pr->runstack_start;
|
Scheme_Object **rs = pr->runstack_start;
|
||||||
gcMARK( pr->runstack_start);
|
gcMARK( pr->runstack_start);
|
||||||
|
if (pr->runstack != pr->runstack_start + (pr->runstack - rs))
|
||||||
pr->runstack = pr->runstack_start + (pr->runstack - rs);
|
pr->runstack = pr->runstack_start + (pr->runstack - rs);
|
||||||
}
|
|
||||||
gcMARK(pr->runstack_saved);
|
gcMARK(pr->runstack_saved);
|
||||||
|
}
|
||||||
gcMARK(pr->runstack_owner);
|
gcMARK(pr->runstack_owner);
|
||||||
gcMARK(pr->runstack_swapped);
|
gcMARK(pr->runstack_swapped);
|
||||||
pr->spare_runstack = NULL; /* just in case */
|
pr->spare_runstack = NULL; /* just in case */
|
||||||
|
@ -1706,12 +1714,16 @@ static int thread_val_FIXUP(void *p) {
|
||||||
gcFIXUP(pr->init_config);
|
gcFIXUP(pr->init_config);
|
||||||
gcFIXUP(pr->init_break_cell);
|
gcFIXUP(pr->init_break_cell);
|
||||||
|
|
||||||
{
|
if (!pr->runstack_owner
|
||||||
|
|| !GC_merely_accounting()
|
||||||
|
|| (*pr->runstack_owner == pr)) {
|
||||||
Scheme_Object **rs = pr->runstack_start;
|
Scheme_Object **rs = pr->runstack_start;
|
||||||
gcFIXUP_TYPED_NOW(Scheme_Object **, pr->runstack_start);
|
gcFIXUP_TYPED_NOW(Scheme_Object **, pr->runstack_start);
|
||||||
|
if (pr->runstack != pr->runstack_start + (pr->runstack - rs))
|
||||||
pr->runstack = pr->runstack_start + (pr->runstack - rs);
|
pr->runstack = pr->runstack_start + (pr->runstack - rs);
|
||||||
}
|
|
||||||
gcFIXUP(pr->runstack_saved);
|
gcFIXUP(pr->runstack_saved);
|
||||||
|
}
|
||||||
gcFIXUP(pr->runstack_owner);
|
gcFIXUP(pr->runstack_owner);
|
||||||
gcFIXUP(pr->runstack_swapped);
|
gcFIXUP(pr->runstack_swapped);
|
||||||
pr->spare_runstack = NULL; /* just in case */
|
pr->spare_runstack = NULL; /* just in case */
|
||||||
|
@ -1858,6 +1870,7 @@ static int prompt_val_SIZE(void *p) {
|
||||||
static int prompt_val_MARK(void *p) {
|
static int prompt_val_MARK(void *p) {
|
||||||
Scheme_Prompt *pr = (Scheme_Prompt *)p;
|
Scheme_Prompt *pr = (Scheme_Prompt *)p;
|
||||||
gcMARK(pr->boundary_overflow_id);
|
gcMARK(pr->boundary_overflow_id);
|
||||||
|
if (!GC_merely_accounting())
|
||||||
gcMARK(pr->runstack_boundary_start);
|
gcMARK(pr->runstack_boundary_start);
|
||||||
gcMARK(pr->tag);
|
gcMARK(pr->tag);
|
||||||
gcMARK(pr->id);
|
gcMARK(pr->id);
|
||||||
|
@ -1868,6 +1881,7 @@ static int prompt_val_MARK(void *p) {
|
||||||
static int prompt_val_FIXUP(void *p) {
|
static int prompt_val_FIXUP(void *p) {
|
||||||
Scheme_Prompt *pr = (Scheme_Prompt *)p;
|
Scheme_Prompt *pr = (Scheme_Prompt *)p;
|
||||||
gcFIXUP(pr->boundary_overflow_id);
|
gcFIXUP(pr->boundary_overflow_id);
|
||||||
|
if (!GC_merely_accounting())
|
||||||
gcFIXUP(pr->runstack_boundary_start);
|
gcFIXUP(pr->runstack_boundary_start);
|
||||||
gcFIXUP(pr->tag);
|
gcFIXUP(pr->tag);
|
||||||
gcFIXUP(pr->id);
|
gcFIXUP(pr->id);
|
||||||
|
|
|
@ -355,8 +355,10 @@ cont_proc {
|
||||||
MARK_cjs(&c->cjs);
|
MARK_cjs(&c->cjs);
|
||||||
MARK_stack_state(&c->ss);
|
MARK_stack_state(&c->ss);
|
||||||
gcMARK(c->barrier_prompt);
|
gcMARK(c->barrier_prompt);
|
||||||
|
if (!GC_merely_accounting()) {
|
||||||
gcMARK(c->runstack_start);
|
gcMARK(c->runstack_start);
|
||||||
gcMARK(c->runstack_saved);
|
gcMARK(c->runstack_saved);
|
||||||
|
}
|
||||||
|
|
||||||
gcMARK(c->prompt_id);
|
gcMARK(c->prompt_id);
|
||||||
gcMARK(c->prompt_buf);
|
gcMARK(c->prompt_buf);
|
||||||
|
@ -615,12 +617,16 @@ thread_val {
|
||||||
gcMARK(pr->init_config);
|
gcMARK(pr->init_config);
|
||||||
gcMARK(pr->init_break_cell);
|
gcMARK(pr->init_break_cell);
|
||||||
|
|
||||||
{
|
if (!pr->runstack_owner
|
||||||
|
|| !GC_merely_accounting()
|
||||||
|
|| (*pr->runstack_owner == pr)) {
|
||||||
Scheme_Object **rs = pr->runstack_start;
|
Scheme_Object **rs = pr->runstack_start;
|
||||||
gcFIXUP_TYPED_NOW(Scheme_Object **, pr->runstack_start);
|
gcFIXUP_TYPED_NOW(Scheme_Object **, pr->runstack_start);
|
||||||
|
if (pr->runstack != pr->runstack_start + (pr->runstack - rs))
|
||||||
pr->runstack = pr->runstack_start + (pr->runstack - rs);
|
pr->runstack = pr->runstack_start + (pr->runstack - rs);
|
||||||
}
|
|
||||||
gcMARK(pr->runstack_saved);
|
gcMARK(pr->runstack_saved);
|
||||||
|
}
|
||||||
gcMARK(pr->runstack_owner);
|
gcMARK(pr->runstack_owner);
|
||||||
gcMARK(pr->runstack_swapped);
|
gcMARK(pr->runstack_swapped);
|
||||||
pr->spare_runstack = NULL; /* just in case */
|
pr->spare_runstack = NULL; /* just in case */
|
||||||
|
@ -738,6 +744,7 @@ prompt_val {
|
||||||
mark:
|
mark:
|
||||||
Scheme_Prompt *pr = (Scheme_Prompt *)p;
|
Scheme_Prompt *pr = (Scheme_Prompt *)p;
|
||||||
gcMARK(pr->boundary_overflow_id);
|
gcMARK(pr->boundary_overflow_id);
|
||||||
|
if (!GC_merely_accounting())
|
||||||
gcMARK(pr->runstack_boundary_start);
|
gcMARK(pr->runstack_boundary_start);
|
||||||
gcMARK(pr->tag);
|
gcMARK(pr->tag);
|
||||||
gcMARK(pr->id);
|
gcMARK(pr->id);
|
||||||
|
|
Loading…
Reference in New Issue
Block a user