Moved run_queue and last_in_queue to NewGC struct

svn: r12272
This commit is contained in:
Kevin Tew 2008-11-05 21:06:41 +00:00
parent 13f3eefa6c
commit 3577b42a1a
3 changed files with 34 additions and 30 deletions

View File

@ -11,20 +11,6 @@
park
*/
typedef struct finalizer {
char eager_level;
char tagged;
void *p;
GC_finalization_proc f;
void *data;
#if CHECKS
long size;
#endif
struct finalizer *next;
/* Patched after GC: */
struct finalizer *prev, *left, *right;
} Fnl;
static Fnl *finalizers, *splayed_finalizers;
static int num_fnls;

View File

@ -952,12 +952,9 @@ static int is_finalizable_page(void *p)
#include "fnls.c"
static Fnl *run_queue;
static Fnl *last_in_queue;
inline static void mark_finalizer_structs(void)
{
struct finalizer *fnl;
Fnl *fnl;
for(fnl = GC_resolve(finalizers); fnl; fnl = GC_resolve(fnl->next)) {
set_backtrace_source(fnl, BT_FINALIZER);
@ -965,28 +962,28 @@ inline static void mark_finalizer_structs(void)
set_backtrace_source(&finalizers, BT_ROOT);
gcMARK(fnl);
}
for(fnl = run_queue; fnl; fnl = fnl->next) {
for(fnl = GC->run_queue; fnl; fnl = fnl->next) {
set_backtrace_source(fnl, BT_FINALIZER);
gcMARK(fnl->data);
gcMARK(fnl->p);
set_backtrace_source(&run_queue, BT_ROOT);
set_backtrace_source(&GC->run_queue, BT_ROOT);
gcMARK(fnl);
}
}
inline static void repair_finalizer_structs(void)
{
struct finalizer *fnl;
Fnl *fnl;
/* repair the base parts of the list */
gcFIXUP(finalizers); gcFIXUP(run_queue);
gcFIXUP(finalizers); gcFIXUP(GC->run_queue);
/* then repair the stuff inside them */
for(fnl = finalizers; fnl; fnl = fnl->next) {
gcFIXUP(fnl->data);
gcFIXUP(fnl->p);
gcFIXUP(fnl->next);
}
for(fnl = run_queue; fnl; fnl = fnl->next) {
for(fnl = GC->run_queue; fnl; fnl = fnl->next) {
gcFIXUP(fnl->data);
gcFIXUP(fnl->p);
gcFIXUP(fnl->next);
@ -995,7 +992,8 @@ inline static void repair_finalizer_structs(void)
inline static void check_finalizers(int level)
{
struct finalizer *work = GC_resolve(finalizers), *prev = NULL;
Fnl *work = GC_resolve(finalizers);
Fnl *prev = NULL;
GCDEBUG((DEBUGOUTF, "CFNL: Checking level %i finalizers\n", level));
while(work) {
@ -1009,8 +1007,8 @@ inline static void check_finalizers(int level)
gcMARK(work->p);
if(prev) prev->next = next;
if(!prev) finalizers = next;
if(last_in_queue) last_in_queue = last_in_queue->next = work;
if(!last_in_queue) run_queue = last_in_queue = work;
if(GC->last_in_queue) GC->last_in_queue = GC->last_in_queue->next = work;
if(!GC->last_in_queue) GC->run_queue = GC->last_in_queue = work;
work->next = NULL;
--num_fnls;
@ -2469,7 +2467,7 @@ static void garbage_collect(int force_full)
TIME_DONE();
if (!run_queue)
if (!gc->run_queue)
next_gc_full = 0;
/* run any queued finalizers, EXCEPT in the case where this collection was
@ -2487,12 +2485,12 @@ static void garbage_collect(int force_full)
GC->park[0] = NULL;
GC->park[1] = NULL;
while(run_queue) {
while(gc->run_queue) {
struct finalizer *f;
void **gcs;
f = run_queue; run_queue = run_queue->next;
if(!run_queue) last_in_queue = NULL;
f = gc->run_queue; gc->run_queue = gc->run_queue->next;
if(!gc->run_queue) gc->last_in_queue = NULL;
GCDEBUG((DEBUGOUTF, "Running finalizers %p for pointer %p (lvl %i)\n",
f, f->p, f->eager_level));

View File

@ -71,11 +71,31 @@ typedef struct Gen0 {
unsigned long max_size;
} Gen0;
typedef struct finalizer {
char eager_level;
char tagged;
void *p;
GC_finalization_proc f;
void *data;
#if CHECKS
long size;
#endif
struct finalizer *next;
/* Patched after GC: */
struct finalizer *prev;
struct finalizer *left;
struct finalizer *right;
} Fnl;
typedef struct NewGC {
Gen0 gen0;
Mark_Proc *mark_table; /* the table of mark procs */
Fixup_Proc *fixup_table; /* the table of repair procs */
/* Finalization */
Fnl *run_queue;
Fnl *last_in_queue;
struct NewGC *primoridal_gc;
unsigned long max_heap_size;
unsigned long max_pages_in_heap;