Fixed off-by-one error WRT last read/write

This commit is contained in:
Justin Ethier 2015-12-01 03:07:34 -05:00
parent ae46e39c45
commit e29633f2b2

14
gc.c
View file

@ -931,18 +931,18 @@ void gc_collector_trace()
pthread_mutex_lock(&(m->lock)); pthread_mutex_lock(&(m->lock));
while (m->last_read < m->last_write) { while (m->last_read < m->last_write) {
clean = 0; clean = 0;
(m->last_read)++; //TODO: I think there is an off-by-one error here. inspect last read/write.
TODO: I think there is an off-by-one error here. inspect last read/write. //is the code going one too many? per paper it is not, but based on
is the code going one too many? per paper it is not, but based on //logs it looks like it is reading past end of buffer. (ie, errors always seem
logs it looks like it is reading past end of buffer. (ie, errors always seem //to be on the last object traced, and checking the history, an object
to be on the last object traced, and checking the history, an object //incorrectly marked at position X can be seen to have been stored at position
incorrectly marked at position X can be seen to have been stored at position //X in a previous collection.
X in a previous collection.
printf("gc_mark_black mark buffer %p, last_read = %d last_write = %d\n", printf("gc_mark_black mark buffer %p, last_read = %d last_write = %d\n",
(m->mark_buffer)[m->last_read], (m->mark_buffer)[m->last_read],
m->last_read, m->last_write); m->last_read, m->last_write);
gc_mark_black((m->mark_buffer)[m->last_read]); gc_mark_black((m->mark_buffer)[m->last_read]);
gc_empty_collector_stack(); gc_empty_collector_stack();
(m->last_read)++; // Inc here to try to prevent off-by-one errors
} }
pthread_mutex_unlock(&(m->lock)); pthread_mutex_unlock(&(m->lock));
} }