Move fnls statics to NewGC struct
svn: r12285
This commit is contained in:
parent
10a8d7ce76
commit
06f3c07d42
|
@ -2829,7 +2829,7 @@ static void init(void)
|
||||||
#if USE_FREELIST
|
#if USE_FREELIST
|
||||||
GC_register_traversers(gc_on_free_list_tag, size_on_free_list, size_on_free_list, size_on_free_list, 0, 0);
|
GC_register_traversers(gc_on_free_list_tag, size_on_free_list, size_on_free_list, size_on_free_list, 0, 0);
|
||||||
#endif
|
#endif
|
||||||
GC_add_roots(&finalizers, (char *)&finalizers + sizeof(finalizers) + 1);
|
GC_add_roots(&GC->finalizers, (char *)&GC->finalizers + sizeof(GC->finalizers) + 1);
|
||||||
GC_add_roots(&fnl_weaks, (char *)&fnl_weaks + sizeof(fnl_weaks) + 1);
|
GC_add_roots(&fnl_weaks, (char *)&fnl_weaks + sizeof(fnl_weaks) + 1);
|
||||||
GC_add_roots(&run_queue, (char *)&run_queue + sizeof(run_queue) + 1);
|
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(&last_in_queue, (char *)&last_in_queue + sizeof(last_in_queue) + 1);
|
||||||
|
@ -3049,7 +3049,7 @@ static void gcollect(int full)
|
||||||
|
|
||||||
{
|
{
|
||||||
Fnl *f;
|
Fnl *f;
|
||||||
for (f = finalizers; f; f = f->next) {
|
for (f = GC->finalizers; f; f = f->next) {
|
||||||
#if RECORD_MARK_SRC
|
#if RECORD_MARK_SRC
|
||||||
mark_src = f;
|
mark_src = f;
|
||||||
mark_type = MTYPE_FINALIZER;
|
mark_type = MTYPE_FINALIZER;
|
||||||
|
@ -3108,7 +3108,7 @@ static void gcollect(int full)
|
||||||
/* Propagate all marks. */
|
/* Propagate all marks. */
|
||||||
propagate_all_mpages();
|
propagate_all_mpages();
|
||||||
|
|
||||||
if ((did_fnls >= 3) || !finalizers) {
|
if ((did_fnls >= 3) || !GC->finalizers) {
|
||||||
if (did_fnls == 3) {
|
if (did_fnls == 3) {
|
||||||
/* Finish up ordered finalization */
|
/* Finish up ordered finalization */
|
||||||
Fnl *f, *next, *prev;
|
Fnl *f, *next, *prev;
|
||||||
|
@ -3117,7 +3117,7 @@ static void gcollect(int full)
|
||||||
/* Enqueue and mark level 3 finalizers that still haven't been marked. */
|
/* Enqueue and mark level 3 finalizers that still haven't been marked. */
|
||||||
/* (Recursive marking is already done, though.) */
|
/* (Recursive marking is already done, though.) */
|
||||||
prev = NULL;
|
prev = NULL;
|
||||||
for (f = finalizers; f; f = next) {
|
for (f = GC->finalizers; f; f = next) {
|
||||||
next = f->next;
|
next = f->next;
|
||||||
if (f->eager_level == 3) {
|
if (f->eager_level == 3) {
|
||||||
if (!is_marked(f->p)) {
|
if (!is_marked(f->p)) {
|
||||||
|
@ -3131,7 +3131,7 @@ static void gcollect(int full)
|
||||||
if (prev)
|
if (prev)
|
||||||
prev->next = next;
|
prev->next = next;
|
||||||
else
|
else
|
||||||
finalizers = next;
|
GC->finalizers = next;
|
||||||
|
|
||||||
f->eager_level = 0; /* indicates queued */
|
f->eager_level = 0; /* indicates queued */
|
||||||
|
|
||||||
|
@ -3193,7 +3193,7 @@ static void gcollect(int full)
|
||||||
|
|
||||||
/* Mark content of not-yet-marked finalized objects,
|
/* Mark content of not-yet-marked finalized objects,
|
||||||
but don't mark the finalized objects themselves. */
|
but don't mark the finalized objects themselves. */
|
||||||
for (f = finalizers; f; f = f->next) {
|
for (f = GC->finalizers; f; f = f->next) {
|
||||||
if (f->eager_level == 3) {
|
if (f->eager_level == 3) {
|
||||||
#if RECORD_MARK_SRC
|
#if RECORD_MARK_SRC
|
||||||
mark_src = f;
|
mark_src = f;
|
||||||
|
@ -3219,7 +3219,7 @@ static void gcollect(int full)
|
||||||
/* Unordered finalization */
|
/* Unordered finalization */
|
||||||
Fnl *f, *prev, *queue;
|
Fnl *f, *prev, *queue;
|
||||||
|
|
||||||
f = finalizers;
|
f = GC->finalizers;
|
||||||
prev = NULL;
|
prev = NULL;
|
||||||
queue = NULL;
|
queue = NULL;
|
||||||
|
|
||||||
|
@ -3232,7 +3232,7 @@ static void gcollect(int full)
|
||||||
if (prev)
|
if (prev)
|
||||||
prev->next = next;
|
prev->next = next;
|
||||||
else
|
else
|
||||||
finalizers = next;
|
GC->finalizers = next;
|
||||||
|
|
||||||
f->eager_level = 0; /* indicates queued */
|
f->eager_level = 0; /* indicates queued */
|
||||||
|
|
||||||
|
@ -3408,7 +3408,7 @@ static void gcollect(int full)
|
||||||
|
|
||||||
{
|
{
|
||||||
Fnl *f;
|
Fnl *f;
|
||||||
for (f = finalizers; f; f = f->next) {
|
for (f = GC->finalizers; f; f = f->next) {
|
||||||
#if CHECKS
|
#if CHECKS
|
||||||
fnl_count++;
|
fnl_count++;
|
||||||
#endif
|
#endif
|
||||||
|
@ -3524,7 +3524,7 @@ static void gcollect(int full)
|
||||||
run_queue = run_queue->next;
|
run_queue = run_queue->next;
|
||||||
if (!run_queue)
|
if (!run_queue)
|
||||||
last_in_queue = NULL;
|
last_in_queue = NULL;
|
||||||
--num_fnls;
|
--GC->num_fnls;
|
||||||
|
|
||||||
gcs = GC_variable_stack;
|
gcs = GC_variable_stack;
|
||||||
f->f(f->p, f->data);
|
f->f(f->p, f->data);
|
||||||
|
@ -4700,7 +4700,7 @@ void GC_dump_with_traces(int flags,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
GCPRINT(GCOUTF, "Active fnls: %d\n", num_fnls);
|
GCPRINT(GCOUTF, "Active fnls: %d\n", GC->num_fnls);
|
||||||
GCPRINT(GCOUTF, "Active fnl weak links: %d\n", fnl_weak_link_count);
|
GCPRINT(GCOUTF, "Active fnl weak links: %d\n", fnl_weak_link_count);
|
||||||
|
|
||||||
if (memory_in_use > max_memory_use)
|
if (memory_in_use > max_memory_use)
|
||||||
|
|
|
@ -1,6 +1,11 @@
|
||||||
#include "commongc_internal.h"
|
#include "commongc_internal.h"
|
||||||
|
|
||||||
typedef struct CompactGC {
|
typedef struct CompactGC {
|
||||||
|
/* Common with NewGC */
|
||||||
|
Fnl *finalizers;
|
||||||
|
Fnl *splayed_finalizers;
|
||||||
|
int num_fnls;
|
||||||
|
|
||||||
void *park[2];
|
void *park[2];
|
||||||
void *park_save[2];
|
void *park_save[2];
|
||||||
|
|
||||||
|
|
|
@ -11,9 +11,6 @@
|
||||||
park
|
park
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static Fnl *finalizers, *splayed_finalizers;
|
|
||||||
static int num_fnls;
|
|
||||||
|
|
||||||
#define Tree Fnl
|
#define Tree Fnl
|
||||||
#define Splay_Item(t) ((unsigned long)t->p)
|
#define Splay_Item(t) ((unsigned long)t->p)
|
||||||
#define Set_Splay_Item(t, v) (t)->p = (void *)v
|
#define Set_Splay_Item(t, v) (t)->p = (void *)v
|
||||||
|
@ -26,8 +23,8 @@ static int num_fnls;
|
||||||
#undef splay_delete
|
#undef splay_delete
|
||||||
|
|
||||||
void GC_set_finalizer(void *p, int tagged, int level, void (*f)(void *p, void *data),
|
void GC_set_finalizer(void *p, int tagged, int level, void (*f)(void *p, void *data),
|
||||||
void *data, void (**oldf)(void *p, void *data),
|
void *data, void (**oldf)(void *p, void *data),
|
||||||
void **olddata)
|
void **olddata)
|
||||||
{
|
{
|
||||||
Fnl *fnl;
|
Fnl *fnl;
|
||||||
|
|
||||||
|
@ -38,8 +35,8 @@ void GC_set_finalizer(void *p, int tagged, int level, void (*f)(void *p, void *d
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
splayed_finalizers = fnl_splay((unsigned long)p, splayed_finalizers);
|
GC->splayed_finalizers = fnl_splay((unsigned long)p, GC->splayed_finalizers);
|
||||||
fnl = splayed_finalizers;
|
fnl = GC->splayed_finalizers;
|
||||||
if (fnl && (fnl->p == p)) {
|
if (fnl && (fnl->p == p)) {
|
||||||
if (oldf) *oldf = fnl->f;
|
if (oldf) *oldf = fnl->f;
|
||||||
if (olddata) *olddata = fnl->data;
|
if (olddata) *olddata = fnl->data;
|
||||||
|
@ -48,18 +45,20 @@ void GC_set_finalizer(void *p, int tagged, int level, void (*f)(void *p, void *d
|
||||||
fnl->data = data;
|
fnl->data = data;
|
||||||
fnl->eager_level = level;
|
fnl->eager_level = level;
|
||||||
} else {
|
} else {
|
||||||
|
/* remove finalizer */
|
||||||
if (fnl->prev)
|
if (fnl->prev)
|
||||||
fnl->prev->next = fnl->next;
|
fnl->prev->next = fnl->next;
|
||||||
else
|
else
|
||||||
finalizers = fnl->next;
|
GC->finalizers = fnl->next;
|
||||||
if (fnl->next)
|
if (fnl->next)
|
||||||
fnl->next->prev = fnl->prev;
|
fnl->next->prev = fnl->prev;
|
||||||
--num_fnls;
|
|
||||||
splayed_finalizers = fnl_splay_delete((unsigned long)p, splayed_finalizers);
|
--GC->num_fnls;
|
||||||
|
GC->splayed_finalizers = fnl_splay_delete((unsigned long)p, GC->splayed_finalizers);
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (oldf) *oldf = NULL;
|
if (oldf) *oldf = NULL;
|
||||||
if (olddata) *olddata = NULL;
|
if (olddata) *olddata = NULL;
|
||||||
|
|
||||||
|
@ -78,11 +77,6 @@ void GC_set_finalizer(void *p, int tagged, int level, void (*f)(void *p, void *d
|
||||||
GC->park[0] = NULL;
|
GC->park[0] = NULL;
|
||||||
GC->park[1] = NULL;
|
GC->park[1] = NULL;
|
||||||
|
|
||||||
fnl->next = finalizers;
|
|
||||||
fnl->prev = NULL;
|
|
||||||
if (finalizers) {
|
|
||||||
finalizers->prev = fnl;
|
|
||||||
}
|
|
||||||
|
|
||||||
fnl->p = p;
|
fnl->p = p;
|
||||||
fnl->f = f;
|
fnl->f = f;
|
||||||
|
@ -98,41 +92,49 @@ void GC_set_finalizer(void *p, int tagged, int level, void (*f)(void *p, void *d
|
||||||
|
|
||||||
if (tagged) {
|
if (tagged) {
|
||||||
if (m->type != MTYPE_TAGGED) {
|
if (m->type != MTYPE_TAGGED) {
|
||||||
GCPRINT(GCOUTF, "Not tagged: %lx (%d)\n",
|
GCPRINT(GCOUTF, "Not tagged: %lx (%d)\n",
|
||||||
(long)p, m->type);
|
(long)p, m->type);
|
||||||
CRASH(4);
|
CRASH(4);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (m->type != MTYPE_XTAGGED) {
|
if (m->type != MTYPE_XTAGGED) {
|
||||||
GCPRINT(GCOUTF, "Not xtagged: %lx (%d)\n",
|
GCPRINT(GCOUTF, "Not xtagged: %lx (%d)\n",
|
||||||
(long)p, m->type);
|
(long)p, m->type);
|
||||||
CRASH(5);
|
CRASH(5);
|
||||||
}
|
}
|
||||||
if (m->flags & MFLAG_BIGBLOCK)
|
if (m->flags & MFLAG_BIGBLOCK)
|
||||||
fnl->size = m->u.size;
|
fnl->size = m->u.size;
|
||||||
else
|
else
|
||||||
fnl->size = ((long *)p)[-1];
|
fnl->size = ((long *)p)[-1];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
finalizers = fnl;
|
/* push finalizer */
|
||||||
splayed_finalizers = fnl_splay_insert((unsigned long)p, fnl, splayed_finalizers);
|
fnl->next = GC->finalizers;
|
||||||
|
fnl->prev = NULL;
|
||||||
|
if (GC->finalizers) {
|
||||||
|
GC->finalizers->prev = fnl;
|
||||||
|
}
|
||||||
|
GC->finalizers = fnl;
|
||||||
|
|
||||||
num_fnls++;
|
GC->splayed_finalizers = fnl_splay_insert((unsigned long)p, fnl, GC->splayed_finalizers);
|
||||||
|
|
||||||
|
GC->num_fnls++;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void reset_finalizer_tree()
|
static void reset_finalizer_tree()
|
||||||
/* After a GC, rebuild the splay tree, since object addresses
|
/* After a GC, rebuild the splay tree, since object addresses
|
||||||
have moved. */
|
have moved. */
|
||||||
{
|
{
|
||||||
Fnl *fnl, *prev = NULL;
|
Fnl *fnl;
|
||||||
|
Fnl *prev = NULL;
|
||||||
|
|
||||||
splayed_finalizers = NULL;
|
GC->splayed_finalizers = NULL;
|
||||||
|
|
||||||
for (fnl = finalizers; fnl; fnl = fnl->next) {
|
for (fnl = GC->finalizers; fnl; fnl = fnl->next) {
|
||||||
fnl->prev = prev;
|
fnl->prev = prev;
|
||||||
splayed_finalizers = fnl_splay_insert((unsigned long)fnl->p, fnl, splayed_finalizers);
|
GC->splayed_finalizers = fnl_splay_insert((unsigned long)fnl->p, fnl, GC->splayed_finalizers);
|
||||||
prev = fnl;
|
prev = fnl;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -975,10 +975,10 @@ inline static void mark_finalizer_structs(void)
|
||||||
{
|
{
|
||||||
Fnl *fnl;
|
Fnl *fnl;
|
||||||
|
|
||||||
for(fnl = GC_resolve(finalizers); fnl; fnl = GC_resolve(fnl->next)) {
|
for(fnl = GC_resolve(GC->finalizers); fnl; fnl = GC_resolve(fnl->next)) {
|
||||||
set_backtrace_source(fnl, BT_FINALIZER);
|
set_backtrace_source(fnl, BT_FINALIZER);
|
||||||
gcMARK(fnl->data);
|
gcMARK(fnl->data);
|
||||||
set_backtrace_source(&finalizers, BT_ROOT);
|
set_backtrace_source(&GC->finalizers, BT_ROOT);
|
||||||
gcMARK(fnl);
|
gcMARK(fnl);
|
||||||
}
|
}
|
||||||
for(fnl = GC->run_queue; fnl; fnl = fnl->next) {
|
for(fnl = GC->run_queue; fnl; fnl = fnl->next) {
|
||||||
|
@ -995,9 +995,9 @@ inline static void repair_finalizer_structs(void)
|
||||||
Fnl *fnl;
|
Fnl *fnl;
|
||||||
|
|
||||||
/* repair the base parts of the list */
|
/* repair the base parts of the list */
|
||||||
gcFIXUP(finalizers); gcFIXUP(GC->run_queue);
|
gcFIXUP(GC->finalizers); gcFIXUP(GC->run_queue);
|
||||||
/* then repair the stuff inside them */
|
/* then repair the stuff inside them */
|
||||||
for(fnl = finalizers; fnl; fnl = fnl->next) {
|
for(fnl = GC->finalizers; fnl; fnl = fnl->next) {
|
||||||
gcFIXUP(fnl->data);
|
gcFIXUP(fnl->data);
|
||||||
gcFIXUP(fnl->p);
|
gcFIXUP(fnl->p);
|
||||||
gcFIXUP(fnl->next);
|
gcFIXUP(fnl->next);
|
||||||
|
@ -1011,7 +1011,7 @@ inline static void repair_finalizer_structs(void)
|
||||||
|
|
||||||
inline static void check_finalizers(int level)
|
inline static void check_finalizers(int level)
|
||||||
{
|
{
|
||||||
Fnl *work = GC_resolve(finalizers);
|
Fnl *work = GC_resolve(GC->finalizers);
|
||||||
Fnl *prev = NULL;
|
Fnl *prev = NULL;
|
||||||
|
|
||||||
GCDEBUG((DEBUGOUTF, "CFNL: Checking level %i finalizers\n", level));
|
GCDEBUG((DEBUGOUTF, "CFNL: Checking level %i finalizers\n", level));
|
||||||
|
@ -1025,11 +1025,11 @@ inline static void check_finalizers(int level)
|
||||||
set_backtrace_source(work, BT_FINALIZER);
|
set_backtrace_source(work, BT_FINALIZER);
|
||||||
gcMARK(work->p);
|
gcMARK(work->p);
|
||||||
if(prev) prev->next = next;
|
if(prev) prev->next = next;
|
||||||
if(!prev) finalizers = next;
|
if(!prev) GC->finalizers = next;
|
||||||
if(GC->last_in_queue) GC->last_in_queue = GC->last_in_queue->next = 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;
|
if(!GC->last_in_queue) GC->run_queue = GC->last_in_queue = work;
|
||||||
work->next = NULL;
|
work->next = NULL;
|
||||||
--num_fnls;
|
--GC->num_fnls;
|
||||||
|
|
||||||
work = next;
|
work = next;
|
||||||
} else {
|
} else {
|
||||||
|
@ -1047,7 +1047,7 @@ inline static void do_ordered_level3(void)
|
||||||
struct finalizer *temp;
|
struct finalizer *temp;
|
||||||
Mark_Proc *mark_table = GC->mark_table;
|
Mark_Proc *mark_table = GC->mark_table;
|
||||||
|
|
||||||
for(temp = GC_resolve(finalizers); temp; temp = GC_resolve(temp->next))
|
for(temp = GC_resolve(GC->finalizers); temp; temp = GC_resolve(temp->next))
|
||||||
if(!marked(temp->p)) {
|
if(!marked(temp->p)) {
|
||||||
GCDEBUG((DEBUGOUTF,
|
GCDEBUG((DEBUGOUTF,
|
||||||
"LVL3: %p is not marked. Marking payload (%p)\n",
|
"LVL3: %p is not marked. Marking payload (%p)\n",
|
||||||
|
@ -1839,7 +1839,7 @@ void GC_dump_with_traces(int flags,
|
||||||
GC->actual_pages_size - (GC->used_pages * APAGE_SIZE)));
|
GC->actual_pages_size - (GC->used_pages * APAGE_SIZE)));
|
||||||
GCWARN((GCOUTF,"# of major collections: %li\n", GC->num_major_collects));
|
GCWARN((GCOUTF,"# of major collections: %li\n", GC->num_major_collects));
|
||||||
GCWARN((GCOUTF,"# of minor collections: %li\n", GC->num_minor_collects));
|
GCWARN((GCOUTF,"# of minor collections: %li\n", GC->num_minor_collects));
|
||||||
GCWARN((GCOUTF,"# of installed finalizers: %i\n", num_fnls));
|
GCWARN((GCOUTF,"# of installed finalizers: %i\n", GC->num_fnls));
|
||||||
GCWARN((GCOUTF,"# of traced ephemerons: %i\n", num_last_seen_ephemerons));
|
GCWARN((GCOUTF,"# of traced ephemerons: %i\n", num_last_seen_ephemerons));
|
||||||
|
|
||||||
if (flags & GC_DUMP_SHOW_TRACE) {
|
if (flags & GC_DUMP_SHOW_TRACE) {
|
||||||
|
|
|
@ -140,6 +140,10 @@ typedef struct NewGC {
|
||||||
GC_Immobile_Box *immobile_boxes;
|
GC_Immobile_Box *immobile_boxes;
|
||||||
|
|
||||||
/* Common with CompactGC */
|
/* Common with CompactGC */
|
||||||
|
Fnl *finalizers;
|
||||||
|
Fnl *splayed_finalizers;
|
||||||
|
int num_fnls;
|
||||||
|
|
||||||
void *park[2];
|
void *park[2];
|
||||||
void *park_save[2];
|
void *park_save[2];
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user