]> git.llucax.com Git - z.facultad/75.00/informe.git/blobdiff - source/gc.rst
Agregar más tipos de referencia a la extensión vref
[z.facultad/75.00/informe.git] / source / gc.rst
index 4f9f91a82bab24e1629a535638e1ca2d05b24221..96da51bc7cba15b9c756bfcb71680884804a9e41 100644 (file)
@@ -10,6 +10,8 @@ Recolección de basura
 ============================================================================
 
 
+.. _ref_gc_intro:
+
 Introducción
 ----------------------------------------------------------------------------
 
@@ -183,6 +185,7 @@ normalmente se lo llama *mutator* (mutador).
 
 
 
+.. _ref_gc_intro_mark:
 
 Recorrido del grafo de conectividad
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -328,14 +331,14 @@ Un algoritmo simple (recursivo) de marcado *primero a lo alto*  puede ser
 el siguiente (asumiendo que partimos con todos los vértices sin marcar)
 [#gcpseudo]_::
 
-   mark(v)
+   function mark(v) is
       if not v.marked
          v.marked = true
          for (src, dst) in v.edges
             mark(dst)
 
-   mark_phase()
-      for r in root_set
+   function mark_phase() is
+      foreach r in root_set
          mark(r)
 
 .. [#gcpseudo] Para presentar los algoritmos se utiliza una forma simple de
@@ -583,7 +586,7 @@ dejando sin marcar solamente las celdas *basura* (en blanco).
 
 
 
-.. _ref_gc_tricolor:
+.. _ref_gc_intro_tricolor:
 
 Abstracción tricolor
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -612,8 +615,8 @@ que todas las celdas parten pintadas de blanco, es decir, el conjunto
 blanco contiene todas las celdas de memoria y los conjuntos negro y gris
 están vacíos)::
 
-   mark_phase()
-      for r in root_set
+   function mark_phase() is
+      foreach r in root_set
          gray_set.add(r)
       while not gray_set.empty()
          v = gray_set.pop()
@@ -628,7 +631,7 @@ por sí ya presenta una ventaja sobre el marcado *bicolor*.
 
 
 
-.. _ref_gc_services:
+.. _ref_gc_intro_services:
 
 Servicios
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -713,7 +716,7 @@ usuario también.
 
 
 
-.. _ref_gc_clasic:
+.. _ref_gc_classic:
 
 Algoritmos clásicos
 ----------------------------------------------------------------------------
@@ -783,21 +786,21 @@ teóricamente la complejidad de eliminar una referencia puede ser
 Las primitivas implementadas para este tipo de recolector son las
 siguientes (acompañadas de una implementación básica)::
 
-   new()
+   function new() is
       cell = alloc()
       if cell is null
          throw out_of_memory
       cell.rc = 1
       return cell
 
-   del(cell)
+   function del(cell) is
       cell.rc = cell.rc - 1
       if cell.rc is 0
-         for child* in cell.children
+         foreach child* in cell.children
             del(*child)
          free(cell)
 
-   update(ref*, cell)
+   function update(ref*, cell) is
       cell.rc = cell.rc + 1
       del(*ref)
       *ref = cell
@@ -1601,6 +1604,7 @@ figura :vref:`fig:gc-rc-cycle`).
 
 
 
+.. _ref_gc_mark_sweep:
 
 Marcado y barrido
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~