[svn:parrot] r47330 - branches/gc_massacre/src/gc

bacek at svn.parrot.org bacek at svn.parrot.org
Thu Jun 3 10:31:18 UTC 2010


Author: bacek
Date: Thu Jun  3 10:31:18 2010
New Revision: 47330
URL: https://trac.parrot.org/parrot/changeset/47330

Log:
Speed up PoolAllocator.is_owned by caching lo/hi bounds of arenas.

Modified:
   branches/gc_massacre/src/gc/pool_allocator.c
   branches/gc_massacre/src/gc/pool_allocator.h

Modified: branches/gc_massacre/src/gc/pool_allocator.c
==============================================================================
--- branches/gc_massacre/src/gc/pool_allocator.c	Thu Jun  3 10:30:26 2010	(r47329)
+++ branches/gc_massacre/src/gc/pool_allocator.c	Thu Jun  3 10:31:18 2010	(r47330)
@@ -66,6 +66,8 @@
     newpool->num_free_objects  = 0;
     newpool->free_list         = NULL;
     newpool->top_arena         = NULL;
+    newpool->lo_arena_ptr      = (size_t)-1;
+    newpool->hi_arena_ptr      = 0;
 
     return newpool;
 }
@@ -178,8 +180,13 @@
 {
     ASSERT_ARGS(Parrot_gc_pool_is_owned)
     Pool_Allocator_Arena *arena = pool->top_arena;
+    size_t                a_size;
+
+    if (ptr < pool->lo_arena_ptr || ptr > pool->hi_arena_ptr)
+        return 0;
+
     /* We can cache this value. All arenas are same size */
-    size_t                a_size = arena_size(pool);
+    a_size = arena_size(pool);
     while (arena) {
         const ptrdiff_t ptr_diff =
             (ptrdiff_t)ptr - (ptrdiff_t)(arena + 1);
@@ -229,6 +236,12 @@
 
     pool->num_free_objects += num_items;
     pool->total_objects    += num_items;
+
+    if (pool->lo_arena_ptr > new_arena)
+        pool->lo_arena_ptr = new_arena;
+
+    if (pool->hi_arena_ptr < (char*)new_arena + GC_FIXED_SIZE_POOL_SIZE)
+        pool->hi_arena_ptr = new_arena + GC_FIXED_SIZE_POOL_SIZE;
 }
 
 /*

Modified: branches/gc_massacre/src/gc/pool_allocator.h
==============================================================================
--- branches/gc_massacre/src/gc/pool_allocator.h	Thu Jun  3 10:30:26 2010	(r47329)
+++ branches/gc_massacre/src/gc/pool_allocator.h	Thu Jun  3 10:31:18 2010	(r47330)
@@ -44,6 +44,10 @@
     Pool_Allocator_Arena     * top_arena;
     Pool_Allocator_Free_List * newfree;
     Pool_Allocator_Free_List * newlast;
+
+    /* Pointers of arena bounds. Used in .is_owned check */
+    void *lo_arena_ptr;
+    void *hi_arena_ptr;
 } Pool_Allocator;
 
 


More information about the parrot-commits mailing list