You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@harmony.apache.org by xl...@apache.org on 2008/01/19 12:40:29 UTC
svn commit: r613384 - in /harmony/enhanced/drlvm/trunk/vm/gc_gen:
javasrc/org/apache/harmony/drlvm/gc_gen/
javasrc_uncomp/org/apache/harmony/drlvm/gc_gen/ src/common/ src/gen/
src/los/ src/mark_compact/ src/mark_sweep/ src/semi_space/ src/thread/
src/t...
Author: xli
Date: Sat Jan 19 03:40:19 2008
New Revision: 613384
URL: http://svn.apache.org/viewvc?rev=613384&view=rev
Log:
HARMONY-5367 and HARMONY-5369, semispace GC updates and mark phase prefetch
Modified:
harmony/enhanced/drlvm/trunk/vm/gc_gen/javasrc/org/apache/harmony/drlvm/gc_gen/GCHelper.java
harmony/enhanced/drlvm/trunk/vm/gc_gen/javasrc_uncomp/org/apache/harmony/drlvm/gc_gen/GCHelper.java
harmony/enhanced/drlvm/trunk/vm/gc_gen/src/common/collection_scheduler.cpp
harmony/enhanced/drlvm/trunk/vm/gc_gen/src/common/gc_block.h
harmony/enhanced/drlvm/trunk/vm/gc_gen/src/common/gc_common.cpp
harmony/enhanced/drlvm/trunk/vm/gc_gen/src/common/gc_common.h
harmony/enhanced/drlvm/trunk/vm/gc_gen/src/common/gc_for_barrier.cpp
harmony/enhanced/drlvm/trunk/vm/gc_gen/src/common/gc_for_barrier.h
harmony/enhanced/drlvm/trunk/vm/gc_gen/src/common/gc_for_class.h
harmony/enhanced/drlvm/trunk/vm/gc_gen/src/common/gc_metadata.cpp
harmony/enhanced/drlvm/trunk/vm/gc_gen/src/common/gc_platform.h
harmony/enhanced/drlvm/trunk/vm/gc_gen/src/common/object_status.h
harmony/enhanced/drlvm/trunk/vm/gc_gen/src/gen/gen.cpp
harmony/enhanced/drlvm/trunk/vm/gc_gen/src/gen/gen_stats.cpp
harmony/enhanced/drlvm/trunk/vm/gc_gen/src/gen/gen_utils.cpp
harmony/enhanced/drlvm/trunk/vm/gc_gen/src/los/lspace.cpp
harmony/enhanced/drlvm/trunk/vm/gc_gen/src/mark_compact/mspace.cpp
harmony/enhanced/drlvm/trunk/vm/gc_gen/src/mark_compact/mspace_slide_compact.cpp
harmony/enhanced/drlvm/trunk/vm/gc_gen/src/mark_sweep/wspace.cpp
harmony/enhanced/drlvm/trunk/vm/gc_gen/src/mark_sweep/wspace_alloc.h
harmony/enhanced/drlvm/trunk/vm/gc_gen/src/mark_sweep/wspace_chunk.h
harmony/enhanced/drlvm/trunk/vm/gc_gen/src/mark_sweep/wspace_concurrent_gc_stats.cpp
harmony/enhanced/drlvm/trunk/vm/gc_gen/src/mark_sweep/wspace_mark_sweep.h
harmony/enhanced/drlvm/trunk/vm/gc_gen/src/mark_sweep/wspace_sweep_concurrent.cpp
harmony/enhanced/drlvm/trunk/vm/gc_gen/src/semi_space/sspace.cpp
harmony/enhanced/drlvm/trunk/vm/gc_gen/src/semi_space/sspace.h
harmony/enhanced/drlvm/trunk/vm/gc_gen/src/semi_space/sspace_gen_ss_pool.cpp
harmony/enhanced/drlvm/trunk/vm/gc_gen/src/thread/gc_thread.h
harmony/enhanced/drlvm/trunk/vm/gc_gen/src/trace_forward/fspace.cpp
harmony/enhanced/drlvm/trunk/vm/gc_gen/src/trace_forward/fspace.h
harmony/enhanced/drlvm/trunk/vm/gc_gen/src/trace_forward/fspace_gen_forward_pool.cpp
harmony/enhanced/drlvm/trunk/vm/gc_gen/src/trace_forward/fspace_nongen_forward_pool.cpp
harmony/enhanced/drlvm/trunk/vm/gc_gen/src/utils/vector_block.h
Modified: harmony/enhanced/drlvm/trunk/vm/gc_gen/javasrc/org/apache/harmony/drlvm/gc_gen/GCHelper.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/gc_gen/javasrc/org/apache/harmony/drlvm/gc_gen/GCHelper.java?rev=613384&r1=613383&r2=613384&view=diff
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/gc_gen/javasrc/org/apache/harmony/drlvm/gc_gen/GCHelper.java (original)
+++ harmony/enhanced/drlvm/trunk/vm/gc_gen/javasrc/org/apache/harmony/drlvm/gc_gen/GCHelper.java Sat Jan 19 03:40:19 2008
@@ -71,12 +71,11 @@
if(new_free.LE(end)) {
// do prefetch from new_free to new_free + PREFETCH_DISTANCE + ZEROING_SIZE
VMHelper.prefetch(new_free, PREFETCH_DISTANCE + ZEROING_SIZE, PREFETCH_STRIDE);
-
+
Address new_ceiling = new_free.plus(ZEROING_SIZE);
// align ceiling to 64 bytes
int remainder = new_ceiling.toInt() & 63;
new_ceiling = new_ceiling.minus(remainder);
-
if( !new_ceiling.LE(end) ){
new_ceiling = end;
}
@@ -137,7 +136,13 @@
p_objSlot.store(p_target);
return;
}
-
+ Address p_obj_info = p_objBase.plus(4);
+ int obj_info = p_obj_info.loadInt();
+ if((obj_info & 0x80) != 0){
+ p_objSlot.store(p_target);
+ return;
+ }
+
VMHelper.writeBarrier(p_objBase, p_objSlot, p_target);
}
@@ -155,6 +160,7 @@
private static native long getNosBoundary();
private static native int TLSGCOffset();
}
+
Modified: harmony/enhanced/drlvm/trunk/vm/gc_gen/javasrc_uncomp/org/apache/harmony/drlvm/gc_gen/GCHelper.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/gc_gen/javasrc_uncomp/org/apache/harmony/drlvm/gc_gen/GCHelper.java?rev=613384&r1=613383&r2=613384&view=diff
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/gc_gen/javasrc_uncomp/org/apache/harmony/drlvm/gc_gen/GCHelper.java (original)
+++ harmony/enhanced/drlvm/trunk/vm/gc_gen/javasrc_uncomp/org/apache/harmony/drlvm/gc_gen/GCHelper.java Sat Jan 19 03:40:19 2008
@@ -136,7 +136,13 @@
p_objSlot.store(p_target);
return;
}
-
+ Address p_obj_info = p_objBase.plus(4);
+ int obj_info = p_obj_info.loadInt();
+ if((obj_info & 0x80) != 0){
+ p_objSlot.store(p_target);
+ return;
+ }
+
VMHelper.writeBarrier(p_objBase, p_objSlot, p_target);
}
@@ -154,6 +160,7 @@
private static native long getNosBoundary();
private static native int TLSGCOffset();
}
+
Modified: harmony/enhanced/drlvm/trunk/vm/gc_gen/src/common/collection_scheduler.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/gc_gen/src/common/collection_scheduler.cpp?rev=613384&r1=613383&r2=613384&view=diff
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/gc_gen/src/common/collection_scheduler.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/gc_gen/src/common/collection_scheduler.cpp Sat Jan 19 03:40:19 2008
@@ -157,7 +157,7 @@
if(gc_concurrent_match_algorithm(OTF_REM_OBJ_SNAPSHOT_ALGO)||gc_concurrent_match_algorithm(OTF_REM_NEW_TARGET_ALGO)){
collection_scheduler->time_delay_to_start_mark = (int64)((time_alloc_expected - time_trace_expected)*0.65);
}else if(gc_concurrent_match_algorithm(MOSTLY_CONCURRENT_ALGO)){
- collection_scheduler->time_delay_to_start_mark = (int64)(time_mutator* 0.6);
+ collection_scheduler->time_delay_to_start_mark = (int64)(time_mutator* 0.5);
}
}else{
@@ -190,18 +190,19 @@
if(num_active_marker == 0) num_active_marker = 1;
- if(c_time > m_time || (float)d_time > (m_time - c_time) * 0.75){
+ if((c_time + d_time) > m_time || (float)d_time < (m_time * 0.25)){
INFO2("gc.con","[Concurrent GC] increase marker number.");
num_active_marker ++;
if(num_active_marker > gc->num_markers) num_active_marker = gc->num_markers;
- }else if((float)d_time < (m_time - c_time) * 0.25){
+ }else if((float)d_time > (m_time * 0.6)){
INFO2("gc.con","[Concurrent GC] decrease marker number.");
num_active_marker --;
if(num_active_marker == 0) num_active_marker = 1;
}
+
+ INFO2("gc.con","[Concurrent GC] ctime "<<(unsigned)(c_time>>10)<<" mtime "<<(unsigned)(m_time>>10)<<" dtime "<<(unsigned)(d_time>>10));
+ INFO2("gc.con","[Concurrent GC] marker num : "<<num_active_marker<<" ");
}
-
- INFO2("gc.con","[Concurrent GC] marker num : "<<num_active_marker<<" ");
collection_scheduler->last_marker_num = num_active_marker;
@@ -221,10 +222,12 @@
}
if(gc_need_start_concurrent_mark(gc)){
- vm_gc_lock_enum();
- INFO2("gc.con", "\nCon GC: concurrent mark start ...\n");
+ vm_gc_lock_enum();
+ int64 pause_start = time_now();
+ INFO2("gc.con", "[Concurrent GC] concurrent mark start ...\n");
gc_start_concurrent_mark(gc);
vm_gc_unlock_enum();
+ INFO2("gc.con","[Concurrent GC] pause time of concurrent enumeration: "<<((unsigned int)((time_now()-pause_start)>>10))<<" ms \n");
unlock(gc->collection_scheduler_lock);
return TRUE;
}
@@ -237,13 +240,15 @@
}
if(gc_need_reset_status(gc)){
+ int64 pause_start = time_now();
vm_gc_lock_enum();
int disable_count = hythread_reset_suspend_disable();
gc_prepare_rootset(gc);
gc_reset_after_concurrent_collection(gc);
- vm_resume_threads_after();
+ vm_resume_threads_after();
hythread_set_suspend_disable(disable_count);
vm_gc_unlock_enum();
+ INFO2("gc.con","[Concurrent GC] pause time after concurrent GC: "<<((unsigned int)((time_now()-pause_start)>>10))<<" ms \n");
unlock(gc->collection_scheduler_lock);
return TRUE;
}
Modified: harmony/enhanced/drlvm/trunk/vm/gc_gen/src/common/gc_block.h
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/gc_gen/src/common/gc_block.h?rev=613384&r1=613383&r2=613384&view=diff
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/gc_gen/src/common/gc_block.h (original)
+++ harmony/enhanced/drlvm/trunk/vm/gc_gen/src/common/gc_block.h Sat Jan 19 03:40:19 2008
@@ -214,6 +214,7 @@
if( obj_is_marked_in_vt(cur_obj))
return cur_obj;
cur_obj = obj_end(cur_obj);
+ PREFETCH( ((POINTER_SIZE_INT) cur_obj) + 64);
}
return NULL;
Modified: harmony/enhanced/drlvm/trunk/vm/gc_gen/src/common/gc_common.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/gc_gen/src/common/gc_common.cpp?rev=613384&r1=613383&r2=613384&view=diff
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/gc_gen/src/common/gc_common.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/gc_gen/src/common/gc_common.cpp Sat Jan 19 03:40:19 2008
@@ -328,7 +328,7 @@
#if defined(ALLOC_ZEROING) && defined(ALLOC_PREFETCH)
if(is_property_set("gc.prefetch",VM_PROPERTIES) ==1) {
- PREFETCH_ENABLED=get_boolean_property("gc.prefetch");
+ PREFETCH_ENABLED = get_boolean_property("gc.prefetch");
}
if(is_property_set("gc.prefetch_distance",VM_PROPERTIES)==1) {
@@ -347,12 +347,15 @@
if(is_property_set("gc.zeroing_size",VM_PROPERTIES)==1) {
ZEROING_SIZE = get_size_property("gc.zeroing_size");
- if(!PREFETCH_ENABLED) {
- WARN2("gc.zeroing_size","Warning: Zeroing size set with Prefetch disabled!");
- }
}
#endif
+#ifdef PREFETCH_SUPPORTED
+ if(is_property_set("gc.mark_prefetch",VM_PROPERTIES) ==1) {
+ mark_prefetch = get_boolean_property("gc.mark_prefetch");
+ }
+#endif
+
return;
}
@@ -397,13 +400,6 @@
void gc_prepare_rootset(GC* gc)
{
- if(!USE_CONCURRENT_GC){
- gc_metadata_verify(gc, TRUE);
-#ifndef BUILD_IN_REFERENT
- gc_finref_metadata_verify((GC*)gc, TRUE);
-#endif
- }
-
/* Stop the threads and collect the roots. */
lock(gc->enumerate_rootset_lock);
INFO2("gc.process", "GC: stop the threads and enumerate rootset ...\n");
@@ -439,16 +435,9 @@
gc_finref_metadata_verify((GC*)gc, TRUE);
#endif
}
- /* Stop the threads and collect the roots. */
- lock(gc->enumerate_rootset_lock);
- INFO2("gc.process", "GC: stop the threads and enumerate rootset ...\n");
- gc_clear_rootset(gc);
- gc_reset_rootset(gc);
int disable_count = hythread_reset_suspend_disable();
- vm_enumerate_root_set_all_threads();
- gc_copy_interior_pointer_table_to_rootset();
- gc_set_rootset(gc);
- unlock(gc->enumerate_rootset_lock);
+ /* Stop the threads and collect the roots. */
+ gc_prepare_rootset(gc);
if(USE_CONCURRENT_GC && gc_sweep_is_concurrent()){
if(gc_is_concurrent_sweep_phase())
@@ -535,6 +524,7 @@
INFO2("gc.con","pause time: "<<((unsigned int)(pause_time>>10))<<" ms \n");
return;
}
+
Modified: harmony/enhanced/drlvm/trunk/vm/gc_gen/src/common/gc_common.h
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/gc_gen/src/common/gc_common.h?rev=613384&r1=613383&r2=613384&view=diff
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/gc_gen/src/common/gc_common.h (original)
+++ harmony/enhanced/drlvm/trunk/vm/gc_gen/src/common/gc_common.h Sat Jan 19 03:40:19 2008
@@ -395,7 +395,7 @@
inline Boolean obj_is_survivor(Partial_Reveal_Object* p_obj)
{
- return get_obj_info_raw(p_obj) & OBJ_AGE_BIT;
+ return (Boolean)(get_obj_info_raw(p_obj) & OBJ_AGE_BIT);
}
inline void obj_set_age_bit(Partial_Reveal_Object* p_obj)
@@ -411,6 +411,26 @@
}
/***************************************************************/
+
+inline Boolean obj_is_remembered(Partial_Reveal_Object* p_obj)
+{
+ return (Boolean)(get_obj_info_raw(p_obj) & OBJ_REM_BIT);
+}
+
+inline void obj_set_rem_bit(Partial_Reveal_Object* p_obj)
+{
+ Obj_Info_Type oi = get_obj_info_raw(p_obj);
+ return set_obj_info( p_obj, oi |OBJ_REM_BIT) ;
+}
+
+inline void obj_clear_rem_bit(Partial_Reveal_Object* p_obj)
+{
+ Obj_Info_Type oi = get_obj_info_raw(p_obj);
+ return set_obj_info( p_obj, oi & ~OBJ_REM_BIT) ;
+}
+
+/***************************************************************/
+
/* all GCs inherit this GC structure */
struct Marker;
struct Mutator;
Modified: harmony/enhanced/drlvm/trunk/vm/gc_gen/src/common/gc_for_barrier.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/gc_gen/src/common/gc_for_barrier.cpp?rev=613384&r1=613383&r2=613384&view=diff
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/gc_gen/src/common/gc_for_barrier.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/gc_gen/src/common/gc_for_barrier.cpp Sat Jan 19 03:40:19 2008
@@ -31,8 +31,74 @@
volatile unsigned int write_barrier_function;
+void allocator_object_write_barrier(Partial_Reveal_Object* p_object, Collector* allocator)
+{
+ if( addr_belongs_to_nos(p_object)) return;
+
+ REF* p_slot;
+ /* scan array object */
+ if (object_is_array((Partial_Reveal_Object*)p_object)) {
+ Partial_Reveal_Object* array = p_object;
+ assert(!obj_is_primitive_array(array));
+
+ int32 array_length = vector_get_length((Vector_Handle) array);
+ for (int i = 0; i < array_length; i++) {
+ p_slot = (REF *)vector_get_element_address_ref((Vector_Handle)array, i);
+ if( read_slot(p_slot) != NULL && addr_belongs_to_nos(read_slot(p_slot))){
+ collector_remset_add_entry(allocator, (Partial_Reveal_Object**)p_slot);
+ }
+ }
+ return;
+ }
+
+ /* scan non-array object */
+ Partial_Reveal_Object* p_obj = (Partial_Reveal_Object*)p_object;
+ unsigned int num_refs = object_ref_field_num(p_obj);
+ int *ref_iterator = object_ref_iterator_init(p_obj);
+
+ for(unsigned int i=0; i<num_refs; i++){
+ p_slot = object_ref_iterator_get(ref_iterator+i, p_obj);
+ if( addr_belongs_to_nos(read_slot(p_slot))){
+ collector_remset_add_entry(allocator, (Partial_Reveal_Object**)p_slot);
+ }
+ }
+
+ return;
+}
+
+static void mutator_rem_obj(Managed_Object_Handle p_obj_written)
+{
+ if( obj_is_remembered((Partial_Reveal_Object*)p_obj_written))
+ return;
+
+ Partial_Reveal_Object* p_obj = (Partial_Reveal_Object*)p_obj_written;
+ Obj_Info_Type info = get_obj_info_raw(p_obj);
+ Obj_Info_Type new_info = info | OBJ_REM_BIT;
+ while ( info != new_info) {
+ Obj_Info_Type temp =
+ atomic_casptrsz((volatile POINTER_SIZE_INT*)get_obj_info_addr(p_obj), new_info, info);
+ if (temp == info) break;
+ info = get_obj_info_raw(p_obj);
+ new_info = info | OBJ_REM_BIT;
+ }
+ if(info == new_info) return; /* remembered by other */
+
+ Mutator *mutator = (Mutator *)gc_get_tls();
+ mutator_remset_add_entry(mutator, (REF*)p_obj);
+ return;
+}
+
+static void gen_write_barrier_rem_obj(Managed_Object_Handle p_obj_holding_ref,
+ Managed_Object_Handle p_target)
+{
+ if(p_target >= nos_boundary && p_obj_holding_ref < nos_boundary)
+ mutator_rem_obj(p_obj_holding_ref);
+
+ return;
+}
+
/* The implementations are only temporary */
-static void write_barrier_rem_source_slot(Managed_Object_Handle *p_slot,
+static void gen_write_barrier_rem_slot(Managed_Object_Handle *p_slot,
Managed_Object_Handle p_target)
{
if(p_target >= nos_boundary && p_slot < nos_boundary){
@@ -178,11 +244,18 @@
}
mutator_post_signal(mutator,MUTATOR_EXIT_BARRIER);
- if( !gc_is_gen_mode() ) return;
- if( object_has_ref_field((Partial_Reveal_Object*)p_obj_written)){
- /* for array copy and object clone */
- gc_object_write_barrier(p_obj_written);
- }
+ if( !gc_is_gen_mode() || !object_has_ref_field((Partial_Reveal_Object*)p_obj_written))
+ return;
+
+ /* for array copy and object clone */
+#ifdef USE_REM_SLOTS
+ gc_object_write_barrier(p_obj_written);
+#else
+ if( p_obj_written >= nos_boundary ) return;
+
+ mutator_rem_obj( p_obj_written );
+#endif
+ return;
}
/* FIXME:: this is not the right interface for write barrier */
@@ -197,7 +270,11 @@
break;
case WRITE_BARRIER_REM_SOURCE_REF:
*p_slot = p_target;
- write_barrier_rem_source_slot(p_slot, p_target);
+#ifdef USE_REM_SLOTS
+ gen_write_barrier_rem_slot(p_slot, p_target);
+#else /* USE_REM_OBJS */
+ gen_write_barrier_rem_obj(p_obj_holding_ref, p_target);
+#endif
break;
case WRITE_BARRIER_REM_SOURCE_OBJ:
*p_slot = p_target;
Modified: harmony/enhanced/drlvm/trunk/vm/gc_gen/src/common/gc_for_barrier.h
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/gc_gen/src/common/gc_for_barrier.h?rev=613384&r1=613383&r2=613384&view=diff
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/gc_gen/src/common/gc_for_barrier.h (original)
+++ harmony/enhanced/drlvm/trunk/vm/gc_gen/src/common/gc_for_barrier.h Sat Jan 19 03:40:19 2008
@@ -39,5 +39,7 @@
{
write_barrier_function = wb_function;
}
+
#endif /* _GC_FOR_BARRIER_H_ */
+
Modified: harmony/enhanced/drlvm/trunk/vm/gc_gen/src/common/gc_for_class.h
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/gc_gen/src/common/gc_for_class.h?rev=613384&r1=613383&r2=613384&view=diff
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/gc_gen/src/common/gc_for_class.h (original)
+++ harmony/enhanced/drlvm/trunk/vm/gc_gen/src/common/gc_for_class.h Sat Jan 19 03:40:19 2008
@@ -67,7 +67,11 @@
#define OBJ_DIRTY_BIT 0x20
+/* used by semispace GC to indicate the object is a survivor in NOS */
#define OBJ_AGE_BIT 0x40
+
+/* used by generational GC to indicate the object has been remembered */
+#define OBJ_REM_BIT 0x80
#ifdef POINTER64 // Like in VM
#define COMPRESS_VTABLE
Modified: harmony/enhanced/drlvm/trunk/vm/gc_gen/src/common/gc_metadata.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/gc_gen/src/common/gc_metadata.cpp?rev=613384&r1=613383&r2=613384&view=diff
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/gc_gen/src/common/gc_metadata.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/gc_gen/src/common/gc_metadata.cpp Sat Jan 19 03:40:19 2008
@@ -305,14 +305,34 @@
assert(gc_match_either_kind(gc, MINOR_COLLECTION|NORMAL_MAJOR_COLLECTION));
if( gc_match_kind(gc, NORMAL_MAJOR_COLLECTION )){
/* all the remsets are useless now */
- /* clean and put back mutator remsets */
+ /* clean and put back mutator remsets */
+#ifdef USE_REM_SLOTS
root_set = pool_get_entry( mutator_remset_pool );
while(root_set){
vector_block_clear(root_set);
pool_put_entry(free_set_pool, root_set);
root_set = pool_get_entry( mutator_remset_pool );
}
-
+#else
+ Vector_Block* rem_set = pool_get_entry(mutator_remset_pool);
+
+ while(rem_set){
+ POINTER_SIZE_INT* iter = vector_block_iterator_init(rem_set);
+ while(!vector_block_iterator_end(rem_set,iter)){
+ Partial_Reveal_Object* p_obj_holding_ref = (Partial_Reveal_Object*)*iter;
+ iter = vector_block_iterator_advance(rem_set,iter);
+
+ assert( !obj_belongs_to_nos(p_obj_holding_ref));
+ assert( obj_is_remembered(p_obj_holding_ref));
+ obj_clear_rem_bit(p_obj_holding_ref);
+ }
+ vector_block_clear(rem_set);
+ pool_put_entry(free_set_pool, rem_set);
+ rem_set = pool_get_entry(metadata->mutator_remset_pool);
+ }
+
+#endif /* ifdef USE_REM_SLOTS else */
+
/* clean and put back collector remsets */
root_set = pool_get_entry( collector_remset_pool );
while(root_set){
@@ -322,12 +342,45 @@
}
}else{ /* generational MINOR_COLLECTION */
+
/* all the remsets are put into the shared pool */
+#ifdef USE_REM_SLOTS
root_set = pool_get_entry( mutator_remset_pool );
while(root_set){
pool_put_entry(gc_rootset_pool, root_set);
root_set = pool_get_entry( mutator_remset_pool );
}
+#else /* USE_REM_OBJS */
+ /* scan mutator remembered objects, and put the p_refs to collector_remset_pool if they
+ hold references to NOS. The pool will be moved to rootset_pool next. */
+
+ void allocator_object_write_barrier(Partial_Reveal_Object* p_object, Collector* allocator);
+ /* temporarily use collector[0]'s rem_set for the moving. Hope to be parallelized in future. */
+ Collector* collector = gc->collectors[0];
+ collector->rem_set = free_set_pool_get_entry(metadata);
+
+ Vector_Block* rem_set = pool_get_entry(mutator_remset_pool);
+
+ while(rem_set){
+ POINTER_SIZE_INT* iter = vector_block_iterator_init(rem_set);
+ while(!vector_block_iterator_end(rem_set,iter)){
+ Partial_Reveal_Object* p_obj_holding_ref = (Partial_Reveal_Object*)*iter;
+ iter = vector_block_iterator_advance(rem_set,iter);
+
+ assert( !obj_belongs_to_nos(p_obj_holding_ref));
+ assert( obj_is_remembered(p_obj_holding_ref));
+ obj_clear_rem_bit(p_obj_holding_ref);
+ allocator_object_write_barrier(p_obj_holding_ref, collector);
+ }
+ vector_block_clear(rem_set);
+ pool_put_entry(free_set_pool, rem_set);
+ rem_set = pool_get_entry(metadata->mutator_remset_pool);
+ }
+
+ pool_put_entry(collector_remset_pool, collector->rem_set);
+ collector->rem_set = NULL;
+
+#endif /* ifdef USE_REM_SLOTS else */
/* put back collector remsets */
root_set = pool_get_entry( collector_remset_pool );
@@ -379,9 +432,12 @@
void gc_clear_remset(GC* gc)
{
- assert(gc->root_set != NULL);
+ /* this function clears all the remset before fallback */
+ assert(gc_match_kind(gc, FALLBACK_COLLECTION));
+
/* rootset pool has some entries that are actually remset, because all the remsets are put into rootset pool
before the collection. gc->root_set is a pointer pointing to the boundary between remset and rootset in the pool */
+ assert(gc->root_set != NULL);
Pool* pool = gc_metadata.gc_rootset_pool;
Vector_Block* rem_set = pool_get_entry(pool);
while(rem_set != gc->root_set){
@@ -396,16 +452,16 @@
/* put back last remset block of each collector (saved in the minor collection before fallback) */
unsigned int num_active_collectors = gc->num_active_collectors;
+ pool = gc_metadata.collector_remset_pool;
for(unsigned int i=0; i<num_active_collectors; i++)
{
Collector* collector = gc->collectors[i];
assert(collector->rem_set != NULL);
- pool_put_entry(gc_metadata.collector_remset_pool, collector->rem_set);
+ pool_put_entry(pool, collector->rem_set);
collector->rem_set = NULL;
}
/* cleanup remset pool */
- pool = gc_metadata.collector_remset_pool;
rem_set = pool_get_entry(pool);
while(rem_set){
vector_block_clear(rem_set);
@@ -416,6 +472,8 @@
return;
}
+//#include <hash_set>
+/* FIXME:: should better move to verifier dir */
extern Boolean verify_live_heap;
void gc_metadata_verify(GC* gc, Boolean is_before_gc)
{
@@ -424,16 +482,84 @@
assert(pool_is_empty(metadata->collector_repset_pool));
assert(pool_is_empty(metadata->mark_task_pool));
- if(!is_before_gc || !gc_is_gen_mode())
+ if(!is_before_gc || !gc_is_gen_mode()){
assert(pool_is_empty(metadata->mutator_remset_pool));
-
+ }else if(gc_is_gen_mode() && verify_live_heap ){
+ unsigned int remset_size = pool_size(metadata->mutator_remset_pool);
+ printf("Size of mutator remset pool %s: %d\n", is_before_gc?"before GC":"after GC", remset_size);
+/*
+ using namespace stdext;
+ hash_set<Partial_Reveal_Object**> pref_hash;
+ unsigned int num_rem_slots = 0;
+ unsigned int num_ref_to_nos = 0;
+
+ pool_iterator_init(metadata->mutator_remset_pool);
+ Vector_Block* rem_set = pool_iterator_next(metadata->mutator_remset_pool);
+ while(rem_set){
+ POINTER_SIZE_INT* iter = vector_block_iterator_init(rem_set);
+ while(!vector_block_iterator_end(rem_set,iter)){
+ Partial_Reveal_Object** p_ref = (Partial_Reveal_Object **)*iter;
+ iter = vector_block_iterator_advance(rem_set,iter);
+
+ pref_hash.insert(p_ref);
+ num_rem_slots ++;
+#ifdef USE_REM_SLOTS
+ Partial_Reveal_Object *p_obj = *p_ref;
+ if( p_obj && addr_belongs_to_nos(p_obj))
+ num_ref_to_nos++;
+#endif
+ if(addr_belongs_to_nos(p_ref)){
+ printf("wrong remset value!!!\n");
+ }
+ }
+ rem_set = pool_iterator_next(metadata->mutator_remset_pool);
+ }
+ printf("pref hashset size is %d\n", pref_hash.size());
+ printf("Num of rem slots: %d, refs to NOS: %d\n", num_rem_slots, num_ref_to_nos);
+*/
+ }
+
if(!gc_is_gen_mode()){
- /* FIXME:: even for gen gc, it should be empty if NOS is forwarding_all */
assert(pool_is_empty(metadata->collector_remset_pool));
- }
+ }else if( verify_live_heap){
+ unsigned int remset_size = pool_size(metadata->collector_remset_pool);
+ printf("Size of collector remset pool %s: %d\n", is_before_gc?"before GC":"after GC", remset_size);
+/*
+ if(!is_before_gc){
+
+ using namespace stdext;
+ hash_set<Partial_Reveal_Object**> pref_hash;
+
+ unsigned int num_rem_slots = 0;
+ pool_iterator_init(metadata->collector_remset_pool);
+ Vector_Block* rem_set = pool_iterator_next(metadata->collector_remset_pool);
+ while(rem_set){
+ POINTER_SIZE_INT* iter = vector_block_iterator_init(rem_set);
+ while(!vector_block_iterator_end(rem_set,iter)){
+ Partial_Reveal_Object** p_ref = (Partial_Reveal_Object **)*iter;
+ iter = vector_block_iterator_advance(rem_set,iter);
+
+ pref_hash.insert(p_ref);
+ num_rem_slots ++;
+ Partial_Reveal_Object *p_obj = *p_ref;
+ assert( obj_is_survivor(p_obj));
+ assert( addr_belongs_to_nos(p_obj) && !addr_belongs_to_nos(p_ref));
+ if( !obj_is_survivor(p_obj) || !addr_belongs_to_nos(p_obj) || addr_belongs_to_nos(p_ref)){
+ printf("wrong remset value!!!\n");
+ }
+ }
+ rem_set = pool_iterator_next(metadata->collector_remset_pool);
+ }
+ printf("pref hashset size is %d\n", pref_hash.size());
+ printf("Num of rem slots: %d\n", num_rem_slots);
+
+ }
+*/
+ }/* if verify_live_heap */
if(verify_live_heap ){
unsigned int free_pool_size = pool_size(metadata->free_set_pool);
+ printf("Size of free pool %s: %d\n\n\n", is_before_gc?"before GC":"after GC", free_pool_size);
}
return;
@@ -531,4 +657,5 @@
void free_set_pool_put_entry(Vector_Block* block, GC_Metadata *metadata)
{ pool_put_entry(metadata->free_set_pool, block); }
+
Modified: harmony/enhanced/drlvm/trunk/vm/gc_gen/src/common/gc_platform.h
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/gc_gen/src/common/gc_platform.h?rev=613384&r1=613383&r2=613384&view=diff
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/gc_gen/src/common/gc_platform.h (original)
+++ harmony/enhanced/drlvm/trunk/vm/gc_gen/src/common/gc_platform.h Sat Jan 19 03:40:19 2008
@@ -53,13 +53,33 @@
#endif //_DEBUG
+#ifndef _IPF_
+#define PREFETCH_SUPPORTED
+#endif
+
#ifdef _WINDOWS_
#define FORCE_INLINE __forceinline
+
+#ifdef PREFETCH_SUPPORTED
+#include <xmmintrin.h>
+#define prefetchnta(pref_addr) _mm_prefetch((char*)(pref_addr), _MM_HINT_NTA )
+#endif /*ALLOC_PREFETCH*/
+
#elif defined (__linux__)
#define FORCE_INLINE inline __attribute__((always_inline))
+
+#ifdef PREFETCH_SUPPORTED
+#define prefetchnta(pref_addr) __asm__ ("prefetchnta (%0)"::"r"(pref_addr))
+#endif /*PREFETCH_SUPPORTED*/
#else
#define FORCE_INLINE inline
#endif /* _WINDOWS_ */
+
+#ifdef PREFETCH_SUPPORTED
+#define PREFETCH prefetchnta
+#else
+#define PREFETCH(x)
+#endif
#define ABS_DIFF(x, y) (((x)>(y))?((x)-(y)):((y)-(x)))
#define USEC_PER_SEC INT64_C(1000000)
Modified: harmony/enhanced/drlvm/trunk/vm/gc_gen/src/common/object_status.h
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/gc_gen/src/common/object_status.h?rev=613384&r1=613383&r2=613384&view=diff
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/gc_gen/src/common/object_status.h (original)
+++ harmony/enhanced/drlvm/trunk/vm/gc_gen/src/common/object_status.h Sat Jan 19 03:40:19 2008
@@ -92,7 +92,6 @@
inline Boolean fspace_obj_to_be_forwarded(Partial_Reveal_Object *p_obj)
{
- if(!obj_belongs_to_nos(p_obj)) return FALSE;
return forward_first_half ? (p_obj < object_forwarding_boundary) : (p_obj>=object_forwarding_boundary);
}
inline Boolean obj_need_move(GC *gc, Partial_Reveal_Object *p_obj)
@@ -108,8 +107,13 @@
Cspace *cspace = gc_mc_get_cspace((GC_MC*)gc);
return cspace->move_object;
#endif
- if(gc_is_gen_mode() && gc_match_kind(gc, MINOR_COLLECTION))
- return fspace_obj_to_be_forwarded(p_obj);
+ if(gc_match_kind(gc, MINOR_COLLECTION)){
+ if(!obj_belongs_to_nos(p_obj)) return FALSE;
+ if(MINOR_ALGO == MINOR_NONGEN_SEMISPACE_POOL || MINOR_ALGO == MINOR_GEN_SEMISPACE_POOL)
+ return TRUE;
+ else if(gc_is_gen_mode())
+ return fspace_obj_to_be_forwarded(p_obj);
+ }
Space *space = space_of_addr(gc, p_obj);
return space->move_object;
Modified: harmony/enhanced/drlvm/trunk/vm/gc_gen/src/gen/gen.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/gc_gen/src/gen/gen.cpp?rev=613384&r1=613383&r2=613384&view=diff
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/gc_gen/src/gen/gen.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/gc_gen/src/gen/gen.cpp Sat Jan 19 03:40:19 2008
@@ -255,24 +255,27 @@
void gc_gen_destruct(GC_Gen *gc_gen)
{
TRACE2("gc.process", "GC: GC_Gen heap destruct ......");
+
+ /* We cannot use reserve_heap_size because perhaps only part of it is committed. */
+ int mos_size = space_committed_size((Space*)gc_gen->mos);
+ int nos_size = space_committed_size((Space*)gc_gen->nos);
+ int los_size = 0;
gc_nos_destruct(gc_gen);
gc_mos_destruct(gc_gen);
- POINTER_SIZE_INT los_size = 0;
+
if(MAJOR_ALGO != MAJOR_MARK_SWEEP){
- los_size = space_committed_size((Space*)gc_gen->los);
+ los_size = (int)space_committed_size((Space*)gc_gen->los);
gc_los_destruct(gc_gen);
}
+
#ifndef STATIC_NOS_MAPPING
- /* without static mapping, the heap is release as a whole.
- We cannot use reserve_heap_size because perhaps only part of it is committed. */
- vm_unmap_mem(gc_gen->physical_start, gc_gen_total_memory_size(gc_gen));
+ /* without static mapping, the heap is release as a whole. */
+ vm_unmap_mem(gc_gen->physical_start, mos_size + nos_size + los_size);
#else /* otherwise, release the spaces separately */
- int mos_size = space_committed_size((Space*)gc_gen->mos);
- int nos_size = space_committed_size((Space*)gc_gen->nos);
vm_unmap_mem(gc_gen->physical_start, los_size + mos_size); /* los+mos */
vm_unmap_mem(nos_boundary, nos_size); /* nos */
@@ -315,7 +318,12 @@
}
void gc_nos_destruct(GC_Gen *gc)
-{ fspace_destruct((Fspace*)gc->nos); }
+{
+ if(MINOR_ALGO == MINOR_NONGEN_SEMISPACE_POOL || MINOR_ALGO == MINOR_GEN_SEMISPACE_POOL)
+ sspace_destruct((Sspace*)gc->nos);
+ else
+ fspace_destruct((Fspace*)gc->nos);
+}
void gc_mos_initialize(GC_Gen *gc, void *start, POINTER_SIZE_INT mos_size, POINTER_SIZE_INT commit_size)
{
@@ -422,7 +430,8 @@
}else {
WARN2("gc.base","\nWarning: GC algorithm setting incorrect. Will use default value.\n");
-
+ MINOR_ALGO = MINOR_NONGEN_FORWARD_POOL;
+ gc_disable_gen_mode();
}
}
@@ -443,6 +452,7 @@
is_collector_local_alloc = FALSE;
}else{
WARN2("gc.base","\nWarning: GC algorithm setting incorrect. Will use default value.\n");
+ MAJOR_ALGO = MAJOR_COMPACT_MOVE;
}
}
@@ -775,10 +785,7 @@
if(gc->collect_result == FALSE && gc_match_kind((GC*)gc, MINOR_COLLECTION)){
INFO2("gc.process", "GC: Minor collection failed, transform to fallback collection ...");
-
- if(gc_is_gen_mode())
- gc_clear_remset((GC*)gc);
-
+
/* runout mos in minor collection */
if(MAJOR_ALGO != MAJOR_MARK_SWEEP){
assert(((Blocked_Space*)mos)->free_block_idx == ((Blocked_Space*)mos)->ceiling_block_idx + 1);
@@ -794,6 +801,9 @@
gc_gen_stats_reset_before_collection((GC_Gen*)gc);
gc_gen_collector_stats_reset((GC_Gen*)gc);
#endif
+
+ if(gc_is_gen_mode())
+ gc_clear_remset((GC*)gc);
if(verify_live_heap && (MAJOR_ALGO != MAJOR_MARK_SWEEP))
event_gc_collect_kind_changed((GC*)gc);
Modified: harmony/enhanced/drlvm/trunk/vm/gc_gen/src/gen/gen_stats.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/gc_gen/src/gen/gen_stats.cpp?rev=613384&r1=613383&r2=613384&view=diff
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/gc_gen/src/gen/gen_stats.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/gc_gen/src/gen/gen_stats.cpp Sat Jan 19 03:40:19 2008
@@ -29,7 +29,7 @@
GC_Gen_Stats* stats = (GC_Gen_Stats*)STD_MALLOC(sizeof(GC_Gen_Stats));
memset(stats, 0, sizeof(GC_Gen_Stats));
- stats->is_los_collected = false;
+ stats->is_los_collected = FALSE;
gc->stats = stats;
}
Modified: harmony/enhanced/drlvm/trunk/vm/gc_gen/src/gen/gen_utils.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/gc_gen/src/gen/gen_utils.cpp?rev=613384&r1=613383&r2=613384&view=diff
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/gc_gen/src/gen/gen_utils.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/gc_gen/src/gen/gen_utils.cpp Sat Jan 19 03:40:19 2008
@@ -26,7 +26,7 @@
{
if(nos->collect_algorithm == MINOR_NONGEN_SEMISPACE_POOL || nos->collect_algorithm == MINOR_GEN_SEMISPACE_POOL)
return sspace_heap_start_adjust((Sspace*)nos, new_nos_boundary, new_nos_size);
- else if( nos->collect_algorithm == MINOR_NONGEN_FORWARD_POOL )
+ else if( nos->collect_algorithm == MINOR_NONGEN_FORWARD_POOL || nos->collect_algorithm == MINOR_GEN_FORWARD_POOL )
return fspace_heap_start_adjust((Fspace*)nos, new_nos_boundary, new_nos_size);
assert(0);
@@ -49,7 +49,7 @@
POINTER_SIZE_INT free_size = 0;
if(nos->collect_algorithm == MINOR_NONGEN_SEMISPACE_POOL || nos->collect_algorithm == MINOR_GEN_SEMISPACE_POOL)
return sspace_free_space_size((Sspace*)nos);
- else if( nos->collect_algorithm == MINOR_NONGEN_FORWARD_POOL )
+ else if( nos->collect_algorithm == MINOR_NONGEN_FORWARD_POOL || nos->collect_algorithm == MINOR_GEN_FORWARD_POOL)
return fspace_free_space_size((Fspace*)nos);
assert(0);
@@ -72,7 +72,7 @@
POINTER_SIZE_INT free_size = 0;
if(nos->collect_algorithm == MINOR_NONGEN_SEMISPACE_POOL || nos->collect_algorithm == MINOR_GEN_SEMISPACE_POOL)
return sspace_used_space_size((Sspace*)nos);
- else if( nos->collect_algorithm == MINOR_NONGEN_FORWARD_POOL )
+ else if( nos->collect_algorithm == MINOR_NONGEN_FORWARD_POOL || nos->collect_algorithm == MINOR_GEN_FORWARD_POOL)
return fspace_used_space_size((Fspace*)nos);
assert(0);
Modified: harmony/enhanced/drlvm/trunk/vm/gc_gen/src/los/lspace.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/gc_gen/src/los/lspace.cpp?rev=613384&r1=613383&r2=613384&view=diff
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/gc_gen/src/los/lspace.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/gc_gen/src/los/lspace.cpp Sat Jan 19 03:40:19 2008
@@ -76,6 +76,7 @@
void lspace_destruct(Lspace* lspace)
{
+ /* we don't free the real space here, the heap will be freed altogether */
STD_FREE(lspace);
lspace = NULL;
return;
@@ -128,4 +129,5 @@
{
return lspace->failure_size;
}
+
Modified: harmony/enhanced/drlvm/trunk/vm/gc_gen/src/mark_compact/mspace.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/gc_gen/src/mark_compact/mspace.cpp?rev=613384&r1=613383&r2=613384&view=diff
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/gc_gen/src/mark_compact/mspace.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/gc_gen/src/mark_compact/mspace.cpp Sat Jan 19 03:40:19 2008
@@ -89,7 +89,10 @@
#ifdef USE_32BITS_HASHCODE
space_desturct_blocks((Blocked_Space*)mspace);
#endif
+
+ /* we don't free the real space here, the heap will be freed altogether */
STD_FREE(mspace);
+ mspace = NULL;
}
void mspace_reset_after_collection(Mspace* mspace)
Modified: harmony/enhanced/drlvm/trunk/vm/gc_gen/src/mark_compact/mspace_slide_compact.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/gc_gen/src/mark_compact/mspace_slide_compact.cpp?rev=613384&r1=613383&r2=613384&view=diff
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/gc_gen/src/mark_compact/mspace_slide_compact.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/gc_gen/src/mark_compact/mspace_slide_compact.cpp Sat Jan 19 03:40:19 2008
@@ -351,9 +351,7 @@
static void mspace_sliding_compact(Collector* collector, Mspace* mspace)
{
void *start_pos;
- Block_Header *nos_fw_start_block = (Block_Header *)&mspace->blocks[mspace_free_block_idx - mspace->first_block_idx];
- Boolean is_fallback = gc_match_kind(collector->gc, FALLBACK_COLLECTION);
-
+
while(Partial_Reveal_Object *p_obj = get_next_first_src_obj(mspace)){
Block_Header *src_block = GC_BLOCK_HEADER(p_obj);
assert(src_block->dest_counter);
Modified: harmony/enhanced/drlvm/trunk/vm/gc_gen/src/mark_sweep/wspace.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/gc_gen/src/mark_sweep/wspace.cpp?rev=613384&r1=613383&r2=613384&view=diff
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/gc_gen/src/mark_sweep/wspace.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/gc_gen/src/mark_sweep/wspace.cpp Sat Jan 19 03:40:19 2008
@@ -80,7 +80,10 @@
{
//FIXME:: when map the to-half, the decommission start address should change
wspace_destruct_chunks(wspace);
+
+ /* we don't free the real space here, the heap will be freed altogether */
STD_FREE(wspace);
+ wspace = NULL;
}
void wspace_reset_after_collection(Wspace *wspace)
Modified: harmony/enhanced/drlvm/trunk/vm/gc_gen/src/mark_sweep/wspace_alloc.h
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/gc_gen/src/mark_sweep/wspace_alloc.h?rev=613384&r1=613383&r2=613384&view=diff
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/gc_gen/src/mark_sweep/wspace_alloc.h (original)
+++ harmony/enhanced/drlvm/trunk/vm/gc_gen/src/mark_sweep/wspace_alloc.h Sat Jan 19 03:40:19 2008
@@ -138,10 +138,9 @@
{
//assert(!slot_is_alloc_in_table(table, slot_index));
- unsigned int color_bits_index = slot_index * COLOR_BITS_PER_OBJ;
- unsigned int word_index = color_bits_index / BITS_PER_WORD;
- unsigned int index_in_word = color_bits_index % BITS_PER_WORD;
-
+ unsigned int color_bits_index = slot_index << COLOR_BITS_PER_OBJ_SHIT;
+ unsigned int word_index = color_bits_index >> BIT_SHIFT_TO_BITS_PER_WORD;
+ unsigned int index_in_word = color_bits_index & (((unsigned int)(BITS_PER_WORD-1)));
volatile POINTER_SIZE_INT *p_color_word = &table[word_index];
assert(p_color_word);
Modified: harmony/enhanced/drlvm/trunk/vm/gc_gen/src/mark_sweep/wspace_chunk.h
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/gc_gen/src/mark_sweep/wspace_chunk.h?rev=613384&r1=613383&r2=613384&view=diff
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/gc_gen/src/mark_sweep/wspace_chunk.h (original)
+++ harmony/enhanced/drlvm/trunk/vm/gc_gen/src/mark_sweep/wspace_chunk.h Sat Jan 19 03:40:19 2008
@@ -20,7 +20,7 @@
#include "wspace.h"
-//#define SSPACE_USE_FASTDIV
+#define SSPACE_USE_FASTDIV
#ifdef SSPACE_USE_FASTDIV
#if 0
#define massert(x) do { if(!(x)) { printf("%s:%s, , Assertion %s failed\n", __FILE__, __LINE__, #x); exit(1); }} while(0)
@@ -109,8 +109,14 @@
#define ABNORMAL_CHUNK_HEADER(addr) ((Chunk_Header*)((POINTER_SIZE_INT)addr & CHUNK_GRANULARITY_HIGH_MASK))
#define MAX_SLOT_INDEX 0xFFffFFff
-#define COLOR_BITS_PER_OBJ 4 // should be powers of 2
-#define SLOT_NUM_PER_WORD_IN_TABLE (BITS_PER_WORD /COLOR_BITS_PER_OBJ)
+//#define COLOR_BITS_PER_OBJ 4 // should be powers of 2
+#define COLOR_BITS_PER_OBJ_SHIT 2 // COLOR_BITS_PER_OBJ = 1 << COLOR_BITS_PER_OBJ_SHIT
+#define COLOR_BITS_PER_OBJ (1<<COLOR_BITS_PER_OBJ_SHIT)
+
+//#define SLOT_NUM_PER_WORD_IN_TABLE (BITS_PER_WORD /COLOR_BITS_PER_OBJ)
+#define SLOT_NUM_PER_WORD_SHIT (BIT_SHIFT_TO_BITS_PER_WORD - COLOR_BITS_PER_OBJ_SHIT)
+#define SLOT_NUM_PER_WORD_IN_TABLE (1<<SLOT_NUM_PER_WORD_SHIT)
+
/* Two equations:
* 1. CHUNK_HEADER_VARS_SIZE_BYTES + NORMAL_CHUNK_TABLE_SIZE_BYTES + slot_size*NORMAL_CHUNK_SLOT_NUM = NORMAL_CHUNK_SIZE_BYTES
Modified: harmony/enhanced/drlvm/trunk/vm/gc_gen/src/mark_sweep/wspace_concurrent_gc_stats.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/gc_gen/src/mark_sweep/wspace_concurrent_gc_stats.cpp?rev=613384&r1=613383&r2=613384&view=diff
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/gc_gen/src/mark_sweep/wspace_concurrent_gc_stats.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/gc_gen/src/mark_sweep/wspace_concurrent_gc_stats.cpp Sat Jan 19 03:40:19 2008
@@ -1,20 +1,3 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
#ifdef WSPACE_CONCURRENT_GC_STATS
#include "wspace_alloc.h"
@@ -215,4 +198,5 @@
}
#endif
+
Modified: harmony/enhanced/drlvm/trunk/vm/gc_gen/src/mark_sweep/wspace_mark_sweep.h
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/gc_gen/src/mark_sweep/wspace_mark_sweep.h?rev=613384&r1=613383&r2=613384&view=diff
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/gc_gen/src/mark_sweep/wspace_mark_sweep.h (original)
+++ harmony/enhanced/drlvm/trunk/vm/gc_gen/src/mark_sweep/wspace_mark_sweep.h Sat Jan 19 03:40:19 2008
@@ -80,13 +80,14 @@
chunk = NORMAL_CHUNK_HEADER(obj);
index = slot_addr_to_index(chunk, obj);
}
- unsigned int word_index = index / SLOT_NUM_PER_WORD_IN_TABLE;
- index_in_word = COLOR_BITS_PER_OBJ * (index % SLOT_NUM_PER_WORD_IN_TABLE);
- //unsigned int word_index = index >> 3;
- //index_in_word = COLOR_BITS_PER_OBJ * (index & (((unsigned int)(SLOT_NUM_PER_WORD_IN_TABLE-1))));
+ //unsigned int word_index = index / SLOT_NUM_PER_WORD_IN_TABLE;
+ //index_in_word = COLOR_BITS_PER_OBJ * (index % SLOT_NUM_PER_WORD_IN_TABLE);
+ unsigned int word_index = index >> SLOT_NUM_PER_WORD_SHIT;
+ index_in_word = COLOR_BITS_PER_OBJ * (index & (((unsigned int)(SLOT_NUM_PER_WORD_IN_TABLE-1))));
return &chunk->table[word_index];
}
+
FORCE_INLINE POINTER_SIZE_INT *get_color_word_in_table(Partial_Reveal_Object *obj, unsigned int &index_in_word, unsigned int size)
{
Chunk_Header *chunk;
@@ -99,7 +100,7 @@
chunk = NORMAL_CHUNK_HEADER(obj);
index = slot_addr_to_index(chunk, obj);
}
- unsigned int word_index = index >> 3;
+ unsigned int word_index = index >> SLOT_NUM_PER_WORD_SHIT;
index_in_word = COLOR_BITS_PER_OBJ * (index & (((unsigned int)(SLOT_NUM_PER_WORD_IN_TABLE-1))));
return &chunk->table[word_index];
Modified: harmony/enhanced/drlvm/trunk/vm/gc_gen/src/mark_sweep/wspace_sweep_concurrent.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/gc_gen/src/mark_sweep/wspace_sweep_concurrent.cpp?rev=613384&r1=613383&r2=613384&view=diff
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/gc_gen/src/mark_sweep/wspace_sweep_concurrent.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/gc_gen/src/mark_sweep/wspace_sweep_concurrent.cpp Sat Jan 19 03:40:19 2008
@@ -1,20 +1,3 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
#include "wspace.h"
#include "wspace_chunk.h"
#include "wspace_mark_sweep.h"
Modified: harmony/enhanced/drlvm/trunk/vm/gc_gen/src/semi_space/sspace.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/gc_gen/src/semi_space/sspace.cpp?rev=613384&r1=613383&r2=613384&view=diff
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/gc_gen/src/semi_space/sspace.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/gc_gen/src/semi_space/sspace.cpp Sat Jan 19 03:40:19 2008
@@ -131,7 +131,9 @@
#ifdef USE_32BITS_HASHCODE
space_desturct_blocks((Blocked_Space*)sspace);
#endif
+ /* we don't free the real space here, the heap will be freed altogether */
STD_FREE(sspace);
+ sspace = NULL;
}
POINTER_SIZE_INT sspace_free_space_size(Sspace* nos)
Modified: harmony/enhanced/drlvm/trunk/vm/gc_gen/src/semi_space/sspace.h
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/gc_gen/src/semi_space/sspace.h?rev=613384&r1=613383&r2=613384&view=diff
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/gc_gen/src/semi_space/sspace.h (original)
+++ harmony/enhanced/drlvm/trunk/vm/gc_gen/src/semi_space/sspace.h Sat Jan 19 03:40:19 2008
@@ -99,10 +99,15 @@
p_obj < sspace->survivor_area_end);
}
-FORCE_INLINE Boolean obj_to_be_forwarded(Sspace* sspace, Partial_Reveal_Object* p_obj)
+/* to be forwarded to MOS or was forwarded by other thread */
+FORCE_INLINE Boolean obj_be_forwarded(Sspace* sspace, Partial_Reveal_Object* p_obj)
{
- assert( obj_belongs_to_survivor_area(sspace, p_obj)?obj_is_survivor(p_obj):!obj_is_survivor(p_obj));
- return obj_is_survivor(p_obj);
+ /* NOTE:: Tricky! When the thread checks, the oi could be set a forward address by another thread. */
+ Obj_Info_Type oi = get_obj_info_raw(p_obj);
+ Boolean be_forwarded = (Boolean)(oi & (FORWARD_BIT|OBJ_AGE_BIT));
+ assert( obj_belongs_to_survivor_area(sspace, p_obj)? be_forwarded:1);
+
+ return be_forwarded;
}
/* treat semispace alloc as thread local alloc. If it fails or p_obj is old, forward it to MOS */
@@ -111,7 +116,9 @@
void* p_targ_obj = NULL;
Sspace* sspace = (Sspace*)allocator->alloc_space;
- if( obj_to_be_forwarded(sspace, p_obj) )
+ /* this object should be forward to MOS, or is already forwarded by other thread (to either MOS or Tospace.
+ In any case, we don't need to allocate it in tospace now. */
+ if( obj_be_forwarded(sspace, p_obj) )
return NULL;
p_targ_obj = thread_local_alloc(size, allocator);
Modified: harmony/enhanced/drlvm/trunk/vm/gc_gen/src/semi_space/sspace_gen_ss_pool.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/gc_gen/src/semi_space/sspace_gen_ss_pool.cpp?rev=613384&r1=613383&r2=613384&view=diff
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/gc_gen/src/semi_space/sspace_gen_ss_pool.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/gc_gen/src/semi_space/sspace_gen_ss_pool.cpp Sat Jan 19 03:40:19 2008
@@ -143,9 +143,11 @@
}else{ /* otherwise, we successfully forwarded */
#ifdef GC_GEN_STATS
+ if(gc_profile){
GC_Gen_Collector_Stats* stats = (GC_Gen_Collector_Stats*)collector->stats;
gc_gen_collector_update_marked_nos_obj_stats_minor(stats);
gc_gen_collector_update_moved_nos_obj_stats_minor(stats, vm_object_size(p_obj));
+ }
#endif
scan_object(collector, p_target_obj);
Modified: harmony/enhanced/drlvm/trunk/vm/gc_gen/src/thread/gc_thread.h
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/gc_gen/src/thread/gc_thread.h?rev=613384&r1=613383&r2=613384&view=diff
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/gc_gen/src/thread/gc_thread.h (original)
+++ harmony/enhanced/drlvm/trunk/vm/gc_gen/src/thread/gc_thread.h Sat Jan 19 03:40:19 2008
@@ -33,14 +33,6 @@
#ifdef ALLOC_ZEROING /* ----------------- */
#ifdef ALLOC_PREFETCH /* vvvvvvvvvvvvvvvv */
-
-#ifdef _WINDOWS_
-#include <xmmintrin.h>
-#define prefetchnta(pref_addr) _mm_prefetch((char*)(pref_addr), _MM_HINT_NTA )
-#else /* _WINDOWS_ */
-#define prefetchnta(pref_addr) __asm__ ("prefetchnta (%0)"::"r"(pref_addr))
-#endif /* !_WINDOWS_ */
-
extern POINTER_SIZE_INT PREFETCH_DISTANCE;
extern POINTER_SIZE_INT ZEROING_SIZE;
extern POINTER_SIZE_INT PREFETCH_STRIDE;
Modified: harmony/enhanced/drlvm/trunk/vm/gc_gen/src/trace_forward/fspace.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/gc_gen/src/trace_forward/fspace.cpp?rev=613384&r1=613383&r2=613384&view=diff
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/gc_gen/src/trace_forward/fspace.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/gc_gen/src/trace_forward/fspace.cpp Sat Jan 19 03:40:19 2008
@@ -21,6 +21,10 @@
#include "fspace.h"
+#ifdef PREFETCH_SUPPORTED
+Boolean mark_prefetch = FALSE;
+#endif
+
Boolean NOS_PARTIAL_FORWARD = FALSE;
Boolean forward_first_half;
@@ -92,8 +96,9 @@
#ifdef USE_32BITS_HASHCODE
space_desturct_blocks((Blocked_Space*)fspace);
#endif
-
+ /* we don't free the real space here, the heap will be freed altogether */
STD_FREE(fspace);
+ fspace = NULL;
}
void fspace_reset_after_collection(Fspace* fspace)
@@ -174,9 +179,6 @@
void collector_execute_task(GC* gc, TaskType task_func, Space* space);
-unsigned int mspace_free_block_idx;
-
-
#ifdef GC_GEN_STATS
#include "../gen/gen_stats.h"
#endif
@@ -187,7 +189,6 @@
fspace->num_collections++;
GC* gc = fspace->gc;
- mspace_free_block_idx = ((Blocked_Space*)((GC_Gen*)gc)->mos)->free_block_idx;
if(gc_is_gen_mode()){
fspace->collect_algorithm = MINOR_GEN_FORWARD_POOL;
Modified: harmony/enhanced/drlvm/trunk/vm/gc_gen/src/trace_forward/fspace.h
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/gc_gen/src/trace_forward/fspace.h?rev=613384&r1=613383&r2=613384&view=diff
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/gc_gen/src/trace_forward/fspace.h (original)
+++ harmony/enhanced/drlvm/trunk/vm/gc_gen/src/trace_forward/fspace.h Sat Jan 19 03:40:19 2008
@@ -29,6 +29,9 @@
* In our Gen GC, not all live objects are copied to tspace space, the newer baby will
* still be preserved in fspace, that means to give them time to die.
*/
+#ifdef PREFETCH_SUPPORTED
+extern Boolean mark_prefetch;
+#endif
extern Boolean forward_first_half;
/* boundary splitting fspace into forwarding part and remaining part */
Modified: harmony/enhanced/drlvm/trunk/vm/gc_gen/src/trace_forward/fspace_gen_forward_pool.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/gc_gen/src/trace_forward/fspace_gen_forward_pool.cpp?rev=613384&r1=613383&r2=613384&view=diff
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/gc_gen/src/trace_forward/fspace_gen_forward_pool.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/gc_gen/src/trace_forward/fspace_gen_forward_pool.cpp Sat Jan 19 03:40:19 2008
@@ -211,6 +211,15 @@
Vector_Block* trace_stack = (Vector_Block*)collector->trace_stack;
while( !vector_stack_is_empty(trace_stack)){
p_ref = (REF *)vector_stack_pop(trace_stack);
+#ifdef PREFETCH_SUPPORTED
+ /* DO PREFETCH */
+ if(mark_prefetch) {
+ if(!vector_stack_is_empty(trace_stack)) {
+ REF *pref = (REF*)vector_stack_read(trace_stack, 0);
+ PREFETCH( read_slot(pref) );
+ }
+ }
+#endif
forward_object(collector, p_ref);
trace_stack = (Vector_Block*)collector->trace_stack;
}
@@ -278,6 +287,15 @@
while(!vector_block_iterator_end(trace_task,iter)){
REF *p_ref = (REF *)*iter;
iter = vector_block_iterator_advance(trace_task,iter);
+#ifdef PREFETCH_SUPPORTED
+ /* DO PREFETCH */
+ if( mark_prefetch ) {
+ if(!vector_block_iterator_end(trace_task, iter)) {
+ REF *pref= (REF*) *iter;
+ PREFETCH( read_slot(pref));
+ }
+ }
+#endif
assert(*p_ref); /* a task can't be NULL, it was checked before put into the task stack */
/* in sequential version, we only trace same object once, but we were using a local hashset for that,
which couldn't catch the repetition between multiple collectors. This is subject to more study. */
Modified: harmony/enhanced/drlvm/trunk/vm/gc_gen/src/trace_forward/fspace_nongen_forward_pool.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/gc_gen/src/trace_forward/fspace_nongen_forward_pool.cpp?rev=613384&r1=613383&r2=613384&view=diff
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/gc_gen/src/trace_forward/fspace_nongen_forward_pool.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/gc_gen/src/trace_forward/fspace_nongen_forward_pool.cpp Sat Jan 19 03:40:19 2008
@@ -182,6 +182,15 @@
Vector_Block* trace_stack = (Vector_Block*)collector->trace_stack;
while( !vector_stack_is_empty(trace_stack)){
p_ref = (REF *)vector_stack_pop(trace_stack);
+#ifdef PREFETCH_SUPPORTED
+ /* DO PREFETCH */
+ if(mark_prefetch) {
+ if(!vector_stack_is_empty(trace_stack)) {
+ REF *pref = (REF*)vector_stack_read(trace_stack, 0);
+ PREFETCH( read_slot(pref) );
+ }
+ }
+#endif
forward_object(collector, p_ref);
trace_stack = (Vector_Block*)collector->trace_stack;
}
@@ -245,6 +254,15 @@
while(!vector_block_iterator_end(trace_task,iter)){
REF *p_ref = (REF *)*iter;
iter = vector_block_iterator_advance(trace_task, iter);
+#ifdef PREFETCH_SUPPORTED
+ /* DO PREFETCH */
+ if( mark_prefetch ) {
+ if(!vector_block_iterator_end(trace_task, iter)) {
+ REF *pref= (REF*) *iter;
+ PREFETCH( read_slot(pref));
+ }
+ }
+#endif
trace_object(collector, p_ref);
if(collector->result == FALSE) break; /* force return */
Modified: harmony/enhanced/drlvm/trunk/vm/gc_gen/src/utils/vector_block.h
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/gc_gen/src/utils/vector_block.h?rev=613384&r1=613383&r2=613384&view=diff
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/gc_gen/src/utils/vector_block.h (original)
+++ harmony/enhanced/drlvm/trunk/vm/gc_gen/src/utils/vector_block.h Sat Jan 19 03:40:19 2008
@@ -245,6 +245,11 @@
return value;
}
+inline POINTER_SIZE_INT vector_stack_read(Vector_Block* block, int idx)
+{
+ return block->head[idx];
+}
+
inline void vector_block_integrity_check(Vector_Block* block)
{
POINTER_SIZE_INT* iter = vector_block_iterator_init(block);