Skip to content

Commit

Permalink
erts: Polish GC rootset interation
Browse files Browse the repository at this point in the history
  • Loading branch information
sverker committed Jan 19, 2018
1 parent b204478 commit 17cdb96
Showing 1 changed file with 24 additions and 41 deletions.
65 changes: 24 additions & 41 deletions erts/emulator/beam/erl_gc.c
Expand Up @@ -1161,7 +1161,7 @@ erts_garbage_collect_literals(Process* p, Eterm* literals,

roots++;

while (g_sz--) {
for ( ; g_sz--; g_ptr++) {
Eterm gval = *g_ptr;

switch (primary_tag(gval)) {
Expand All @@ -1170,26 +1170,21 @@ erts_garbage_collect_literals(Process* p, Eterm* literals,
val = *ptr;
if (IS_MOVED_BOXED(val)) {
ASSERT(is_boxed(val));
*g_ptr++ = val;
*g_ptr = val;
} else if (ErtsInArea(ptr, area, area_size)) {
move_boxed(ptr,val,&old_htop,g_ptr++);
} else {
g_ptr++;
move_boxed(ptr,val,&old_htop,g_ptr);
}
break;
case TAG_PRIMARY_LIST:
ptr = list_val(gval);
val = *ptr;
if (IS_MOVED_CONS(val)) { /* Moved */
*g_ptr++ = ptr[1];
*g_ptr = ptr[1];
} else if (ErtsInArea(ptr, area, area_size)) {
move_cons(ptr,val,&old_htop,g_ptr++);
} else {
g_ptr++;
}
move_cons(ptr,val,&old_htop,g_ptr);
}
break;
default:
g_ptr++;
break;
}
}
Expand Down Expand Up @@ -1497,7 +1492,7 @@ do_minor(Process *p, ErlHeapFragment *live_hf_end,
Uint g_sz = roots->sz;

roots++;
while (g_sz--) {
for ( ; g_sz--; g_ptr++) {
gval = *g_ptr;

switch (primary_tag(gval)) {
Expand All @@ -1507,34 +1502,28 @@ do_minor(Process *p, ErlHeapFragment *live_hf_end,
val = *ptr;
if (IS_MOVED_BOXED(val)) {
ASSERT(is_boxed(val));
*g_ptr++ = val;
*g_ptr = val;
} else if (ErtsInArea(ptr, mature, mature_size)) {
move_boxed(ptr,val,&old_htop,g_ptr++);
move_boxed(ptr,val,&old_htop,g_ptr);
} else if (ErtsInYoungGen(gval, ptr, oh, oh_size)) {
move_boxed(ptr,val,&n_htop,g_ptr++);
} else {
g_ptr++;
}
move_boxed(ptr,val,&n_htop,g_ptr);
}
break;
}

case TAG_PRIMARY_LIST: {
ptr = list_val(gval);
val = *ptr;
if (IS_MOVED_CONS(val)) { /* Moved */
*g_ptr++ = ptr[1];
*g_ptr = ptr[1];
} else if (ErtsInArea(ptr, mature, mature_size)) {
move_cons(ptr,val,&old_htop,g_ptr++);
move_cons(ptr,val,&old_htop,g_ptr);
} else if (ErtsInYoungGen(gval, ptr, oh, oh_size)) {
move_cons(ptr,val,&n_htop,g_ptr++);
} else {
g_ptr++;
}
move_cons(ptr,val,&n_htop,g_ptr);
}
break;
}

default:
g_ptr++;
break;
}
}
Expand Down Expand Up @@ -1818,7 +1807,7 @@ full_sweep_heaps(Process *p,
Eterm g_sz = roots->sz;

roots++;
while (g_sz--) {
for ( ; g_sz--; g_ptr++) {
Eterm* ptr;
Eterm val;
Eterm gval = *g_ptr;
Expand All @@ -1830,32 +1819,26 @@ full_sweep_heaps(Process *p,
val = *ptr;
if (IS_MOVED_BOXED(val)) {
ASSERT(is_boxed(val));
*g_ptr++ = val;
*g_ptr = val;
} else if (!erts_is_literal(gval, ptr)) {
move_boxed(ptr,val,&n_htop,g_ptr++);
} else {
g_ptr++;
move_boxed(ptr,val,&n_htop,g_ptr);
}
continue;
break;
}

case TAG_PRIMARY_LIST: {
ptr = list_val(gval);
val = *ptr;
if (IS_MOVED_CONS(val)) {
*g_ptr++ = ptr[1];
*g_ptr = ptr[1];
} else if (!erts_is_literal(gval, ptr)) {
move_cons(ptr,val,&n_htop,g_ptr++);
} else {
g_ptr++;
move_cons(ptr,val,&n_htop,g_ptr);
}
continue;
break;
}

default: {
g_ptr++;
continue;
}
default:
break;
}
}
}
Expand Down

0 comments on commit 17cdb96

Please sign in to comment.