Moved parks into NewGC
svn: r12261
This commit is contained in:
parent
fa1335ea8c
commit
2c265f832a
|
@ -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;
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue
Block a user