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;
}