From: Leandro Lucarella Date: Thu, 30 Sep 2010 23:32:51 +0000 (-0300) Subject: Corregir algoritmo para para guardar stack y registros de threads X-Git-Tag: entrega-2010-10-08~12 X-Git-Url: https://git.llucax.com/z.facultad/75.00/informe.git/commitdiff_plain/28c246317c41d53b3439ebd0c82619140d168441?ds=sidebyside Corregir algoritmo para para guardar stack y registros de threads --- diff --git a/source/dgc.rst b/source/dgc.rst index d6d5878..6bf6105 100644 --- a/source/dgc.rst +++ b/source/dgc.rst @@ -461,7 +461,9 @@ algoritmo:: mark_free_lists() mark_static_data() push_registers_into_stack() + thread_self.stack.end = get_stack_top() mark_stacks() + pop_registers_from_stack() mark_user_roots() mark_heap() start_the_world() @@ -471,15 +473,24 @@ debe finalizar: la función ``mark_range()`` (que veremos más adelante) lo pone en ``true`` cuando una nueva celda debe ser visitada, por lo tanto la iteración se interrumpe cuando no hay más celdas por visitar. -Las funciones ``stop_the_world()`` y ``start_the_world()`` sencillamente -pausan y reanudan todos los hilos respectivamente:: +Las funciones ``stop_the_world()`` y ``start_the_world()`` pausan y reanudan +todos los hilos respectivamente (salvo el actual). Al pausar los hilos además +se guardan los registros del procesador en el *stack* y se guarda la posición +actual del *stack* para que la fase de marcado pueda recorrerlos:: function stop_the_world() is foreach thread in threads + if thread is thread_self + continue thread.pause() + push_registers_into_stack() + thread.stack.end = get_stack_top() function start_the_world() is foreach thread in threads + if thread is thread_self + continue + pop_registers_from_stack() thread.resume() La función ``clear_mark_scan_bits()`` se encarga de restablecer todos los @@ -526,6 +537,13 @@ en el *stack* a través de la función:: foreach register in registers push(register) +Y luego se descartan (no es necesario ni correcto restablecer los valores ya +que podrían tener nuevos valores) al sacarlos de la pila:: + + function pop_registers_from_stack() is + foreach register in reverse(registers) + pop() + Una vez hecho esto, basta marcar (de forma conservativa) los *stacks* de todos los threads para terminar de marcar el *root set*::