Moved parks into NewGC

svn: r12261
This commit is contained in:
Kevin Tew 2008-11-05 21:05:32 +00:00
parent fa1335ea8c
commit 2c265f832a
5 changed files with 53 additions and 42 deletions

View File

@ -81,16 +81,16 @@ void GC_set_finalizer(void *p, int tagged, int level, void (*f)(void *p, void *d
return;
/* Allcation might trigger GC, so we use park: */
park[0] = p;
park[1] = data;
GC->park[0] = p;
GC->park[1] = data;
fnl = (Fnl *)GC_malloc_atomic(sizeof(Fnl));
memset(fnl, 0, sizeof(Fnl));
p = park[0];
park[0] = NULL;
data = park[1];
park[1] = NULL;
p = GC->park[0];
data = GC->park[1];
GC->park[0] = NULL;
GC->park[1] = NULL;
fnl->next = finalizers;
fnl->prev = NULL;

View File

@ -110,9 +110,6 @@ void (*GC_fixup_xtagged)(void *obj);
#include "my_qsort.c"
static void *park[2];
static void *park_save[2];
/*****************************************************************************/
/* OS-Level Memory Management Routines */
/*****************************************************************************/
@ -1108,8 +1105,8 @@ void GC_finalization_weak_ptr(void **p, int offset)
{
struct weak_finalizer *wfnl;
park[0] = p; wfnl = GC_malloc_atomic(sizeof(struct weak_finalizer));
p = park[0]; park[0] = NULL;
GC->park[0] = p; wfnl = GC_malloc_atomic(sizeof(struct weak_finalizer));
p = GC->park[0]; GC->park[0] = NULL;
wfnl->p = p; wfnl->offset = offset * sizeof(void*); wfnl->saved = NULL;
wfnl->next = weak_finalizers; weak_finalizers = wfnl;
}
@ -1471,8 +1468,8 @@ void GC_init_type_tags(int count, int pair, int mutable_pair, int weakbox, int e
GC_register_traversers(GC->ephemeron_tag, size_ephemeron, mark_ephemeron, fixup_ephemeron, 0, 0);
GC_register_traversers(GC->weak_array_tag, size_weak_array, mark_weak_array, 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);
GC_add_roots(&GC->park, (char *)&GC->park + sizeof(GC->park) + 1);
GC_add_roots(&GC->park_save, (char *)&GC->park_save + sizeof(GC->park_save) + 1);
initialize_protect_page_ranges(malloc_dirty_pages(APAGE_SIZE, APAGE_SIZE), APAGE_SIZE);
}
@ -2560,10 +2557,10 @@ static void garbage_collect(int force_full)
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;
GC->park_save[0] = GC->park[0];
GC->park_save[1] = GC->park[1];
GC->park[0] = NULL;
GC->park[1] = NULL;
while(run_queue) {
struct finalizer *f;
@ -2581,10 +2578,10 @@ 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;
GC->park[0] = GC->park_save[0];
GC->park[1] = GC->park_save[1];
GC->park_save[0] = NULL;
GC->park_save[1] = NULL;
}
DUMP_HEAP(); CLOSE_DEBUG_FILE();

View File

@ -82,6 +82,19 @@ typedef struct NewGC {
unsigned long in_unsafe_allocation_mode :1;
void (*unsafe_allocation_abort)();
void *park[2];
void *park_save[2];
int generations_available;
unsigned char full_needed_for_finalization :1;
unsigned char no_further_modifications:1;
/* These collect information about memory usage, for use in GC_dump. */
unsigned long peak_memory_use;
unsigned long num_minor_collects;
unsigned long num_major_collects;
unsigned short weak_array_tag;
unsigned short weak_box_tag;
unsigned short ephemeron_tag;
@ -114,4 +127,5 @@ void NewGC_initialize(NewGC *newgc) {
newgc->weak_boxes = NULL;
newgc->ephemerons = NULL;
newgc->num_last_seen_ephemerons = 0;
newgc->generations_available = 1;
}

View File

@ -146,11 +146,11 @@ inline static unsigned long custodian_usage(void *custodian)
int i;
if(!really_doing_accounting) {
park[0] = custodian;
GC->park[0] = custodian;
really_doing_accounting = 1;
garbage_collect(1);
custodian = park[0];
park[0] = NULL;
custodian = GC->park[0];
GC->park[0] = NULL;
}
for(i = 1; i < owner_table_top; i++)
if(owner_table[i] && custodian_member_owner_set(custodian, i))
@ -359,11 +359,11 @@ inline static void add_account_hook(int type,void *c1,void *c2,unsigned long b)
struct account_hook *work;
if(!really_doing_accounting) {
park[0] = c1; park[1] = c2;
GC->park[0] = c1; GC->park[1] = c2;
really_doing_accounting = 1;
garbage_collect(1);
c1 = park[0]; c2 = park[1];
park[0] = park[1] = NULL;
c1 = GC->park[0]; c2 = GC->park[1];
GC->park[0] = GC->park[1] = NULL;
}
if (type == MZACCT_LIMIT)

View File

@ -88,14 +88,14 @@ void *GC_malloc_weak_array(size_t size_in_bytes, void *replace_val)
GC_Weak_Array *w;
/* Allcation might trigger GC, so we use park: */
park[0] = replace_val;
GC->park[0] = replace_val;
w = (GC_Weak_Array *)GC_malloc_one_tagged(size_in_bytes
+ sizeof(GC_Weak_Array)
- sizeof(void *));
replace_val = park[0];
park[0] = NULL;
replace_val = GC->park[0];
GC->park[0] = NULL;
w->type = GC->weak_array_tag;
w->replace_val = replace_val;
@ -168,15 +168,15 @@ void *GC_malloc_weak_box(void *p, void **secondary, int soffset)
GC_Weak_Box *w;
/* Allcation might trigger GC, so we use park: */
park[0] = p;
park[1] = secondary;
GC->park[0] = p;
GC->park[1] = secondary;
w = (GC_Weak_Box *)GC_malloc_one_tagged(sizeof(GC_Weak_Box));
p = park[0];
park[0] = NULL;
secondary = (void **)park[1];
park[1] = NULL;
p = GC->park[0];
secondary = (void **)GC->park[1];
GC->park[0] = NULL;
GC->park[1] = NULL;
w->type = GC->weak_box_tag;
w->val = p;
@ -262,15 +262,15 @@ void *GC_malloc_ephemeron(void *k, void *v)
GC_Ephemeron *eph;
/* Allcation might trigger GC, so we use park: */
park[0] = k;
park[1] = v;
GC->park[0] = k;
GC->park[1] = v;
eph = (GC_Ephemeron *)GC_malloc_one_tagged(sizeof(GC_Ephemeron));
k = park[0];
park[0] = NULL;
v = park[1];
park[1] = NULL;
k = GC->park[0];
v = GC->park[1];
GC->park[0] = NULL;
GC->park[1] = NULL;
eph->type = GC->ephemeron_tag;
eph->key = k;