fix GC bug related to park[] and finalization
svn: r8397
This commit is contained in:
parent
67f533db92
commit
91f9635c1e
|
@ -386,7 +386,7 @@ static int running_finals;
|
|||
static char zero_sized[4];
|
||||
|
||||
/* Temporary pointer-holder used by routines that allocate */
|
||||
static void *park[2];
|
||||
static void *park[2], *park_save[2];
|
||||
|
||||
static int during_gc, avoid_collection;
|
||||
|
||||
|
@ -2825,6 +2825,7 @@ static void init(void)
|
|||
GC_add_roots(&run_queue, (char *)&run_queue + sizeof(run_queue) + 1);
|
||||
GC_add_roots(&last_in_queue, (char *)&last_in_queue + sizeof(last_in_queue) + 1);
|
||||
GC_add_roots(&park, (char *)&park + sizeof(park) + 1);
|
||||
GC_add_roots(&park_save, (char *)&park_save + sizeof(park_save) + 1);
|
||||
|
||||
sets[0] = &tagged;
|
||||
sets[1] = &array;
|
||||
|
@ -3487,6 +3488,12 @@ static void gcollect(int full)
|
|||
if (!running_finals) {
|
||||
running_finals = 1;
|
||||
|
||||
/* Finalization might allocate, which might need park: */
|
||||
park_save[0] = park[0];
|
||||
park_save[1] = park[1];
|
||||
park[0] = NULL;
|
||||
park[1] = NULL;
|
||||
|
||||
while (run_queue) {
|
||||
Fnl *f;
|
||||
void **gcs;
|
||||
|
@ -3505,6 +3512,11 @@ static void gcollect(int full)
|
|||
}
|
||||
|
||||
running_finals = 0;
|
||||
|
||||
park[0] = park_save[0];
|
||||
park[1] = park_save[1];
|
||||
park_save[0] = NULL;
|
||||
park_save[1] = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -136,7 +136,7 @@ void (*GC_fixup_xtagged)(void *obj);
|
|||
|
||||
#include "my_qsort.c"
|
||||
|
||||
static void *park[2];
|
||||
static void *park[2], *park_save[2];
|
||||
|
||||
/*****************************************************************************/
|
||||
/* OS-Level Memory Management Routines */
|
||||
|
@ -2117,6 +2117,7 @@ void GC_init_type_tags(int count, int pair, int mutable_pair, int weakbox, int e
|
|||
fixup_weak_array, 0, 0);
|
||||
initialize_signal_handler();
|
||||
GC_add_roots(&park, (char *)&park + sizeof(park) + 1);
|
||||
GC_add_roots(&park_save, (char *)&park_save + sizeof(park_save) + 1);
|
||||
|
||||
initialize_protect_page_ranges(malloc_dirty_pages(APAGE_SIZE, APAGE_SIZE), APAGE_SIZE);
|
||||
}
|
||||
|
@ -3202,6 +3203,13 @@ static void garbage_collect(int force_full)
|
|||
finalizer completes its execution */
|
||||
if(!running_finalizers) {
|
||||
running_finalizers = 1;
|
||||
|
||||
/* Finalization might allocate, which might need park: */
|
||||
park_save[0] = park[0];
|
||||
park_save[1] = park[1];
|
||||
park[0] = NULL;
|
||||
park[1] = NULL;
|
||||
|
||||
while(run_queue) {
|
||||
struct finalizer *f;
|
||||
void **gcs;
|
||||
|
@ -3217,6 +3225,11 @@ static void garbage_collect(int force_full)
|
|||
}
|
||||
run_account_hooks();
|
||||
running_finalizers = 0;
|
||||
|
||||
park[0] = park_save[0];
|
||||
park[1] = park_save[1];
|
||||
park_save[0] = NULL;
|
||||
park_save[1] = NULL;
|
||||
}
|
||||
|
||||
DUMP_HEAP(); CLOSE_DEBUG_FILE();
|
||||
|
|
|
@ -615,8 +615,8 @@ MZ_EXTERN Scheme_Object *scheme_rational_from_float(float d);
|
|||
# define scheme_rational_from_float scheme_rational_from_double
|
||||
#endif
|
||||
MZ_EXTERN Scheme_Object *scheme_rational_normalize(const Scheme_Object *n);
|
||||
MZ_EXTERN Scheme_Object *scheme_rational_numerator(const Scheme_Object *n);
|
||||
MZ_EXTERN Scheme_Object *scheme_rational_denominator(const Scheme_Object *n);
|
||||
XFORM_NONGCING MZ_EXTERN Scheme_Object *scheme_rational_numerator(const Scheme_Object *n);
|
||||
XFORM_NONGCING MZ_EXTERN Scheme_Object *scheme_rational_denominator(const Scheme_Object *n);
|
||||
|
||||
/*========================================================================*/
|
||||
/* complexes */
|
||||
|
|
Loading…
Reference in New Issue
Block a user