Author: Whiteknight
Date: Sun Jul 20 15:52:47 2008
New Revision: 29635

Modified:
   branches/gsoc_pdd09/include/parrot/smallobject.h
   branches/gsoc_pdd09/src/gc/gc_it.c

Log:
[gsoc_pdd09] Fixes:
* Change default behavior to be partially incremental, magically hides some 
errors and allows system to build
* Fix bounds in arena allocation to prevent indexing overflow

Modified: branches/gsoc_pdd09/include/parrot/smallobject.h
==============================================================================
--- branches/gsoc_pdd09/include/parrot/smallobject.h    (original)
+++ branches/gsoc_pdd09/include/parrot/smallobject.h    Sun Jul 20 15:52:47 2008
@@ -131,17 +131,18 @@
    increments before completion and moving to the next state. */
 #  define GC_IT_BREAK_AFTER_0
 #  define GC_IT_BREAK_AFTER_1
-#  define GC_IT_BREAK_AFTER_2
-#  define GC_IT_BREAK_AFTER_3
+#  define GC_IT_BREAK_AFTER_2 break
+#  define GC_IT_BREAK_AFTER_3 break
 #  define GC_IT_BREAK_AFTER_4
-#  define GC_IT_BREAK_AFTER_5
-#  define GC_IT_BREAK_AFTER_6
+#  define GC_IT_BREAK_AFTER_5 break
+#  define GC_IT_BREAK_AFTER_6 break
 
 /* Macros that are useful outside src/gc/gc_it.c */
 
 #  define GC_IT_PTR_HAS_PARENT_POOL(ptr, pool) \
     (PObj_to_IT_HDR(ptr)->parent_arena->parent_pool == (pool))
 
+#  define GC_IT_MAX_IN_ARENA 65535
 
 /*
  * GC_IT Header, a linked list.

Modified: branches/gsoc_pdd09/src/gc/gc_it.c
==============================================================================
--- branches/gsoc_pdd09/src/gc/gc_it.c  (original)
+++ branches/gsoc_pdd09/src/gc/gc_it.c  Sun Jul 20 15:52:47 2008
@@ -317,14 +317,14 @@
         case GC_IT_SWEEP_PMCS:
             if (Parrot_is_blocked_GC_sweep(interp))
                 break;
-            //gc_it_sweep_pmc_pools(interp);
+            gc_it_sweep_pmc_pools(interp);
             gc_priv_data->state = GC_IT_SWEEP_BUFFERS;
             GC_IT_BREAK_AFTER_5;
 
         case GC_IT_SWEEP_BUFFERS:
             if (Parrot_is_blocked_GC_sweep(interp))
                 break;
-            //gc_it_sweep_sized_pools(interp);
+            gc_it_sweep_sized_pools(interp);
             gc_priv_data->state = GC_IT_FINAL_CLEANUP;
             GC_IT_BREAK_AFTER_6;
 
@@ -1141,6 +1141,8 @@
 
     if (size > POOL_MAX_BYTES)
         pool->objects_per_alloc = POOL_MAX_BYTES / real_size;
+    if (pool->objects_per_alloc > GC_IT_MAX_IN_ARENA)
+        pool->objects_per_alloc = GC_IT_MAX_IN_ARENA;
 }
 
 

Reply via email to