move handles to a separate handle stack.

This commit is contained in:
Vitor Santos Costa
2015-01-30 07:25:34 +00:00
parent 9f945c152d
commit 36e4cbf98b
21 changed files with 290 additions and 360 deletions

82
C/heapgc.c Executable file → Normal file
View File

@@ -44,11 +44,11 @@ static void mark_external_reference(CELL * CACHE_TYPE);
static void mark_db_fixed(CELL * CACHE_TYPE);
static void mark_regs(tr_fr_ptr CACHE_TYPE);
static void mark_trail(tr_fr_ptr, tr_fr_ptr, CELL *, choiceptr CACHE_TYPE);
static void mark_environments(CELL *, OPREG, CELL * CACHE_TYPE);
static void mark_environments(CELL *, size_t, CELL * CACHE_TYPE);
static void mark_choicepoints(choiceptr, tr_fr_ptr, int CACHE_TYPE);
static void into_relocation_chain(CELL *, CELL * CACHE_TYPE);
static void sweep_trail(choiceptr, tr_fr_ptr CACHE_TYPE);
static void sweep_environments(CELL *, OPREG, CELL * CACHE_TYPE);
static void sweep_environments(CELL *, size_t, CELL * CACHE_TYPE);
static void sweep_choicepoints(choiceptr CACHE_TYPE);
static void compact_heap( CACHE_TYPE1 );
static void update_relocation_chain(CELL *, CELL * CACHE_TYPE);
@@ -446,8 +446,17 @@ push_registers(Int num_regs, yamop *nextop USES_REGS)
TrailTerm(TR+1) = LOCAL_AttsMutableList;
TR += 2;
#endif
{
CELL *curslot = LOCAL_SlotBase,
*topslot = LOCAL_SlotBase + LOCAL_CurSlot;
while (curslot < topslot) {
// printf("%p <- %p\n", TR, topslot);
check_pr_trail(TR PASS_REGS);
TrailTerm(TR++) = *curslot++;
}
}
for (i = 1; i <= num_regs; i++) {
check_pr_trail(TR PASS_REGS);
check_pr_trail(TR PASS_REGS);
TrailTerm(TR++) = (CELL) XREGS[i];
}
/* push any live registers we might have hanging around */
@@ -544,6 +553,16 @@ pop_registers(Int num_regs, yamop *nextop USES_REGS)
LOCAL_AttsMutableList = TrailTerm(ptr++);
#endif
#endif
// copy slots back
{
CELL *curslot = LOCAL_SlotBase,
*topslot = LOCAL_SlotBase + LOCAL_CurSlot;
while (curslot < topslot) {
*curslot++ = TrailTerm(ptr++);
}
}
for (i = 1; i <= num_regs; i++)
XREGS[i] = TrailTerm(ptr++);
/* pop any live registers we might have hanging around */
@@ -1553,14 +1572,14 @@ mark_regs(tr_fr_ptr old_TR USES_REGS)
/* mark all heap objects accessible from a chain of environments */
static void
mark_environments(CELL_PTR gc_ENV, OPREG size, CELL *pvbmap USES_REGS)
mark_environments(CELL_PTR gc_ENV, size_t size, CELL *pvbmap USES_REGS)
{
CELL_PTR saved_var;
while (gc_ENV != NULL) { /* no more environments */
Int bmap = 0;
int currv = 0;
// printf("MARK %p--%p\n", gc_ENV, gc_ENV-size);
//fprintf(stderr,"ENV %p %ld\n", gc_ENV, size);
#ifdef DEBUG
if (size < 0 || size > 512)
fprintf(stderr,"OOPS in GC: env size for %p is " UInt_FORMAT "\n", gc_ENV, (CELL)size);
@@ -1706,7 +1725,7 @@ mark_trail(tr_fr_ptr trail_ptr, tr_fr_ptr trail_base, CELL *gc_H, choiceptr gc_B
RESET_VARIABLE(&TrailVal(trail_base));
#endif
} else if (hp < (CELL *)LOCAL_GlobalBase || hp > (CELL *)LOCAL_TrailTop) {
/* pointers from the Heap back into the trail are process in mark_regs. */
/* pointers from the Heap back into the trail are process in mark_regs. */
/* do nothing !!! */
} else if ((hp < (CELL *)gc_B && hp >= gc_H) || hp > (CELL *)LOCAL_TrailBase) {
/* clean the trail, avoid dangling pointers! */
@@ -1916,24 +1935,6 @@ mark_trail(tr_fr_ptr trail_ptr, tr_fr_ptr trail_base, CELL *gc_H, choiceptr gc_B
#endif /* TABLING */
static void
mark_slots( USES_REGS1 )
{
Int curslot = LOCAL_CurSlot;
while (curslot) {
CELL *ptr = LCL0-curslot;
Int ns = IntegerOfTerm(ptr[-1]);
curslot = IntegerOfTerm(ptr[0]);
ptr-=2;
while (ns > 0) {
mark_external_reference(ptr PASS_REGS);
ptr--;
ns--;
}
}
}
#ifdef TABLING
static choiceptr
youngest_cp(choiceptr gc_B, dep_fr_ptr *depfrp)
@@ -1980,6 +1981,10 @@ mark_choicepoints(register choiceptr gc_B, tr_fr_ptr saved_TR, int very_verbose
register OPCODE op;
yamop *rtp = gc_B->cp_ap;
/* if (gc_B->cp_ap) */
/* fprintf(stderr,"B %p->%p %s\n", gc_B, gc_B->cp_b, Yap_op_names[Yap_op_from_opcode(gc_B->cp_ap->opc)]) ; */
/* else */
/* fprintf(stderr,"B %p->%p\n", gc_B, gc_B->cp_b); */
mark_db_fixed((CELL *)rtp PASS_REGS);
#ifdef DETERMINISTIC_TABLING
if (!IS_DET_GEN_CP(gc_B))
@@ -2866,7 +2871,7 @@ sweep_trail(choiceptr gc_B, tr_fr_ptr old_TR USES_REGS)
*/
static void
sweep_environments(CELL_PTR gc_ENV, OPREG size, CELL *pvbmap USES_REGS)
sweep_environments(CELL_PTR gc_ENV, size_t size, CELL *pvbmap USES_REGS)
{
CELL_PTR saved_var;
@@ -2928,29 +2933,6 @@ sweep_environments(CELL_PTR gc_ENV, OPREG size, CELL *pvbmap USES_REGS)
}
}
static void
sweep_slots( USES_REGS1 )
{
Int curslot = LOCAL_CurSlot;
while (curslot) {
CELL *ptr = LCL0-curslot;
Int ns = IntOfTerm(ptr[-1]);
curslot = IntegerOfTerm(ptr[0]);
ptr-=2;
while (ns > 0) {
CELL cp_cell = *ptr;
if (MARKED_PTR(ptr)) {
UNMARK(ptr);
if (HEAP_PTR(cp_cell)) {
into_relocation_chain(ptr, GET_NEXT(cp_cell) PASS_REGS);
}
}
ptr--;
ns--;
}
}
}
static void
sweep_b(choiceptr gc_B, UInt arity USES_REGS)
{
@@ -3816,7 +3798,6 @@ marking_phase(tr_fr_ptr old_TR, CELL *current_env, yamop *curp USES_REGS)
LOCAL_cont_top = (cont *)LOCAL_db_vec;
/* These two must be marked first so that our trail optimisation won't lose
values */
mark_slots( PASS_REGS1 );
mark_regs(old_TR PASS_REGS); /* active registers & trail */
/* active environments */
mark_environments(current_env, EnvSize(curp), EnvBMap(curp) PASS_REGS);
@@ -3869,7 +3850,6 @@ compaction_phase(tr_fr_ptr old_TR, CELL *current_env, yamop *curp USES_REGS)
sweep_oldgen(LOCAL_HGEN, CurrentH0 PASS_REGS);
}
}
sweep_slots( PASS_REGS1 );
sweep_environments(current_env, EnvSize(curp), EnvBMap(curp) PASS_REGS);
sweep_choicepoints(B PASS_REGS);
sweep_trail(B, old_TR PASS_REGS);
@@ -4344,5 +4324,5 @@ void
Yap_inc_mark_variable()
{
CACHE_REGS
LOCAL_total_marked++;
LOCAL_total_marked++;
}