[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