cvsuser 04/04/27 02:55:18
Modified: src dod.c smallobject.c
Log:
save some cycles during DOD
Revision Changes Path
1.112 +12 -1 parrot/src/dod.c
Index: dod.c
===================================================================
RCS file: /cvs/public/parrot/src/dod.c,v
retrieving revision 1.111
retrieving revision 1.112
diff -u -w -r1.111 -r1.112
--- dod.c 23 Apr 2004 09:21:11 -0000 1.111
+++ dod.c 27 Apr 2004 09:55:18 -0000 1.112
@@ -1,6 +1,6 @@
/*
Copyright: 2001-2003 The Perl Foundation. All Rights Reserved.
-$Id: dod.c,v 1.111 2004/04/23 09:21:11 jrieks Exp $
+$Id: dod.c,v 1.112 2004/04/27 09:55:18 leo Exp $
=head1 NAME
@@ -642,6 +642,17 @@
#if REDUCE_ARENAS
UINTVAL free_arenas = 0, old_total_used = 0;
#endif
+
+ /*
+ * A DOD run is triggered by any pool's resource shortage.
+ * If one pool has plenty of free objects, we don't run through the
+ * pool to free only some objects, except it's the pmc_pool
+ * which might need timely destruction.
+ */
+ if (pool != interpreter->arena_base->pmc_pool &&
+ pool->num_free_objects >
+ pool->total_objects - pool->replenish_level)
+ return;
/* Run through all the buffer header pools and mark */
for (cur_arena = pool->last_Arena;
1.44 +4 -1 parrot/src/smallobject.c
Index: smallobject.c
===================================================================
RCS file: /cvs/public/parrot/src/smallobject.c,v
retrieving revision 1.43
retrieving revision 1.44
diff -u -w -r1.43 -r1.44
--- smallobject.c 23 Apr 2004 09:21:12 -0000 1.43
+++ smallobject.c 27 Apr 2004 09:55:18 -0000 1.44
@@ -1,6 +1,6 @@
/*
Copyright: 2001-2003 The Perl Foundation. All Rights Reserved.
-$Id: smallobject.c,v 1.43 2004/04/23 09:21:12 jrieks Exp $
+$Id: smallobject.c,v 1.44 2004/04/27 09:55:18 leo Exp $
=head1 NAME
@@ -177,6 +177,7 @@
ptr = pool->free_list;
pool->free_list = *(void **)ptr;
PObj_on_free_list_CLEAR((PObj*) ptr);
+ --pool->num_free_objects;
#if ! DISABLE_GC_DEBUG
if (GC_DEBUG(interpreter))
PObj_version((Buffer*)ptr) = interpreter->dod_runs;
@@ -196,6 +197,7 @@
(*pool->more_objects) (interpreter, pool);
ptr = pool->free_list;
pool->free_list = *(void **)ptr;
+ --pool->num_free_objects;
*((Dead_PObj*)ptr)->arena_dod_flag_ptr &=
~ (PObj_on_free_list_FLAG << ((Dead_PObj*)ptr)->flag_shift);
return ptr;
@@ -268,6 +270,7 @@
pool->add_free_object (interpreter, pool, object);
object = (void *)((char *)object + pool->object_size);
}
+ pool->num_free_objects += end - start;
#if ARENA_DOD_FLAGS
/* set last */
*dod_flags = ALL_FREE_MASK;