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));
while (m->last_read < m->last_write) {
clean = 0;
(m->last_read)++;
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
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
incorrectly marked at position X can be seen to have been stored at position
X in a previous collection.
//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
//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
//incorrectly marked at position X can be seen to have been stored at position
//X in a previous collection.
printf("gc_mark_black mark buffer %p, last_read = %d last_write = %d\n",
(m->mark_buffer)[m->last_read],
m->last_read, m->last_write);
gc_mark_black((m->mark_buffer)[m->last_read]);
gc_empty_collector_stack();
(m->last_read)++; // Inc here to try to prevent off-by-one errors
}
pthread_mutex_unlock(&(m->lock));
}