]> git.llucax.com Git - z.facultad/75.00/informe.git/commitdiff
Corregir algoritmo para para guardar stack y registros de threads
authorLeandro Lucarella <llucax@gmail.com>
Thu, 30 Sep 2010 23:32:51 +0000 (20:32 -0300)
committerLeandro Lucarella <llucax@gmail.com>
Thu, 30 Sep 2010 23:32:51 +0000 (20:32 -0300)
source/dgc.rst

index d6d5878777e44a82271781d8acc25dae2d2ba676..6bf610527f9d3dfd28a7bdc0684948b1d4c0a4f3 100644 (file)
@@ -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*::