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/03/14 12:21:32 UTC

svn commit: r637062 [1/3] - in /harmony/enhanced/drlvm/trunk: make/vm/ vm/gc_gen/src/common/ vm/gc_gen/src/finalizer_weakref/ vm/gc_gen/src/gen/ vm/gc_gen/src/jni/ vm/gc_gen/src/los/ vm/gc_gen/src/mark_compact/ vm/gc_gen/src/mark_sweep/ vm/gc_gen/src/m...

Author: xli
Date: Fri Mar 14 04:21:27 2008
New Revision: 637062

URL: http://svn.apache.org/viewvc?rev=637062&view=rev
Log:
HARMONY-5605 : [drlvm][gc] collect_kind refactoring for better modularity

Added:
    harmony/enhanced/drlvm/trunk/vm/gc_gen/src/common/gc_options.cpp   (with props)
    harmony/enhanced/drlvm/trunk/vm/gc_gen/src/common/gc_properties.h   (with props)
    harmony/enhanced/drlvm/trunk/vm/gc_gen/src/move_compact/gc_mc.cpp   (with props)
    harmony/enhanced/drlvm/trunk/vm/gc_gen/src/utils/uneven_map.h   (with props)
Modified:
    harmony/enhanced/drlvm/trunk/make/vm/gc_gen.xml
    harmony/enhanced/drlvm/trunk/vm/gc_gen/src/common/collection_scheduler.cpp
    harmony/enhanced/drlvm/trunk/vm/gc_gen/src/common/collection_scheduler.h
    harmony/enhanced/drlvm/trunk/vm/gc_gen/src/common/compressed_ref.cpp
    harmony/enhanced/drlvm/trunk/vm/gc_gen/src/common/fix_repointed_refs.h
    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_concurrent.cpp
    harmony/enhanced/drlvm/trunk/vm/gc_gen/src/common/gc_concurrent.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_vm.cpp
    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/gc_space.h
    harmony/enhanced/drlvm/trunk/vm/gc_gen/src/common/large_pages.cpp
    harmony/enhanced/drlvm/trunk/vm/gc_gen/src/common/mark_scan_pool.cpp
    harmony/enhanced/drlvm/trunk/vm/gc_gen/src/common/object_status.h
    harmony/enhanced/drlvm/trunk/vm/gc_gen/src/common/space_tuner.cpp
    harmony/enhanced/drlvm/trunk/vm/gc_gen/src/common/weak_roots.cpp
    harmony/enhanced/drlvm/trunk/vm/gc_gen/src/finalizer_weakref/finalizer_weakref.cpp
    harmony/enhanced/drlvm/trunk/vm/gc_gen/src/finalizer_weakref/finalizer_weakref.h
    harmony/enhanced/drlvm/trunk/vm/gc_gen/src/finalizer_weakref/finalizer_weakref_metadata.cpp
    harmony/enhanced/drlvm/trunk/vm/gc_gen/src/finalizer_weakref/finalizer_weakref_metadata.h
    harmony/enhanced/drlvm/trunk/vm/gc_gen/src/gen/gen.cpp
    harmony/enhanced/drlvm/trunk/vm/gc_gen/src/gen/gen.h
    harmony/enhanced/drlvm/trunk/vm/gc_gen/src/gen/gen_adapt.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/jni/java_natives.cpp
    harmony/enhanced/drlvm/trunk/vm/gc_gen/src/jni/java_support.cpp
    harmony/enhanced/drlvm/trunk/vm/gc_gen/src/los/free_area_pool.cpp
    harmony/enhanced/drlvm/trunk/vm/gc_gen/src/los/free_area_pool.h
    harmony/enhanced/drlvm/trunk/vm/gc_gen/src/los/lspace.cpp
    harmony/enhanced/drlvm/trunk/vm/gc_gen/src/los/lspace.h
    harmony/enhanced/drlvm/trunk/vm/gc_gen/src/los/lspace_alloc_collect.cpp
    harmony/enhanced/drlvm/trunk/vm/gc_gen/src/mark_compact/fallback_mark_scan.cpp
    harmony/enhanced/drlvm/trunk/vm/gc_gen/src/mark_compact/mspace_alloc.cpp
    harmony/enhanced/drlvm/trunk/vm/gc_gen/src/mark_compact/mspace_collect_compact.cpp
    harmony/enhanced/drlvm/trunk/vm/gc_gen/src/mark_compact/mspace_collect_compact.h
    harmony/enhanced/drlvm/trunk/vm/gc_gen/src/mark_compact/mspace_extend_compact.cpp
    harmony/enhanced/drlvm/trunk/vm/gc_gen/src/mark_compact/mspace_move_compact.cpp
    harmony/enhanced/drlvm/trunk/vm/gc_gen/src/mark_compact/mspace_slide_compact.cpp
    harmony/enhanced/drlvm/trunk/vm/gc_gen/src/mark_compact/space_tune_mark_scan.cpp
    harmony/enhanced/drlvm/trunk/vm/gc_gen/src/mark_sweep/gc_ms.cpp
    harmony/enhanced/drlvm/trunk/vm/gc_gen/src/mark_sweep/gc_ms.h
    harmony/enhanced/drlvm/trunk/vm/gc_gen/src/mark_sweep/wspace.cpp
    harmony/enhanced/drlvm/trunk/vm/gc_gen/src/mark_sweep/wspace.h
    harmony/enhanced/drlvm/trunk/vm/gc_gen/src/mark_sweep/wspace_alloc.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_compact.cpp
    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_fallback_mark.cpp
    harmony/enhanced/drlvm/trunk/vm/gc_gen/src/mark_sweep/wspace_mark.cpp
    harmony/enhanced/drlvm/trunk/vm/gc_gen/src/mark_sweep/wspace_mark_mostly_concurrent.cpp
    harmony/enhanced/drlvm/trunk/vm/gc_gen/src/mark_sweep/wspace_mark_otf_concurrent.cpp
    harmony/enhanced/drlvm/trunk/vm/gc_gen/src/mark_sweep/wspace_mark_sweep.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/mark_sweep/wspace_verify.cpp
    harmony/enhanced/drlvm/trunk/vm/gc_gen/src/move_compact/gc_mc.h
    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_forward.cpp
    harmony/enhanced/drlvm/trunk/vm/gc_gen/src/semi_space/sspace_gen_ss_pool.cpp
    harmony/enhanced/drlvm/trunk/vm/gc_gen/src/semi_space/sspace_nongen_ss_pool.cpp
    harmony/enhanced/drlvm/trunk/vm/gc_gen/src/thread/collector.cpp
    harmony/enhanced/drlvm/trunk/vm/gc_gen/src/thread/collector.h
    harmony/enhanced/drlvm/trunk/vm/gc_gen/src/thread/collector_alloc.h
    harmony/enhanced/drlvm/trunk/vm/gc_gen/src/thread/gc_thread.h
    harmony/enhanced/drlvm/trunk/vm/gc_gen/src/thread/marker.cpp
    harmony/enhanced/drlvm/trunk/vm/gc_gen/src/thread/marker.h
    harmony/enhanced/drlvm/trunk/vm/gc_gen/src/thread/mutator.cpp
    harmony/enhanced/drlvm/trunk/vm/gc_gen/src/thread/mutator.h
    harmony/enhanced/drlvm/trunk/vm/gc_gen/src/thread/mutator_alloc.cpp
    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_nongen_forward_pool.cpp
    harmony/enhanced/drlvm/trunk/vm/gc_gen/src/utils/vector_block.h
    harmony/enhanced/drlvm/trunk/vm/gc_gen/src/verify/verifier_common.cpp
    harmony/enhanced/drlvm/trunk/vm/gc_gen/src/verify/verifier_common.h
    harmony/enhanced/drlvm/trunk/vm/gc_gen/src/verify/verifier_scanner.cpp
    harmony/enhanced/drlvm/trunk/vm/gc_gen/src/verify/verify_gc_effect.cpp
    harmony/enhanced/drlvm/trunk/vm/gc_gen/src/verify/verify_gc_effect.h
    harmony/enhanced/drlvm/trunk/vm/gc_gen/src/verify/verify_live_heap.cpp
    harmony/enhanced/drlvm/trunk/vm/gc_gen/src/verify/verify_mutator_effect.cpp

Modified: harmony/enhanced/drlvm/trunk/make/vm/gc_gen.xml
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/make/vm/gc_gen.xml?rev=637062&r1=637061&r2=637062&view=diff
==============================================================================
--- harmony/enhanced/drlvm/trunk/make/vm/gc_gen.xml (original)
+++ harmony/enhanced/drlvm/trunk/make/vm/gc_gen.xml Fri Mar 14 04:21:27 2008
@@ -59,6 +59,21 @@
                 <include name="vmcore/src/util/win/include" if="is.windows"/>
                 <include name="vmcore/src/util/linux/include" if="is.unix"/>
             </dirset>
+            <dirset dir="${vm.home}/gc_gen/src">
+            	<include name="common" />
+                <include name="gen" />
+                <include name="mark_compact" />
+                <include name="mark_sweep" />
+                <include name="move_compact" />
+                <include name="semi_space" />
+                <include name="los" />
+                <include name="thread" />
+                <include name="trace_forward" />
+                <include name="utils" />
+                <include name="jni" />
+                <include name="verify" />
+                <include name="finalizer_weakref" />
+            </dirset>
         </path>
         
         <compiler id="cpp.compiler" extends="common.cpp.compiler">
@@ -69,6 +84,7 @@
                 <include name="gen/*.cpp" />
                 <include name="mark_compact/*.cpp" />
                 <include name="mark_sweep/*.cpp" />
+                <include name="move_compact/*.cpp" />
                 <include name="semi_space/*.cpp" />
                 <include name="los/*.cpp" />
                 <include name="thread/*.cpp" />

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=637062&r1=637061&r2=637062&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 Fri Mar 14 04:21:27 2008
@@ -21,11 +21,14 @@
 #include "../mark_sweep/wspace.h"
 #include "collection_scheduler.h"
 #include "gc_concurrent.h"
+#include "../thread/marker.h"
 #include "../verify/verify_live_heap.h"
 
 #define NUM_TRIAL_COLLECTION 10
+#define MAX_DELAY_TIME 0x7fFfFfFf
+#define MAX_TRACING_RATE 2
 
-static int64 time_delay_to_start_mark = 0;
+static int64 time_delay_to_start_mark = MAX_DELAY_TIME;
 
 void collection_scheduler_initialize(GC* gc)
 {
@@ -36,7 +39,7 @@
   
   collection_scheduler->gc = gc;
   gc->collection_scheduler = collection_scheduler;
-  time_delay_to_start_mark = 0;
+  time_delay_to_start_mark = MAX_DELAY_TIME;
   
   return;
 }
@@ -49,20 +52,18 @@
 {
   if(!USE_CONCURRENT_MARK) return FALSE;
   //FIXME: GEN mode also needs the support of starting mark after thread resume.
-#ifdef USE_MARK_SWEEP_GC
+#ifdef USE_UNIQUE_MARK_SWEEP_GC
   if(gc_is_concurrent_mark_phase() || gc_mark_is_concurrent()) return FALSE;
 
   int64 time_current = time_now();
   if( time_current - get_collection_end_time() > time_delay_to_start_mark) 
     return TRUE;
-  else return FALSE;
-#else
-  /*FIXME: concurrent mark is not support in GC_GEN*/
-  assert(0);
-  if(gc_next_collection_kind((GC_Gen*)gc) == MAJOR_COLLECTION)
-    return TRUE;
   else 
     return FALSE;
+#else
+  /*FIXME: concurrent mark is not supported in GC_GEN*/
+  assert(0);
+  return FALSE;
 #endif
 }
 
@@ -96,7 +97,7 @@
 void gc_update_collection_scheduler(GC* gc, int64 time_mutator, int64 time_mark)
 {
   //FIXME: support GEN GC.
-#ifdef USE_MARK_SWEEP_GC
+#ifdef USE_UNIQUE_MARK_SWEEP_GC
 
   Collection_Scheduler* collection_scheduler = gc->collection_scheduler;   
   Space* space = NULL;
@@ -109,27 +110,36 @@
   unsigned int num_slot   = collection_scheduler->num_slot_in_window;
   
   collection_scheduler->num_obj_traced_window[slot_index] = space_stat->num_live_obj;
-  collection_scheduler->size_alloced_window[slot_index] = space_stat->last_size_free_space;
+  collection_scheduler->size_alloced_window[slot_index] = space_stat->size_new_obj;
+  collection_scheduler->space_utilization_rate[slot_index] = space_stat->space_utilization_ratio;
 
   collection_scheduler->last_mutator_time = time_mutator;
   collection_scheduler->last_collector_time = time_mark;
+  INFO2("gc.con","last_size_free_space"<<(space_stat->last_size_free_space)<<"  new obj num "<<collection_scheduler->size_alloced_window[slot_index]<<" ");
+  if(NUM_TRIAL_COLLECTION == 0 || gc->num_collections < NUM_TRIAL_COLLECTION)
+    return;
+  INFO2("gc.con","num_live_obj "<<(space_stat->num_live_obj)<<"  last_size_free_space"<<(space_stat->last_size_free_space)<<" ");
   
   collection_scheduler->alloc_rate_window[slot_index] 
     = time_mutator == 0 ? 0 : (float)collection_scheduler->size_alloced_window[slot_index] / time_mutator; 
       
   collection_scheduler->trace_rate_window[slot_index]
-    = time_mark == 0 ? 0 : (float)collection_scheduler->num_obj_traced_window[slot_index] / time_mark;
-
+    = time_mark == 0 ? MAX_TRACING_RATE : (float)collection_scheduler->num_obj_traced_window[slot_index] / time_mark;
+  
+  INFO2("gc.con","mutator time "<<(time_mutator>>10)<<"  collection time "<<(time_mark>>10)<<" ");
+  
   collection_scheduler->num_slot_in_window = num_slot >= STATISTICS_SAMPLING_WINDOW_SIZE ? num_slot : (++num_slot);
   collection_scheduler->last_slot_index_in_window = (++slot_index)% STATISTICS_SAMPLING_WINDOW_SIZE;
 
   float sum_alloc_rate = 0;
   float sum_trace_rate = 0;
+  float sum_space_util_ratio = 0;
 
   unsigned int i;
   for(i = 0; i < collection_scheduler->num_slot_in_window; i++){
     sum_alloc_rate += collection_scheduler->alloc_rate_window[i];
     sum_trace_rate += collection_scheduler->trace_rate_window[i];
+    sum_space_util_ratio += collection_scheduler->space_utilization_rate[i];
   }
 
   TRACE2("gc.con","Allocation Rate: ");
@@ -145,14 +155,19 @@
 
   float average_alloc_rate = sum_alloc_rate / collection_scheduler->num_slot_in_window;
   float average_trace_rate = sum_trace_rate / collection_scheduler->num_slot_in_window;
+  float average_space_util_ratio = sum_space_util_ratio / collection_scheduler->num_slot_in_window;
 
-  if(average_alloc_rate == 0 || average_trace_rate == 0){
+  INFO2("gc.con","averAllocRate: "<<average_alloc_rate<<"averTraceRate: "<<average_trace_rate<<" ");
+
+  if(average_alloc_rate == 0 ){
     time_delay_to_start_mark = 0;
+  }else if(average_trace_rate == 0){
+    time_delay_to_start_mark = MAX_DELAY_TIME;
   }else{
-    float time_alloc_expected = space_stat->size_free_space / average_alloc_rate;
+    float time_alloc_expected = (space_stat->size_free_space * average_space_util_ratio) / average_alloc_rate;
     float time_trace_expected = space_stat->num_live_obj / average_trace_rate;
 
-
+    INFO2("gc.con","[Concurrent GC] expected alloc time "<<time_alloc_expected<<"  expected collect time  "<<time_trace_expected<<" ");
     if(time_alloc_expected > time_trace_expected){
       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);
@@ -224,7 +239,7 @@
   if(gc_need_start_concurrent_mark(gc)){
     vm_gc_lock_enum();    
     int64 pause_start = time_now();
-    INFO2("gc.con", "[Concurrent GC] concurrent mark start ...\n");
+    INFO2("gc.con", "[Concurrent GC] concurrent mark start ...");
     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");
@@ -234,6 +249,7 @@
 
   if(gc_need_start_concurrent_sweep(gc)){
     gc->num_collections++;
+    INFO2("gc.con", "[Concurrent GC] collection number:"<< gc->num_collections<<" ");
     gc_start_concurrent_sweep(gc);
     unlock(gc->collection_scheduler_lock);
     return TRUE;
@@ -245,6 +261,8 @@
     int disable_count = hythread_reset_suspend_disable();    
     gc_prepare_rootset(gc);
     gc_reset_after_concurrent_collection(gc);
+    gc_start_mutator_time_measurement(gc);
+    set_collection_end_time();
     vm_resume_threads_after();
     hythread_set_suspend_disable(disable_count);
     vm_gc_unlock_enum();
@@ -256,4 +274,5 @@
   return FALSE;
 
 }
+
 

Modified: harmony/enhanced/drlvm/trunk/vm/gc_gen/src/common/collection_scheduler.h
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/gc_gen/src/common/collection_scheduler.h?rev=637062&r1=637061&r2=637062&view=diff
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/gc_gen/src/common/collection_scheduler.h (original)
+++ harmony/enhanced/drlvm/trunk/vm/gc_gen/src/common/collection_scheduler.h Fri Mar 14 04:21:27 2008
@@ -37,6 +37,7 @@
   
   float alloc_rate_window[STATISTICS_SAMPLING_WINDOW_SIZE];
   float trace_rate_window[STATISTICS_SAMPLING_WINDOW_SIZE];
+  float space_utilization_rate[STATISTICS_SAMPLING_WINDOW_SIZE];
   POINTER_SIZE_INT num_obj_traced_window[STATISTICS_SAMPLING_WINDOW_SIZE];
   POINTER_SIZE_INT size_alloced_window[STATISTICS_SAMPLING_WINDOW_SIZE];
 } Collection_Scheduler;
@@ -51,4 +52,6 @@
 
 
 #endif
+
+
 

Modified: harmony/enhanced/drlvm/trunk/vm/gc_gen/src/common/compressed_ref.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/gc_gen/src/common/compressed_ref.cpp?rev=637062&r1=637061&r2=637062&view=diff
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/gc_gen/src/common/compressed_ref.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/gc_gen/src/common/compressed_ref.cpp Fri Mar 14 04:21:27 2008
@@ -32,7 +32,7 @@
 }Compressed_Root;
 
 POINTER_SIZE_INT vtable_base = 0;
-POINTER_SIZE_INT HEAP_NULL = 0;
+POINTER_SIZE_INT HEAP_BASE = 0;
 
 void gc_set_uncompressed_rootset(GC *gc)
 {
@@ -69,5 +69,7 @@
     }
   }
 }
+
+
 
 

Modified: harmony/enhanced/drlvm/trunk/vm/gc_gen/src/common/fix_repointed_refs.h
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/gc_gen/src/common/fix_repointed_refs.h?rev=637062&r1=637061&r2=637062&view=diff
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/gc_gen/src/common/fix_repointed_refs.h (original)
+++ harmony/enhanced/drlvm/trunk/vm/gc_gen/src/common/fix_repointed_refs.h Fri Mar 14 04:21:27 2008
@@ -24,7 +24,7 @@
 
 #include "gc_common.h"
 #include "compressed_ref.h"
-extern Boolean IS_MOVE_COMPACT;
+#include "../finalizer_weakref/finalizer_weakref.h"
 extern void* los_boundary;
 
 inline void slot_fix(REF* p_ref)
@@ -40,7 +40,7 @@
   
 #endif
 
-  if(IS_MOVE_COMPACT){
+  if(collect_is_compact_move()){
     /* This condition is removed because we do los sliding compaction at every major compaction after add los minor sweep. */
     //if(obj_is_moved(p_obj)) 
     /*Fixme: los_boundery ruined the modularity of gc_common.h*/
@@ -93,6 +93,13 @@
      REF* p_ref = object_ref_iterator_get(ref_iterator+i, p_obj);        
      slot_fix(p_ref);  
   }
+
+#ifndef BUILD_IN_REFERENT
+  if(IGNORE_FINREF && is_reference_obj(p_obj)) {
+    REF* p_ref = obj_get_referent_field(p_obj);
+    slot_fix(p_ref);
+  }
+#endif
 
   return;
 }

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=637062&r1=637061&r2=637062&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 Fri Mar 14 04:21:27 2008
@@ -47,9 +47,7 @@
   void* ceiling;                    
   void* new_free; /* used only during compaction */
   unsigned int block_idx;           
-#ifdef USE_UNIQUE_MOVE_COMPACT_GC
-  unsigned int num_multi_block; /*number of block in large block*/
-#endif
+  unsigned int num_multi_block; /* number of blocks in large block */
   volatile unsigned int status;
 
   volatile unsigned int num_live_objs; /* for verification debugging */
@@ -63,9 +61,6 @@
   Hashcode_Buf* hashcode_buf; /*hash code entry list*/
 #endif
   Block_Header* next;
-#ifdef USE_UNIQUE_MOVE_COMPACT_GC
-  Block_Header* next_large_block; /*used to link free super large block in gc_mc*/
-#endif
   POINTER_SIZE_INT table[1]; /* entry num == OFFSET_TABLE_SIZE_WORDS */
 }Block_Header;
 
@@ -106,18 +101,15 @@
 #define ADDRESS_OFFSET_TO_BLOCK_HEADER(addr) ((unsigned int)((POINTER_SIZE_INT)addr&GC_BLOCK_LOW_MASK))
 #define ADDRESS_OFFSET_IN_BLOCK_BODY(addr) ((unsigned int)(ADDRESS_OFFSET_TO_BLOCK_HEADER(addr)- GC_BLOCK_HEADER_SIZE_BYTES))
 
-#ifdef USE_UNIQUE_MOVE_COMPACT_GC
-#define NUM_BLOCKS_PER_LARGE_OBJECT(size) (((size)+GC_BLOCK_HEADER_SIZE_BYTES+ GC_BLOCK_SIZE_BYTES-1)/GC_BLOCK_SIZE_BYTES)
-#endif
+#define NUM_BLOCKS_IN_LARGE_BLOCK_FOR_SIZE(size) ((unsigned int)(((size)+ GC_BLOCK_HEADER_SIZE_BYTES + GC_BLOCK_SIZE_BYTES - 1)>>GC_BLOCK_SHIFT_COUNT))
+
 inline void block_init(Block_Header* block)
 {
   block->free = (void*)((POINTER_SIZE_INT)block + GC_BLOCK_HEADER_SIZE_BYTES);
   block->ceiling = (void*)((POINTER_SIZE_INT)block + GC_BLOCK_SIZE_BYTES); 
   block->base = block->free;
   block->new_free = block->free;
-#ifdef USE_UNIQUE_MOVE_COMPACT_GC
   block->num_multi_block = 0;
-#endif
   block->status = BLOCK_FREE;
   block->dest_counter = 0;
   block->src = NULL;
@@ -278,6 +270,8 @@
 /* blocked_space hashcode_buf ops --> */
 
 #endif //#ifndef _BLOCK_H_
+
+
 
 
 

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=637062&r1=637061&r2=637062&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 Fri Mar 14 04:21:27 2008
@@ -37,338 +37,16 @@
 
 unsigned int SPACE_ALLOC_UNIT;
 
-extern char* GC_VERIFY;
-
-extern POINTER_SIZE_INT NOS_SIZE;
-extern POINTER_SIZE_INT MIN_NOS_SIZE;
-extern POINTER_SIZE_INT INIT_LOS_SIZE;
-extern POINTER_SIZE_INT TOSPACE_SIZE;
-extern POINTER_SIZE_INT MOS_RESERVE_SIZE;
-
-extern Boolean FORCE_FULL_COMPACT;
-
-extern unsigned int NUM_MARKERS;
-extern unsigned int NUM_COLLECTORS;
-extern unsigned int MINOR_COLLECTORS;
-extern unsigned int MAJOR_COLLECTORS;
-
-extern Boolean IGNORE_VTABLE_TRACING;
-
-POINTER_SIZE_INT HEAP_SIZE_DEFAULT = 256 * MB;
-POINTER_SIZE_INT min_heap_size_bytes = 16 * MB;
-POINTER_SIZE_INT max_heap_size_bytes = 0;
-
-extern Boolean JVMTI_HEAP_ITERATION ;
-
-extern Boolean IS_MOVE_COMPACT;
-extern Boolean USE_CONCURRENT_GC;
-
-static int get_int_property(const char *property_name)
-{
-    assert(property_name);
-    char *value = get_property(property_name, VM_PROPERTIES);
-    int return_value;
-    if (NULL != value)
-    {
-        return_value = atoi(value);
-        destroy_property_value(value);
-    }else{
-        DIE2("gc.base","Warning: property value "<<property_name<<"is not set!");
-        exit(0);
-    }
-      
-    return return_value;
-}
-
-static Boolean get_boolean_property(const char *property_name)
-{
-  assert(property_name);
-  char *value = get_property(property_name, VM_PROPERTIES);
-  if (NULL == value){
-    DIE2("gc.base","Warning: property value "<<property_name<<" is not set!");
-    exit(0);
-  }
-  
-  Boolean return_value;
-  if (0 == strcmp("no", value)
-      || 0 == strcmp("off", value)
-      || 0 == strcmp("false", value)
-      || 0 == strcmp("0", value))
-  {
-    return_value = FALSE;
-  }
-  else if (0 == strcmp("yes", value)
-           || 0 == strcmp("on", value)
-           || 0 == strcmp("true", value)
-           || 0 == strcmp("1", value))
-  {
-    return_value = TRUE;
-  }else{
-    DIE2("gc.base","Warning: property value "<<property_name<<" is not set! Use upper case?");
-    exit(0);
-  }
-    
-  destroy_property_value(value);
-  return return_value;
-}
-
-static size_t get_size_property(const char* name) 
-{
-  char* size_string = get_property(name, VM_PROPERTIES);
-  size_t size = atol(size_string);
-  int sizeModifier = tolower(size_string[strlen(size_string) - 1]);
-  destroy_property_value(size_string);
-
-  size_t unit = 1;
-  switch (sizeModifier) {
-  case 'k': unit = 1024; break;
-  case 'm': unit = 1024 * 1024; break;
-  case 'g': unit = 1024 * 1024 * 1024;break;
-  }
-
-  size_t res = size * unit;
-  if (res / unit != size) {
-    /* overflow happened */
-    return 0;
-  }
-  return res;
-}
-
-void gc_parse_options(GC* gc) 
-{
-  TRACE2("gc.process", "GC: parse options ...\n");
-  if (!get_boolean_property("vm.assert_dialog", TRUE, VM_PROPERTIES))
-    disable_assert_dialogs();
-  
-  POINTER_SIZE_INT max_heap_size = HEAP_SIZE_DEFAULT;
-  POINTER_SIZE_INT min_heap_size = min_heap_size_bytes;
-  
-  if (is_property_set("gc.mx", VM_PROPERTIES) == 1) {
-    max_heap_size = get_size_property("gc.mx");
-
-    if (max_heap_size < min_heap_size){
-      max_heap_size = min_heap_size;
-      WARN2("gc.base","Warning: Max heap size you set is too small, reset to "<<max_heap_size/MB<<" MB!");
-    }
-    if (0 == max_heap_size){
-      max_heap_size = HEAP_SIZE_DEFAULT;
-      WARN2("gc.base","Warning: Max heap size you set euqals to zero, reset to "<<max_heap_size/MB<<" MB!");
-    }
- 
-    min_heap_size = max_heap_size / 10;
-    if (min_heap_size < min_heap_size_bytes){
-      min_heap_size = min_heap_size_bytes;
-//      printf("Min heap size: too small, reset to %d MB! \n", min_heap_size/MB);
-    }
-  }
-
-  if (is_property_set("gc.ms", VM_PROPERTIES) == 1) {
-    min_heap_size = get_size_property("gc.ms");
-    if (min_heap_size < min_heap_size_bytes){
-      min_heap_size = min_heap_size_bytes;
-      WARN2("gc.base","Warning: Min heap size you set is too small, reset to "<<min_heap_size/MB<<" MB!");
-    } 
-  }
-
-  if (min_heap_size > max_heap_size){
-    max_heap_size = min_heap_size;
-    WARN2("gc.base","Warning: Max heap size is too small, reset to "<<max_heap_size/MB<<" MB!");
-  }
-
-  min_heap_size_bytes = min_heap_size;
-  max_heap_size_bytes = max_heap_size;
-
-  if (is_property_set("gc.nos_size", VM_PROPERTIES) == 1) {
-    NOS_SIZE = get_size_property("gc.nos_size");
-  }
-
-  if (is_property_set("gc.min_nos_size", VM_PROPERTIES) == 1) {
-    MIN_NOS_SIZE = get_size_property("gc.min_nos_size");
-  }
-
-  if (is_property_set("gc.init_los_size", VM_PROPERTIES) == 1) {
-    INIT_LOS_SIZE = get_size_property("gc.init_los_size");
-  }  
-
-  if (is_property_set("gc.num_collectors", VM_PROPERTIES) == 1) {
-    unsigned int num = get_int_property("gc.num_collectors");
-    NUM_COLLECTORS = (num==0)? NUM_COLLECTORS:num;
-  }
-
-  if (is_property_set("gc.num_markers", VM_PROPERTIES) == 1) {
-    unsigned int num = get_int_property("gc.num_markers");
-    NUM_MARKERS = (num==0)? NUM_MARKERS:num;
-  }
-
-  /* GC algorithm decision */
-  /* Step 1: */
-  char* minor_algo = NULL;
-  char* major_algo = NULL;
-  
-  if (is_property_set("gc.minor_algorithm", VM_PROPERTIES) == 1) {
-    minor_algo = get_property("gc.minor_algorithm", VM_PROPERTIES);
-  }
-  
-  if (is_property_set("gc.major_algorithm", VM_PROPERTIES) == 1) {
-    major_algo = get_property("gc.major_algorithm", VM_PROPERTIES);
-  }
-  
-  gc_decide_collection_algorithm((GC_Gen*)gc, minor_algo, major_algo);
-  gc->generate_barrier = gc_is_gen_mode();
-
-  if( minor_algo) destroy_property_value(minor_algo);
-  if( major_algo) destroy_property_value(major_algo);
-
-  /* Step 2: */
-  /* NOTE:: this has to stay after above!! */
-  if (is_property_set("gc.force_major_collect", VM_PROPERTIES) == 1) {
-    FORCE_FULL_COMPACT = get_boolean_property("gc.force_major_collect");
-    if(FORCE_FULL_COMPACT){
-      gc_disable_gen_mode();
-      gc->generate_barrier = FALSE;
-    }
-  }
-
-  /* Step 3: */
-  /* NOTE:: this has to stay after above!! */
-  if (is_property_set("gc.generate_barrier", VM_PROPERTIES) == 1) {
-    Boolean generate_barrier = get_boolean_property("gc.generate_barrier");
-    gc->generate_barrier = generate_barrier || gc->generate_barrier;
-  }
-
-  if (is_property_set("gc.tospace_size", VM_PROPERTIES) == 1) {
-    TOSPACE_SIZE = get_size_property("gc.tospace_size");
-  }
-
-  if (is_property_set("gc.mos_reserve_size", VM_PROPERTIES) == 1) {
-    MOS_RESERVE_SIZE = get_size_property("gc.mos_reserve_size");
-  }
-
-  if (is_property_set("gc.nos_partial_forward", VM_PROPERTIES) == 1) {
-    NOS_PARTIAL_FORWARD = get_boolean_property("gc.nos_partial_forward");
-  }
-    
-  if (is_property_set("gc.minor_collectors", VM_PROPERTIES) == 1) {
-    MINOR_COLLECTORS = get_int_property("gc.minor_collectors");
-  }
-
-  if (is_property_set("gc.major_collectors", VM_PROPERTIES) == 1) {
-    MAJOR_COLLECTORS = get_int_property("gc.major_collectors");
-  }
-
-  if (is_property_set("gc.ignore_finref", VM_PROPERTIES) == 1) {
-    IGNORE_FINREF = get_boolean_property("gc.ignore_finref");
-  }
-
-  if (is_property_set("gc.verify", VM_PROPERTIES) == 1) {
-    char* value = get_property("gc.verify", VM_PROPERTIES);
-    GC_VERIFY = strdup(value);
-    destroy_property_value(value);
-  }
-
-  if (is_property_set("gc.gen_nongen_switch", VM_PROPERTIES) == 1){
-    GEN_NONGEN_SWITCH= get_boolean_property("gc.gen_nongen_switch");
-    gc->generate_barrier = TRUE;
-  }
-
-  if (is_property_set("gc.heap_iteration", VM_PROPERTIES) == 1) {
-    JVMTI_HEAP_ITERATION = get_boolean_property("gc.heap_iteration");
-  }
-
-  if (is_property_set("gc.ignore_vtable_tracing", VM_PROPERTIES) == 1) {
-    IGNORE_VTABLE_TRACING = get_boolean_property("gc.ignore_vtable_tracing");
-  }
-
-  if (is_property_set("gc.use_large_page", VM_PROPERTIES) == 1){
-    char* value = get_property("gc.use_large_page", VM_PROPERTIES);
-    large_page_hint = strdup(value);
-    destroy_property_value(value);
-  }
-
-  if (is_property_set("gc.concurrent_gc", VM_PROPERTIES) == 1){
-    Boolean use_all_concurrent_phase= get_boolean_property("gc.concurrent_gc");
-    if(use_all_concurrent_phase){
-      USE_CONCURRENT_ENUMERATION = TRUE;
-      USE_CONCURRENT_MARK = TRUE;
-      USE_CONCURRENT_SWEEP = TRUE;
-      gc->generate_barrier = TRUE;
-    }
-  }
-
-  if (is_property_set("gc.concurrent_enumeration", VM_PROPERTIES) == 1){
-    USE_CONCURRENT_ENUMERATION= get_boolean_property("gc.concurrent_enumeration");
-    if(USE_CONCURRENT_ENUMERATION){
-      USE_CONCURRENT_GC = TRUE;      
-      gc->generate_barrier = TRUE;
-    }
-  }
-
-  if (is_property_set("gc.concurrent_mark", VM_PROPERTIES) == 1){
-    USE_CONCURRENT_MARK= get_boolean_property("gc.concurrent_mark");
-    if(USE_CONCURRENT_MARK){
-      USE_CONCURRENT_GC = TRUE;      
-      gc->generate_barrier = TRUE;
-    }
-  }
-
-  if (is_property_set("gc.concurrent_sweep", VM_PROPERTIES) == 1){
-    USE_CONCURRENT_SWEEP= get_boolean_property("gc.concurrent_sweep");
-    if(USE_CONCURRENT_SWEEP){
-      USE_CONCURRENT_GC = TRUE;
-    }
-  }
-
-  char* concurrent_algo = NULL;
-  
-  if (is_property_set("gc.concurrent_algorithm", VM_PROPERTIES) == 1) {
-    concurrent_algo = get_property("gc.concurrent_algorithm", VM_PROPERTIES);
-  }
-  
-  gc_decide_concurrent_algorithm(gc, concurrent_algo);
-
-#if defined(ALLOC_ZEROING) && defined(ALLOC_PREFETCH)
-  if(is_property_set("gc.prefetch",VM_PROPERTIES) ==1) {
-    PREFETCH_ENABLED = get_boolean_property("gc.prefetch");
-  }
-
-  if(is_property_set("gc.prefetch_distance",VM_PROPERTIES)==1) {
-    PREFETCH_DISTANCE = get_size_property("gc.prefetch_distance");
-    if(!PREFETCH_ENABLED) {
-      WARN2("gc.prefetch_distance","Warning: Prefetch distance set with Prefetch disabled!");
-    }
-  }
-
-  if(is_property_set("gc.prefetch_stride",VM_PROPERTIES)==1) {
-    PREFETCH_STRIDE = get_size_property("gc.prefetch_stride");
-    if(!PREFETCH_ENABLED) {
-      WARN2("gc.prefetch_stride","Warning: Prefetch stride set  with Prefetch disabled!");
-    }  
-  }
-  
-  if(is_property_set("gc.zeroing_size",VM_PROPERTIES)==1) {
-    ZEROING_SIZE = get_size_property("gc.zeroing_size");
-  }   
-#endif
-
-#ifdef PREFETCH_SUPPORTED
-  if(is_property_set("gc.mark_prefetch",VM_PROPERTIES) ==1) {
-    mark_prefetch = get_boolean_property("gc.mark_prefetch");
-  }  
-#endif
-
-  return;
-}
-
 void gc_assign_free_area_to_mutators(GC* gc)
 {
-#if !defined(USE_MARK_SWEEP_GC) && !defined(USE_UNIQUE_MOVE_COMPACT_GC)
+#if !defined(USE_UNIQUE_MARK_SWEEP_GC) && !defined(USE_UNIQUE_MOVE_COMPACT_GC)
   gc_gen_assign_free_area_to_mutators((GC_Gen*)gc);
 #endif
 }
 
 void gc_init_collector_alloc(GC* gc, Collector* collector)
 {
-#ifndef USE_MARK_SWEEP_GC
+#ifndef USE_UNIQUE_MARK_SWEEP_GC
   gc_gen_init_collector_alloc((GC_Gen*)gc, collector);
 #else    
   gc_init_collector_free_chunk_list(collector);
@@ -377,14 +55,14 @@
 
 void gc_reset_collector_alloc(GC* gc, Collector* collector)
 {
-#if !defined(USE_MARK_SWEEP_GC) && !defined(USE_UNIQUE_MOVE_COMPACT_GC)
+#if !defined(USE_UNIQUE_MARK_SWEEP_GC) && !defined(USE_UNIQUE_MOVE_COMPACT_GC)
   gc_gen_reset_collector_alloc((GC_Gen*)gc, collector);
 #endif    
 }
 
 void gc_destruct_collector_alloc(GC* gc, Collector* collector)
 {
-#ifndef USE_MARK_SWEEP_GC
+#ifndef USE_UNIQUE_MARK_SWEEP_GC
   gc_gen_destruct_collector_alloc((GC_Gen*)gc, collector);
 #endif    
 }
@@ -398,6 +76,22 @@
 int64 get_collection_end_time()
 { return collection_end_time; }
 
+void set_collection_end_time()
+{ collection_end_time = time_now(); }
+
+void gc_decide_collection_kind(GC* gc, unsigned int cause)
+{
+  /* this is for debugging and for gen-nongen-switch. */
+  gc->last_collect_kind = GC_PROP;
+
+#if !defined(USE_UNIQUE_MARK_SWEEP_GC) && !defined(USE_UNIQUE_MOVE_COMPACT_GC)
+  
+  gc_gen_decide_collection_kind((GC_Gen*)gc, cause);
+
+#endif
+
+}
+
 void gc_prepare_rootset(GC* gc)
 {
   /* Stop the threads and collect the roots. */
@@ -423,10 +117,11 @@
      to avoid racing with mutators. */
   gc->num_collections++;
   gc->cause = gc_cause;
-  gc_decide_collection_kind((GC_Gen*)gc, gc_cause);
+
+  gc_decide_collection_kind(gc, gc_cause);
 
 #ifdef MARK_BIT_FLIPPING
-  if(gc_match_kind(gc, MINOR_COLLECTION)) mark_bit_flip();
+  if(collect_is_minor()) mark_bit_flip();
 #endif
 
   if(!USE_CONCURRENT_GC){
@@ -454,35 +149,38 @@
     
     if(!IGNORE_FINREF ) gc_set_obj_with_fin(gc);
 
-#if defined(USE_MARK_SWEEP_GC)
+#if defined(USE_UNIQUE_MARK_SWEEP_GC)
     gc_ms_reclaim_heap((GC_MS*)gc);
 #elif defined(USE_UNIQUE_MOVE_COMPACT_GC)
     gc_mc_reclaim_heap((GC_MC*)gc);
 #else
     gc_gen_reclaim_heap((GC_Gen*)gc, collection_start_time);
 #endif
+
   }
 
   collection_end_time = time_now(); 
 
-#if !defined(USE_MARK_SWEEP_GC)&&!defined(USE_UNIQUE_MOVE_COMPACT_GC)
+#if !defined(USE_UNIQUE_MARK_SWEEP_GC)&&!defined(USE_UNIQUE_MOVE_COMPACT_GC)
   gc_gen_collection_verbose_info((GC_Gen*)gc, collection_end_time - collection_start_time, mutator_time);
   gc_gen_space_verbose_info((GC_Gen*)gc);
 #endif
 
   if(gc_is_gen_mode()) gc_prepare_mutator_remset(gc);
   
-  int64 mark_time = 0;
+  int64 collection_time = 0;
   if(USE_CONCURRENT_GC && gc_mark_is_concurrent()){
-    mark_time = gc_get_concurrent_mark_time(gc);
+    collection_time = gc_get_concurrent_mark_time(gc);
     gc_reset_concurrent_mark(gc);
+  }else{
+    collection_time = time_now()-collection_start_time;
    }
 
   if(USE_CONCURRENT_GC && gc_sweep_is_concurrent()){
     gc_reset_concurrent_sweep(gc);
   }
 
-#if !defined(USE_MARK_SWEEP_GC)&&!defined(USE_UNIQUE_MOVE_COMPACT_GC)
+#if !defined(USE_UNIQUE_MARK_SWEEP_GC)&&!defined(USE_UNIQUE_MOVE_COMPACT_GC)
   if(USE_CONCURRENT_GC && gc_need_start_concurrent_mark(gc))
     gc_start_concurrent_mark(gc);
 #endif
@@ -500,20 +198,27 @@
 #ifndef BUILD_IN_REFERENT
   } else {
     gc_clear_weakref_pools(gc);
+    gc_clear_finref_repset_pool(gc);
 #endif
   }
 
-#ifdef USE_MARK_SWEEP_GC
+#ifdef USE_UNIQUE_MARK_SWEEP_GC
   gc_ms_update_space_statistics((GC_MS*)gc);
 #endif
 
   gc_assign_free_area_to_mutators(gc);
   
-  if(USE_CONCURRENT_GC) gc_update_collection_scheduler(gc, mutator_time, mark_time);
-  
+  if(USE_CONCURRENT_GC) gc_update_collection_scheduler(gc, mutator_time, collection_time);
+
+#ifdef USE_UNIQUE_MARK_SWEEP_GC
+  gc_ms_reset_space_statistics((GC_MS*)gc);
+#endif
+
   vm_reclaim_native_objs();
   gc->in_collection = FALSE;
 
+  gc_reset_collector_state(gc);
+
   gc_clear_dirty_set(gc);
   
   vm_resume_threads_after();
@@ -524,6 +229,8 @@
   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=637062&r1=637061&r2=637062&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 Fri Mar 14 04:21:27 2008
@@ -35,14 +35,19 @@
 
 #include "gc_for_class.h"
 #include "gc_platform.h"
+#include "gc_properties.h"
 
 #include "../common/gc_for_barrier.h"
 
 /* 
-#define USE_MARK_SWEEP_GC  //define it to only use Mark-Sweep GC (no NOS, no LOS).
+#define USE_UNIQUE_MARK_SWEEP_GC  //define it to only use Mark-Sweep GC (no NOS, no LOS).
+#define USE_UNIQUE_MOVE_COMPACT_GC //define it to only use Move-Compact GC (no NOS, no LOS).
 */
-//#define USE_UNIQUE_MOVE_COMPACT_GC //define it to only use Move-Compact GC (no NOS, no LOS).
+
 #define GC_GEN_STATS
+#define USE_32BITS_HASHCODE
+#define GC_LOS_OBJ_SIZE_THRESHOLD (5*KB)
+
 #define null 0
 
 #define KB  (1<<10)
@@ -77,76 +82,11 @@
 #define BYTES_OF_POINTER_SIZE_INT (sizeof(POINTER_SIZE_INT))
 #define BIT_SHIFT_TO_BYTES_OF_POINTER_SIZE_INT ((sizeof(POINTER_SIZE_INT)==4)? 2: 3)
 
-#define GC_OBJ_SIZE_THRESHOLD (5*KB)
-
-#define USE_32BITS_HASHCODE
-
-/* define it to use only mark-sweep GC for entire heap management */
-//#define USE_MARK_SWEEP_GC
-
 typedef void (*TaskType)(void*);
 
-enum Collection_Algorithm{
-  COLLECTION_ALGOR_NIL,
-  
-  MINOR_GEN_FORWARD_POOL,
-  MINOR_NONGEN_FORWARD_POOL,
-  
-  MINOR_GEN_SEMISPACE_POOL,
-  MINOR_NONGEN_SEMISPACE_POOL,  
-  
-  MAJOR_COMPACT_SLIDE,
-  MAJOR_COMPACT_MOVE,
-  MAJOR_MARK_SWEEP  
-};
-
-/* Possible combinations:
- * MINOR_COLLECTION
- * NORMAL_MAJOR_COLLECTION
- * FALLBACK_COLLECTION
- * NORMAL_MAJOR_COLLECTION | EXTEND_COLLECTION
- * FALLBACK_COLLECTION | EXTEND_COLLECTION
- * MS_COLLECTION
- * MS_COMPACT_COLLECTION
- */
-enum Collection_Kind {
-  /* Two main kinds: generational GC and mark-sweep GC; this is decided at compiling time */
-  GEN_GC = 0x1,
-  MARK_SWEEP_GC = 0x2,
-  MOVE_COMPACT_NO_LOS = 0x4,
-  /* Mask of bits standing for two basic kinds */
-  GC_BASIC_KIND_MASK = ~(unsigned int)0x7,
-  
-  /* Sub-kinds of generational GC use the 4~7th LSB */
-  MINOR_COLLECTION = 0x11,  /* 0x10 & GEN_GC */
-  MAJOR_COLLECTION = 0x21,  /* 0x20 & GEN_GC */
-  
-  /* Sub-kinds of major collection use the 8~11th LSB */
-  NORMAL_MAJOR_COLLECTION = 0x121,  /* 0x100 & MAJOR_COLLECTION */
-  FALLBACK_COLLECTION = 0x221,  /* 0x200 & MAJOR_COLLECTION */
-  EXTEND_COLLECTION = 0x421,  /* 0x400 & MAJOR_COLLECTION */
-  
-  /* Sub-kinds of mark-sweep GC use the 12~15th LSB */
-  MS_COLLECTION = 0x1002,  /* 0x1000 & MARK_SWEEP_GC */
-  MS_COMPACT_COLLECTION = 0x2002,  /* 0x2000 & MARK_SWEEP_GC */
-  MC_COLLECTION = 0x1004
-};
-
-extern Boolean IS_FALLBACK_COMPACTION;  /* only for mark/fw bits debugging purpose */
-
-enum GC_CAUSE{
-  GC_CAUSE_NIL,
-  GC_CAUSE_NOS_IS_FULL,
-  GC_CAUSE_LOS_IS_FULL,
-  GC_CAUSE_COS_IS_FULL,
-  GC_CAUSE_WSPACE_IS_FULL,
-  GC_CAUSE_RUNTIME_FORCE_GC
-};
-
-
-extern POINTER_SIZE_INT HEAP_NULL;
+extern POINTER_SIZE_INT HEAP_BASE;
 
-//#define COMPRESS_REFERENCE // Now passed from outside 
+//#define COMPRESS_REFERENCE // Now it's a VM-wide macro, defined in build file 
 
 #if !defined(POINTER64) && defined(COMPRESS_REFERENCE)
 #error "32-bit architecture does not support references compression"
@@ -166,13 +106,13 @@
 #ifdef COMPRESS_REFERENCE
   if(!p_obj){
           /*Fixme: em64t: vm performs a simple compress/uncompress machenism
-           i.e. just add or minus HEAP_NULL to p_obj
+           i.e. just add or minus HEAP_BASE to p_obj
            But in gc we distinguish zero from other p_obj
            Now only in prefetch next live object we can hit this point. */
     return (REF)0;
   }
   else
-    return (REF) ((POINTER_SIZE_INT) p_obj - HEAP_NULL);
+    return (REF) ((POINTER_SIZE_INT) p_obj - HEAP_BASE);
 #else
     return (REF)p_obj;
 #endif
@@ -184,7 +124,7 @@
   if(!ref){
     return NULL; 
   }
-  return (Partial_Reveal_Object *)(HEAP_NULL + ref);
+  return (Partial_Reveal_Object *)(HEAP_BASE + ref);
 
 #else
   return (Partial_Reveal_Object *)ref;
@@ -316,7 +256,7 @@
 
 inline void obj_set_fw_in_oi(Partial_Reveal_Object *obj, void *dest)
 { 
-  assert(IS_FALLBACK_COMPACTION || (!(get_obj_info_raw(obj) & FLIP_FORWARD_BIT))); 
+  assert(collect_is_fallback() || (!(get_obj_info_raw(obj) & FLIP_FORWARD_BIT))); 
   /* This assert should always exist except it's fall back compaction. In fall-back compaction
      an object can be marked in last time minor collection, which is exactly this time's fw bit,
      because the failed minor collection flipped the bits. */
@@ -499,6 +439,14 @@
 
 }GC;
 
+
+inline Boolean collect_last_is_minor(GC* gc)
+{
+  return (Boolean)((gc->last_collect_kind & ALGO_MAJOR) == 0);
+}
+
+/* ============================================================================ */
+
 void mark_scan_pool(Collector* collector);
 
 inline void mark_scan_heap(Collector* collector)
@@ -515,30 +463,17 @@
 
 Boolean obj_belongs_to_gc_heap(Partial_Reveal_Object* p_obj);
 
-/* gc must match exactly that kind if returning TRUE */
-inline Boolean gc_match_kind(GC *gc, unsigned int kind)
-{
-  assert(gc->collect_kind && kind);
-  return (Boolean)((gc->collect_kind & kind) == kind);
-}
-/* multi_kinds is a combination of multi collect kinds
- * gc must match one of them.
- */
-inline Boolean gc_match_either_kind(GC *gc, unsigned int multi_kinds)
-{
-  multi_kinds &= GC_BASIC_KIND_MASK;
-  assert(gc->collect_kind && multi_kinds);
-  return (Boolean)(gc->collect_kind & multi_kinds);
-}
+inline void gc_reset_collector_state(GC* gc){ gc->num_active_collectors = 0;}
 
 inline unsigned int gc_get_processor_num(GC* gc) { return gc->_num_processors; }
 
-void gc_parse_options(GC* gc);
+GC* gc_parse_options();
 void gc_reclaim_heap(GC* gc, unsigned int gc_cause);
 void gc_prepare_rootset(GC* gc);
 
 
 int64 get_collection_end_time();
+void set_collection_end_time();
 
 /* generational GC related */
 
@@ -562,6 +497,7 @@
 void gc_init_collector_alloc(GC* gc, Collector* collector);
 void gc_reset_collector_alloc(GC* gc, Collector* collector);
 void gc_destruct_collector_alloc(GC* gc, Collector* collector);
+void gc_decide_collection_kind(GC* gc, unsigned int cause);
 
 FORCE_INLINE Boolean addr_belongs_to_nos(void* addr)
 { return addr >= nos_boundary; }

Modified: harmony/enhanced/drlvm/trunk/vm/gc_gen/src/common/gc_concurrent.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/gc_gen/src/common/gc_concurrent.cpp?rev=637062&r1=637061&r2=637062&view=diff
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/gc_gen/src/common/gc_concurrent.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/gc_gen/src/common/gc_concurrent.cpp Fri Mar 14 04:21:27 2008
@@ -45,7 +45,7 @@
 {
   if(!is_mark_finished(gc)){
     lock(gc->concurrent_mark_lock);
-#ifndef USE_MARK_SWEEP_GC
+#ifndef USE_UNIQUE_MARK_SWEEP_GC
     gc_gen_start_concurrent_mark((GC_Gen*)gc);
 #else
     if(gc_concurrent_match_algorithm(OTF_REM_OBJ_SNAPSHOT_ALGO)){
@@ -76,7 +76,7 @@
 {
   wait_mark_finish(gc);
   gc_set_barrier_function(WRITE_BARRIER_REM_NIL);
-  mem_fence();
+  //mem_fence(); we do not need memory fence here.
   gc_check_mutator_barrier(gc);
   gc_set_concurrent_status(gc,GC_CONCURRENT_STATUS_NIL);
 }
@@ -106,12 +106,14 @@
   }
   gc_set_concurrent_status(gc, GC_CONCURRENT_MARK_PHASE);
 
-  gc_decide_collection_kind((GC_Gen*)gc, GC_CAUSE_NIL);
+#ifndef USE_UNIQUE_MARK_SWEEP_GC
+  gc_decide_collection_kind((GC*)gc, GC_CAUSE_NIL);
+#endif
 
   num_marker = gc_decide_marker_number(gc);
   
   /*start concurrent mark*/
-#ifndef USE_MARK_SWEEP_GC
+#ifndef USE_UNIQUE_MARK_SWEEP_GC
   gc_gen_start_concurrent_mark((GC_Gen*)gc);
 #else
   if(gc_concurrent_match_algorithm(OTF_REM_OBJ_SNAPSHOT_ALGO)){
@@ -150,21 +152,35 @@
     wspace_mark_scan_mostly_concurrent_terminate();
   
   gc_wait_concurrent_mark_finish(gc);
+
+  int disable_count;   
+  if(!is_STW){
+    /*suspend the mutators.*/   
+    lock(gc->enumerate_rootset_lock);    
+    gc_clear_rootset(gc);
+    gc_metadata_verify(gc, TRUE);
+    gc_reset_rootset(gc);    
+    disable_count = hythread_reset_suspend_disable();
+    vm_enumerate_root_set_all_threads();
+    gc_copy_interior_pointer_table_to_rootset();
+    gc_set_rootset(gc); 
+  }
+
   
   if(gc_concurrent_match_algorithm(MOSTLY_CONCURRENT_ALGO)){
     /*If gc use mostly concurrent algorithm, there's a final marking pause. 
           Suspend the mutators once again and finish the marking phase.*/
-    int disable_count;   
-    if(!is_STW){
-      /*suspend the mutators.*/   
-      lock(gc->enumerate_rootset_lock);
-      gc_metadata_verify(gc, TRUE);
-      gc_reset_rootset(gc);    
-      disable_count = hythread_reset_suspend_disable();
-      vm_enumerate_root_set_all_threads();
-      gc_copy_interior_pointer_table_to_rootset();
-      gc_set_rootset(gc); 
-    }
+//    int disable_count;   
+//    if(!is_STW){
+//      /*suspend the mutators.*/   
+//      lock(gc->enumerate_rootset_lock);
+//      gc_metadata_verify(gc, TRUE);
+//      gc_reset_rootset(gc);    
+//      disable_count = hythread_reset_suspend_disable();
+//      vm_enumerate_root_set_all_threads();
+//      gc_copy_interior_pointer_table_to_rootset();
+//      gc_set_rootset(gc); 
+//    }
 
     /*prepare dirty object*/
     gc_prepare_dirty_set(gc);
@@ -172,7 +188,7 @@
     gc_set_weakref_sets(gc);
         
     /*start STW mark*/
-#ifndef USE_MARK_SWEEP_GC
+#ifndef USE_UNIQUE_MARK_SWEEP_GC
     assert(0);
 #else
     gc_ms_start_final_mark_after_concurrent((GC_MS*)gc, MIN_NUM_MARKERS);
@@ -180,13 +196,22 @@
     
     wspace_mark_scan_mostly_concurrent_reset();
     gc_clear_dirty_set(gc);
-    if(!is_STW){
-      unlock(gc->enumerate_rootset_lock);
-      vm_resume_threads_after();    
-      assert(hythread_is_suspend_enabled());
-      hythread_set_suspend_disable(disable_count);
-    }
+//    if(!is_STW){
+//      unlock(gc->enumerate_rootset_lock);
+//      vm_resume_threads_after();    
+//      assert(hythread_is_suspend_enabled());
+//      hythread_set_suspend_disable(disable_count);
+//    }
   }
+
+  
+  if(!is_STW){    
+    unlock(gc->enumerate_rootset_lock);
+    vm_resume_threads_after();    
+    assert(hythread_is_suspend_enabled());
+    hythread_set_suspend_disable(disable_count);
+  }
+  
   gc_reset_dirty_set(gc);
 }
 
@@ -237,7 +262,7 @@
   gc_identify_dead_weak_roots(gc);
   
   /*start concurrent mark*/
-#ifndef USE_MARK_SWEEP_GC
+#ifndef USE_UNIQUE_MARK_SWEEP_GC
   assert(0);
 #else
   gc_ms_start_concurrent_sweep((GC_MS*)gc, MIN_NUM_MARKERS);
@@ -288,6 +313,10 @@
 
 void gc_reset_after_concurrent_collection(GC* gc)
 {
+
+  int64 mutator_time = gc_get_mutator_time(gc);
+  int64 collection_time = gc_get_collector_time(gc) + gc_get_marker_time(gc);
+
   /*FIXME: enable concurrent GEN mode.*/
   gc_reset_interior_pointer_table();
   if(gc_is_gen_mode()) gc_prepare_mutator_remset(gc);
@@ -302,14 +331,17 @@
     gc_activate_finref_threads((GC*)gc);
 #ifndef BUILD_IN_REFERENT
   } else {
-    gc_clear_weakref_pools(gc);
+    gc_clear_weakref_pools(gc);    
+    gc_clear_finref_repset_pool(gc);
 #endif
   }
 
-#ifdef USE_MARK_SWEEP_GC
+#ifdef USE_UNIQUE_MARK_SWEEP_GC
   gc_ms_update_space_statistics((GC_MS*)gc);
 #endif
 
+  gc_reset_collector_state(gc);
+
   gc_clear_dirty_set(gc);
 
   vm_reclaim_native_objs();
@@ -322,9 +354,15 @@
   if(USE_CONCURRENT_GC && gc_sweep_is_concurrent()){
     gc_reset_concurrent_sweep(gc);
   }
+  
+  gc_update_collection_scheduler(gc, mutator_time, collection_time);
+
+#ifdef USE_UNIQUE_MARK_SWEEP_GC
+  gc_ms_reset_space_statistics((GC_MS*)gc);
+#endif
 }
 
-void gc_decide_concurrent_algorithm(GC* gc, char* concurrent_algo)
+void gc_decide_concurrent_algorithm(char* concurrent_algo)
 {
   if(!concurrent_algo){
     CONCURRENT_ALGO = OTF_REM_OBJ_SNAPSHOT_ALGO;

Modified: harmony/enhanced/drlvm/trunk/vm/gc_gen/src/common/gc_concurrent.h
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/gc_gen/src/common/gc_concurrent.h?rev=637062&r1=637061&r2=637062&view=diff
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/gc_gen/src/common/gc_concurrent.h (original)
+++ harmony/enhanced/drlvm/trunk/vm/gc_gen/src/common/gc_concurrent.h Fri Mar 14 04:21:27 2008
@@ -154,7 +154,7 @@
 void gc_reset_after_concurrent_collection(GC* gc);
 void gc_check_concurrent_phase(GC * gc);
 
-void gc_decide_concurrent_algorithm(GC* gc, char* concurrent_algo);
+void gc_decide_concurrent_algorithm(char* concurrent_algo);
 
 void gc_reset_concurrent_sweep(GC* gc);
 

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=637062&r1=637061&r2=637062&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 Fri Mar 14 04:21:27 2008
@@ -261,8 +261,8 @@
 /* FIXME:: this is not the right interface for write barrier */
 void gc_heap_slot_write_ref (Managed_Object_Handle p_obj_holding_ref,Managed_Object_Handle *p_slot, Managed_Object_Handle p_target)
 { 
-  Mutator *mutator = (Mutator *)gc_get_tls();  
-  mutator_post_signal(mutator,MUTATOR_ENTER_BARRIER);
+  //Mutator *mutator = (Mutator *)gc_get_tls();  
+  //mutator_post_signal(mutator,MUTATOR_ENTER_BARRIER);
 
   switch(write_barrier_function){
     case WRITE_BARRIER_REM_NIL:
@@ -293,7 +293,7 @@
       return;
   }
 
-  mutator_post_signal(mutator,MUTATOR_EXIT_BARRIER);
+  //mutator_post_signal(mutator,MUTATOR_EXIT_BARRIER);
   return;
 }
 

Modified: harmony/enhanced/drlvm/trunk/vm/gc_gen/src/common/gc_for_vm.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/gc_gen/src/common/gc_for_vm.cpp?rev=637062&r1=637061&r2=637062&view=diff
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/gc_gen/src/common/gc_for_vm.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/gc_gen/src/common/gc_for_vm.cpp Fri Mar 14 04:21:27 2008
@@ -58,7 +58,6 @@
 static void init_gc_helpers()
 {
     set_property("vm.component.classpath.gc_gen", "gc_gen.jar", VM_PROPERTIES);
-
     vm_helper_register_magic_helper(VM_RT_NEW_RESOLVED_USING_VTABLE_AND_SIZE, "org/apache/harmony/drlvm/gc_gen/GCHelper", "alloc");
     vm_helper_register_magic_helper(VM_RT_NEW_VECTOR_USING_VTABLE,  "org/apache/harmony/drlvm/gc_gen/GCHelper", "allocArray");
     vm_helper_register_magic_helper(VM_RT_GC_HEAP_WRITE_REF,  "org/apache/harmony/drlvm/gc_gen/GCHelper", "write_barrier_slot_rem");
@@ -71,19 +70,10 @@
 
   vm_gc_lock_init();
 
-#if defined(USE_MARK_SWEEP_GC)
-unsigned int gc_struct_size = sizeof(GC_MS);
-#elif defined(USE_UNIQUE_MOVE_COMPACT_GC)
-unsigned int gc_struct_size = sizeof(GC_MC);
-#else
-unsigned int gc_struct_size = sizeof(GC_Gen);
-#endif
-  GC* gc = (GC*)STD_MALLOC(gc_struct_size);
+  GC* gc = gc_parse_options();
   assert(gc);
-  memset(gc, 0, sizeof(GC));  
-  p_global_gc = gc;
 
-  gc_parse_options(gc);
+  p_global_gc = gc;
 
 #ifdef BUILD_IN_REFERENT
    if( ! IGNORE_FINREF){
@@ -104,7 +94,7 @@
   
   gc_metadata_initialize(gc); /* root set and mark stack */
 
-#if defined(USE_MARK_SWEEP_GC)
+#if defined(USE_UNIQUE_MARK_SWEEP_GC)
   gc_ms_initialize((GC_MS*)gc, min_heap_size_bytes, max_heap_size_bytes);
 #elif defined(USE_UNIQUE_MOVE_COMPACT_GC)
   gc_mc_initialize((GC_MC*)gc, min_heap_size_bytes, max_heap_size_bytes);
@@ -140,7 +130,7 @@
   INFO2("gc.process", "GC: call GC wrapup ....");
   GC* gc =  p_global_gc;
 
-#if defined(USE_MARK_SWEEP_GC)
+#if defined(USE_UNIQUE_MARK_SWEEP_GC)
  gc_ms_destruct((GC_MS*)gc);
 #elif defined(USE_UNIQUE_MOVE_COMPACT_GC)
  gc_mc_destruct((GC_MC*)gc);
@@ -186,7 +176,7 @@
      FIXME:: nos_boundary is a static field in GCHelper.java for fast write barrier, not a real object reference 
      this should be fixed that magic Address field should not be enumerated. */
 #ifdef COMPRESS_REFERENCE
-  if (p_obj == (Partial_Reveal_Object*)HEAP_NULL || p_obj == NULL || p_obj == nos_boundary ) return;
+  if (p_obj == (Partial_Reveal_Object*)HEAP_BASE || p_obj == NULL || p_obj == nos_boundary ) return;
 #else
   if (p_obj == NULL || p_obj == nos_boundary ) return;
 #endif  
@@ -229,7 +219,7 @@
      FIXME:: nos_boundary is a static field in GCHelper.java for fast write barrier, not a real object reference
      this should be fixed that magic Address field should not be enumerated. */
 #ifdef COMPRESS_REFERENCE
-  if (p_obj == (Partial_Reveal_Object*)HEAP_NULL || p_obj == NULL || p_obj == nos_boundary ) return;
+  if (p_obj == (Partial_Reveal_Object*)HEAP_BASE || p_obj == NULL || p_obj == nos_boundary ) return;
 #else
   if (p_obj == NULL || p_obj == nos_boundary ) return;
 #endif
@@ -265,7 +255,7 @@
 
 int64 gc_free_memory()
 {
-#if defined(USE_MARK_SWEEP_GC)
+#if defined(USE_UNIQUE_MARK_SWEEP_GC)
   return (int64)gc_ms_free_memory_size((GC_MS*)p_global_gc);
 #elif defined(USE_UNIQUE_MOVE_COMPACT_GC)
   return (int64)gc_mc_free_memory_size((GC_MC*)p_global_gc);
@@ -277,7 +267,7 @@
 /* java heap size.*/
 int64 gc_total_memory() 
 {
-#if defined(USE_MARK_SWEEP_GC)
+#if defined(USE_UNIQUE_MARK_SWEEP_GC)
   return (int64)((POINTER_SIZE_INT)gc_ms_total_memory_size((GC_MS*)p_global_gc));
 #elif defined(USE_UNIQUE_MOVE_COMPACT_GC)
   return (int64)((POINTER_SIZE_INT)gc_mc_total_memory_size((GC_MC*)p_global_gc));
@@ -288,7 +278,7 @@
 
 int64 gc_max_memory() 
 {
-#if defined(USE_MARK_SWEEP_GC)
+#if defined(USE_UNIQUE_MARK_SWEEP_GC)
     return (int64)((POINTER_SIZE_INT)gc_ms_total_memory_size((GC_MS*)p_global_gc));
 #elif defined(USE_UNIQUE_MOVE_COMPACT_GC)
     return (int64)((POINTER_SIZE_INT)gc_mc_total_memory_size((GC_MC*)p_global_gc));
@@ -361,7 +351,7 @@
 #else //USE_32BITS_HASHCODE
 int32 gc_get_hashcode(Managed_Object_Handle p_object)
 {
-#if defined(USE_MARK_SWEEP_GC) || defined(USE_UNIQUE_MOVE_COMPACT_GC)
+#if defined(USE_UNIQUE_MARK_SWEEP_GC) || defined(USE_UNIQUE_MOVE_COMPACT_GC)
   return (int32)0;//p_object;
 #endif
 
@@ -421,7 +411,7 @@
     // data structures in not consistent for heap iteration
     if (!JVMTI_HEAP_ITERATION) return;
 
-#if defined(USE_MARK_SWEEP_GC)
+#if defined(USE_UNIQUE_MARK_SWEEP_GC)
   gc_ms_iterate_heap((GC_MS*)p_global_gc);
 #elif defined(USE_UNIQUE_MOVE_COMPACT_GC)
   gc_mc_iterate_heap((GC_MC*)p_global_gc);
@@ -444,4 +434,6 @@
 {
   return address_belongs_to_gc_heap(p_obj, p_global_gc);  
 }
+
+
 

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=637062&r1=637061&r2=637062&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 Fri Mar 14 04:21:27 2008
@@ -167,13 +167,10 @@
   return block;
 }
 
-extern Boolean IS_MOVE_COMPACT;
-
 static void gc_update_repointed_sets(GC* gc, Pool* pool, Boolean double_fix)
 {
   GC_Metadata* metadata = gc->metadata;
   
-  /* NOTE:: this is destructive to the root sets. */
   pool_iterator_init(pool);
   Vector_Block* root_set = pool_iterator_next(pool);
 
@@ -184,23 +181,19 @@
       iter = vector_block_iterator_advance(root_set,iter);
 
       Partial_Reveal_Object* p_obj = read_slot(p_ref);
-      if(IS_MOVE_COMPACT){
-      /*This condition is removed because we do los sliding compaction at every major compaction after add los minor sweep.*/
-      //if(obj_is_moved(p_obj)) 
-        /*Fixme: los_boundery ruined the modularity of gc_common.h*/
-        if(p_obj < los_boundary){
-          p_obj = obj_get_fw_in_oi(p_obj);
-        }else{
-          p_obj = obj_get_fw_in_table(p_obj);
+      if( collect_is_compact_move()){ /* move-compact uses offset table */
+          /*This condition is removed because we do los sliding compaction at every major compaction after add los minor sweep.*/
+          //if(obj_is_moved(p_obj)) 
+          /*Fixme: los_boundery ruined the modularity of gc_common.h*/
+        if( gc_has_los() && p_obj < los_boundary){
+            p_obj = obj_get_fw_in_oi(p_obj);
+        }else{ /* this is the case with unique move_compact */
+            p_obj = obj_get_fw_in_table(p_obj);
         }
 
         write_slot(p_ref, p_obj);
-        
-      }else if(gc_match_kind(gc, MC_COLLECTION)){
-        p_obj = obj_get_fw_in_table(p_obj);
-        write_slot(p_ref, p_obj);
-        
-      }else{
+
+      }else{ /* this is the case of non-move-compact major collection, such as slide-compact and mark-sweep */
         if(obj_is_fw_in_oi(p_obj)){
           /* Condition obj_is_moved(p_obj) is for preventing mistaking previous mark bit of large obj as fw bit when fallback happens.
            * Because until fallback happens, perhaps the large obj hasn't been marked. So its mark bit remains as the last time.
@@ -218,11 +211,12 @@
             assert(address_belongs_to_gc_heap(p_obj, gc));
           }
           write_slot(p_ref, p_obj);
-        }
-      }
-    }
+        } /* obj is forwarded */
+      } /* collect is not move-compact */
+        
+    } /* while root_set has entry */
     root_set = pool_iterator_next(pool);
-  } 
+  } /* while pool has root_set */
   
   return;
 }
@@ -233,8 +227,8 @@
 
   gc_update_weak_roots(gc, double_fix);
 
-  /* MINOR_COLLECTION doesn't need rootset update, but need reset */
-  if( !gc_match_kind(gc, MINOR_COLLECTION)){
+  /* ALGO_MINOR doesn't need rootset update, but need reset */
+  if( !collect_is_minor()){
     gc_update_repointed_sets(gc, gc->metadata->gc_rootset_pool, double_fix);
 #ifndef BUILD_IN_REFERENT
     gc_update_finref_repointed_refs(gc, double_fix);
@@ -302,8 +296,8 @@
     collector->rem_set = NULL;
   }
   
-  assert(gc_match_either_kind(gc, MINOR_COLLECTION|NORMAL_MAJOR_COLLECTION));
-  if( gc_match_kind(gc, NORMAL_MAJOR_COLLECTION )){
+  assert( collect_is_major_normal() || collect_is_minor());
+  if( collect_is_major_normal() ){
     /* all the remsets are useless now */
     /* clean and put back mutator remsets */
 #ifdef USE_REM_SLOTS  
@@ -341,7 +335,7 @@
         root_set = pool_get_entry( collector_remset_pool );
     }
 
-  }else{ /* generational MINOR_COLLECTION */
+  }else{ /* generational ALGO_MINOR */
 
     /* all the remsets are put into the shared pool */
 #ifdef USE_REM_SLOTS
@@ -433,7 +427,7 @@
 void gc_clear_remset(GC* gc)
 {
   /* this function clears all the remset before fallback */
-  assert(gc_match_kind(gc, FALLBACK_COLLECTION));
+  assert(collect_is_fallback());
   
   /* 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 */
@@ -583,7 +577,7 @@
       while(!vector_block_iterator_end(local_dirty_set,iter)){
         Partial_Reveal_Object* p_obj = (Partial_Reveal_Object*) *iter;
         iter = vector_block_iterator_advance(local_dirty_set, iter);
-#ifdef USE_MARK_SWEEP_GC
+#ifdef USE_UNIQUE_MARK_SWEEP_GC
         assert(obj_is_mark_black_in_table(p_obj));
 #endif
       }
@@ -605,7 +599,7 @@
         while(!vector_block_iterator_end(dirty_set,iter)){
           Partial_Reveal_Object* p_obj = (Partial_Reveal_Object*) *iter;          
           iter = vector_block_iterator_advance(dirty_set, iter);
-#ifdef USE_MARK_SWEEP_GC
+#ifdef USE_UNIQUE_MARK_SWEEP_GC
           assert(obj_is_mark_black_in_table(p_obj));
 #endif
         }
@@ -657,4 +651,6 @@
 
 void free_set_pool_put_entry(Vector_Block* block, GC_Metadata *metadata)
 { pool_put_entry(metadata->free_set_pool, block); }
+
+
 

Added: harmony/enhanced/drlvm/trunk/vm/gc_gen/src/common/gc_options.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/gc_gen/src/common/gc_options.cpp?rev=637062&view=auto
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/gc_gen/src/common/gc_options.cpp (added)
+++ harmony/enhanced/drlvm/trunk/vm/gc_gen/src/common/gc_options.cpp Fri Mar 14 04:21:27 2008
@@ -0,0 +1,418 @@
+/*
+ *  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 "gc_common.h"
+
+extern char* GC_VERIFY;
+extern POINTER_SIZE_INT NOS_SIZE;
+extern POINTER_SIZE_INT MIN_NOS_SIZE;
+extern POINTER_SIZE_INT INIT_LOS_SIZE;
+extern POINTER_SIZE_INT TOSPACE_SIZE;
+extern POINTER_SIZE_INT MOS_RESERVE_SIZE;
+
+extern Boolean GEN_NONGEN_SWITCH;
+
+extern Boolean FORCE_FULL_COMPACT;
+
+extern unsigned int NUM_MARKERS;
+extern unsigned int NUM_COLLECTORS;
+extern unsigned int MINOR_COLLECTORS;
+extern unsigned int MAJOR_COLLECTORS;
+
+extern Boolean IGNORE_VTABLE_TRACING;
+extern Boolean IGNORE_FINREF;
+
+extern Boolean JVMTI_HEAP_ITERATION ;
+
+extern Boolean USE_CONCURRENT_GC;
+extern Boolean USE_CONCURRENT_ENUMERATION;
+extern Boolean USE_CONCURRENT_MARK;
+extern Boolean USE_CONCURRENT_SWEEP;
+
+
+POINTER_SIZE_INT HEAP_SIZE_DEFAULT = 256 * MB;
+POINTER_SIZE_INT min_heap_size_bytes = 16 * MB;
+POINTER_SIZE_INT max_heap_size_bytes = 0;
+
+
+unsigned int GC_PROP;
+
+GC* gc_mc_create();
+GC* gc_ms_create();
+
+static GC* gc_decide_collection_algo(char* unique_algo, Boolean has_los)
+{
+  /* if unique_algo is not set, gc_gen_decide_collection_algo is called. */
+  assert(unique_algo);
+  
+  GC_PROP = ALGO_POOL_SHARE | ALGO_DEPTH_FIRST;
+  
+  assert(!has_los); /* currently unique GCs don't use LOS */
+  if(has_los) 
+    GC_PROP |= ALGO_HAS_LOS;
+  
+  Boolean use_default = FALSE;
+
+  GC* gc;
+  
+  string_to_upper(unique_algo);
+   
+  if(!strcmp(unique_algo, "MOVE_COMPACT")){
+    GC_PROP |= ALGO_COMPACT_MOVE;
+    gc = gc_mc_create();  
+
+  }else if(!strcmp(unique_algo, "MARK_SWEEP")){
+    GC_PROP |= ALGO_MS_NORMAL;
+    gc = gc_ms_create();
+  }else{
+    WARN2("gc.base","\nWarning: GC algorithm setting incorrect. Will use default value.\n");
+    GC_PROP |= ALGO_COMPACT_MOVE;
+    gc = gc_mc_create();  
+  }
+
+  return gc;
+}
+
+static int get_int_property(const char *property_name)
+{
+    assert(property_name);
+    char *value = get_property(property_name, VM_PROPERTIES);
+    int return_value;
+    if (NULL != value)
+    {
+        return_value = atoi(value);
+        destroy_property_value(value);
+    }else{
+        DIE2("gc.base","Warning: property value "<<property_name<<"is not set!");
+        exit(0);
+    }
+      
+    return return_value;
+}
+
+static Boolean get_boolean_property(const char *property_name)
+{
+  assert(property_name);
+  char *value = get_property(property_name, VM_PROPERTIES);
+  if (NULL == value){
+    DIE2("gc.base","Warning: property value "<<property_name<<" is not set!");
+    exit(0);
+  }
+  
+  Boolean return_value;
+  if (0 == strcmp("no", value)
+      || 0 == strcmp("off", value)
+      || 0 == strcmp("false", value)
+      || 0 == strcmp("0", value))
+  {
+    return_value = FALSE;
+  }
+  else if (0 == strcmp("yes", value)
+           || 0 == strcmp("on", value)
+           || 0 == strcmp("true", value)
+           || 0 == strcmp("1", value))
+  {
+    return_value = TRUE;
+  }else{
+    DIE2("gc.base","Warning: property value "<<property_name<<" is not set! Use upper case?");
+    exit(0);
+  }
+    
+  destroy_property_value(value);
+  return return_value;
+}
+
+static size_t get_size_property(const char* name) 
+{
+  char* size_string = get_property(name, VM_PROPERTIES);
+  size_t size = atol(size_string);
+  int sizeModifier = tolower(size_string[strlen(size_string) - 1]);
+  destroy_property_value(size_string);
+
+  size_t unit = 1;
+  switch (sizeModifier) {
+  case 'k': unit = 1024; break;
+  case 'm': unit = 1024 * 1024; break;
+  case 'g': unit = 1024 * 1024 * 1024;break;
+  }
+
+  size_t res = size * unit;
+  if (res / unit != size) {
+    /* overflow happened */
+    return 0;
+  }
+  return res;
+}
+
+void gc_decide_concurrent_algorithm(char* concurrent_algo);
+GC* gc_gen_decide_collection_algo(char* minor_algo, char* major_algo, Boolean has_los);
+void gc_set_gen_mode(Boolean status);
+
+GC* gc_parse_options() 
+{
+  TRACE2("gc.process", "GC: parse options ...\n");
+  if (!get_boolean_property("vm.assert_dialog", TRUE, VM_PROPERTIES))
+    disable_assert_dialogs();
+
+  GC* gc;
+  
+  /* GC algorithm decision */
+  /* Step 1: */
+  char* minor_algo = NULL;
+  char* major_algo = NULL;
+  char* unique_algo = NULL;
+  
+  if (is_property_set("gc.minor_algorithm", VM_PROPERTIES) == 1) {
+    minor_algo = get_property("gc.minor_algorithm", VM_PROPERTIES);
+  }
+  
+  if (is_property_set("gc.major_algorithm", VM_PROPERTIES) == 1) {
+    major_algo = get_property("gc.major_algorithm", VM_PROPERTIES);
+  }
+    
+  if (is_property_set("gc.uniqe_algorithm", VM_PROPERTIES) == 1) {
+    unique_algo = get_property("gc.unique_algorithm", VM_PROPERTIES);
+  }
+
+  Boolean has_los = FALSE;
+  if (is_property_set("gc.has_los", VM_PROPERTIES) == 1) {
+    has_los = get_boolean_property("gc.has_los");
+  }
+
+  if(unique_algo){
+    if(minor_algo || major_algo){
+      WARN2("gc.base","Warning: generational options cannot be set with unique_algo, ignored.");
+    }
+    gc = gc_decide_collection_algo(unique_algo, has_los);
+    destroy_property_value(unique_algo);  
+  
+  }else{ /* default */
+    gc = gc_gen_decide_collection_algo(minor_algo, major_algo, has_los);
+    if( minor_algo) destroy_property_value(minor_algo);
+    if( major_algo) destroy_property_value(major_algo);
+  }
+  
+  if (is_property_set("gc.gen_mode", VM_PROPERTIES) == 1) {
+    Boolean gen_mode = get_boolean_property("gc.gen_mode");
+    gc_set_gen_mode(gen_mode);
+  }
+
+  /* Step 2: */
+
+  /* NOTE:: this has to stay after above!! */
+  if (is_property_set("gc.force_major_collect", VM_PROPERTIES) == 1) {
+    FORCE_FULL_COMPACT = get_boolean_property("gc.force_major_collect");
+    if(FORCE_FULL_COMPACT){
+      gc_set_gen_mode(FALSE);
+    }
+  }
+
+  /* Step 3: */
+  /* NOTE:: this has to stay after above!! */
+  gc->generate_barrier = gc_is_gen_mode();
+  
+  if (is_property_set("gc.generate_barrier", VM_PROPERTIES) == 1) {
+    Boolean generate_barrier = get_boolean_property("gc.generate_barrier");
+    gc->generate_barrier = (generate_barrier || gc->generate_barrier);
+  }
+  
+/* ///////////////////////////////////////////////////   */
+  
+  POINTER_SIZE_INT max_heap_size = HEAP_SIZE_DEFAULT;
+  POINTER_SIZE_INT min_heap_size = min_heap_size_bytes;
+  
+  if (is_property_set("gc.mx", VM_PROPERTIES) == 1) {
+    max_heap_size = get_size_property("gc.mx");
+
+    if (max_heap_size < min_heap_size){
+      max_heap_size = min_heap_size;
+      WARN2("gc.base","Warning: Max heap size you set is too small, reset to "<<max_heap_size/MB<<" MB!");
+    }
+    if (0 == max_heap_size){
+      max_heap_size = HEAP_SIZE_DEFAULT;
+      WARN2("gc.base","Warning: Max heap size you set euqals to zero, reset to "<<max_heap_size/MB<<" MB!");
+    }
+ 
+    min_heap_size = max_heap_size / 10;
+    if (min_heap_size < min_heap_size_bytes){
+      min_heap_size = min_heap_size_bytes;
+      //printf("Min heap size: too small, reset to %d MB! \n", min_heap_size/MB);
+    }
+  }
+
+  if (is_property_set("gc.ms", VM_PROPERTIES) == 1) {
+    min_heap_size = get_size_property("gc.ms");
+    if (min_heap_size < min_heap_size_bytes){
+      min_heap_size = min_heap_size_bytes;
+      WARN2("gc.base","Warning: Min heap size you set is too small, reset to "<<min_heap_size/MB<<" MB!");
+    } 
+  }
+
+  if (min_heap_size > max_heap_size){
+    max_heap_size = min_heap_size;
+    WARN2("gc.base","Warning: Max heap size is too small, reset to "<<max_heap_size/MB<<" MB!");
+  }
+
+  min_heap_size_bytes = min_heap_size;
+  max_heap_size_bytes = max_heap_size;
+
+  if (is_property_set("gc.nos_size", VM_PROPERTIES) == 1) {
+    NOS_SIZE = get_size_property("gc.nos_size");
+  }
+
+  if (is_property_set("gc.min_nos_size", VM_PROPERTIES) == 1) {
+    MIN_NOS_SIZE = get_size_property("gc.min_nos_size");
+  }
+
+  if (is_property_set("gc.init_los_size", VM_PROPERTIES) == 1) {
+    INIT_LOS_SIZE = get_size_property("gc.init_los_size");
+  }  
+
+  if (is_property_set("gc.num_collectors", VM_PROPERTIES) == 1) {
+    unsigned int num = get_int_property("gc.num_collectors");
+    NUM_COLLECTORS = (num==0)? NUM_COLLECTORS:num;
+  }
+
+  if (is_property_set("gc.num_markers", VM_PROPERTIES) == 1) {
+    unsigned int num = get_int_property("gc.num_markers");
+    NUM_MARKERS = (num==0)? NUM_MARKERS:num;
+  }
+
+  if (is_property_set("gc.tospace_size", VM_PROPERTIES) == 1) {
+    TOSPACE_SIZE = get_size_property("gc.tospace_size");
+  }
+
+  if (is_property_set("gc.mos_reserve_size", VM_PROPERTIES) == 1) {
+    MOS_RESERVE_SIZE = get_size_property("gc.mos_reserve_size");
+  }
+
+  if (is_property_set("gc.nos_partial_forward", VM_PROPERTIES) == 1) {
+    NOS_PARTIAL_FORWARD = get_boolean_property("gc.nos_partial_forward");
+  }
+    
+  if (is_property_set("gc.minor_collectors", VM_PROPERTIES) == 1) {
+    MINOR_COLLECTORS = get_int_property("gc.minor_collectors");
+  }
+
+  if (is_property_set("gc.major_collectors", VM_PROPERTIES) == 1) {
+    MAJOR_COLLECTORS = get_int_property("gc.major_collectors");
+  }
+
+  if (is_property_set("gc.ignore_finref", VM_PROPERTIES) == 1) {
+    IGNORE_FINREF = get_boolean_property("gc.ignore_finref");
+  }
+
+  if (is_property_set("gc.verify", VM_PROPERTIES) == 1) {
+    char* value = get_property("gc.verify", VM_PROPERTIES);
+    GC_VERIFY = strdup(value);
+    destroy_property_value(value);
+  }
+
+  if (is_property_set("gc.gen_nongen_switch", VM_PROPERTIES) == 1){
+    GEN_NONGEN_SWITCH= get_boolean_property("gc.gen_nongen_switch");
+    gc->generate_barrier = TRUE;
+  }
+
+  if (is_property_set("gc.heap_iteration", VM_PROPERTIES) == 1) {
+    JVMTI_HEAP_ITERATION = get_boolean_property("gc.heap_iteration");
+  }
+
+  if (is_property_set("gc.ignore_vtable_tracing", VM_PROPERTIES) == 1) {
+    IGNORE_VTABLE_TRACING = get_boolean_property("gc.ignore_vtable_tracing");
+  }
+
+  if (is_property_set("gc.use_large_page", VM_PROPERTIES) == 1){
+    char* value = get_property("gc.use_large_page", VM_PROPERTIES);
+    large_page_hint = strdup(value);
+    destroy_property_value(value);
+  }
+
+  if (is_property_set("gc.concurrent_gc", VM_PROPERTIES) == 1){
+    Boolean use_all_concurrent_phase= get_boolean_property("gc.concurrent_gc");
+    if(use_all_concurrent_phase){
+      USE_CONCURRENT_ENUMERATION = TRUE;
+      USE_CONCURRENT_MARK = TRUE;
+      USE_CONCURRENT_SWEEP = TRUE;
+      gc->generate_barrier = TRUE;
+    }
+  }
+
+  if (is_property_set("gc.concurrent_enumeration", VM_PROPERTIES) == 1){
+    USE_CONCURRENT_ENUMERATION= get_boolean_property("gc.concurrent_enumeration");
+    if(USE_CONCURRENT_ENUMERATION){
+      USE_CONCURRENT_GC = TRUE;      
+      gc->generate_barrier = TRUE;
+    }
+  }
+
+  if (is_property_set("gc.concurrent_mark", VM_PROPERTIES) == 1){
+    USE_CONCURRENT_MARK= get_boolean_property("gc.concurrent_mark");
+    if(USE_CONCURRENT_MARK){
+      USE_CONCURRENT_GC = TRUE;      
+      gc->generate_barrier = TRUE;
+    }
+  }
+
+  if (is_property_set("gc.concurrent_sweep", VM_PROPERTIES) == 1){
+    USE_CONCURRENT_SWEEP= get_boolean_property("gc.concurrent_sweep");
+    if(USE_CONCURRENT_SWEEP){
+      USE_CONCURRENT_GC = TRUE;
+    }
+  }
+
+  char* concurrent_algo = NULL;
+  
+  if (is_property_set("gc.concurrent_algorithm", VM_PROPERTIES) == 1) {
+    concurrent_algo = get_property("gc.concurrent_algorithm", VM_PROPERTIES);
+  }
+  
+  gc_decide_concurrent_algorithm(concurrent_algo);
+
+#if defined(ALLOC_ZEROING) && defined(ALLOC_PREFETCH)
+  if(is_property_set("gc.prefetch",VM_PROPERTIES) ==1) {
+    PREFETCH_ENABLED = get_boolean_property("gc.prefetch");
+  }
+
+  if(is_property_set("gc.prefetch_distance",VM_PROPERTIES)==1) {
+    PREFETCH_DISTANCE = get_size_property("gc.prefetch_distance");
+    if(!PREFETCH_ENABLED) {
+      WARN2("gc.prefetch_distance","Warning: Prefetch distance set with Prefetch disabled!");
+    }
+  }
+
+  if(is_property_set("gc.prefetch_stride",VM_PROPERTIES)==1) {
+    PREFETCH_STRIDE = get_size_property("gc.prefetch_stride");
+    if(!PREFETCH_ENABLED) {
+      WARN2("gc.prefetch_stride","Warning: Prefetch stride set  with Prefetch disabled!");
+    }  
+  }
+  
+  if(is_property_set("gc.zeroing_size",VM_PROPERTIES)==1) {
+    ZEROING_SIZE = get_size_property("gc.zeroing_size");
+  }   
+#endif
+
+#ifdef PREFETCH_SUPPORTED
+  if(is_property_set("gc.mark_prefetch",VM_PROPERTIES) ==1) {
+    mark_prefetch = get_boolean_property("gc.mark_prefetch");
+  }  
+#endif
+
+  return gc;
+}
+
+

Propchange: harmony/enhanced/drlvm/trunk/vm/gc_gen/src/common/gc_options.cpp
------------------------------------------------------------------------------
    svn:eol-style = native

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=637062&r1=637061&r2=637062&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 Fri Mar 14 04:21:27 2008
@@ -25,6 +25,7 @@
 #include "port_vmem.h"
 #include "port_atomic.h"
 #include "port_malloc.h"
+#include "port_barriers.h"
 
 #include <assert.h>
 
@@ -81,6 +82,10 @@
 #define PREFETCH(x) 
 #endif
 
+#ifdef PREFETCH_SUPPORTED
+extern Boolean mark_prefetch;
+#endif
+
 #define ABS_DIFF(x, y) (((x)>(y))?((x)-(y)):((y)-(x)))
 #define USEC_PER_SEC INT64_C(1000000)
 
@@ -287,8 +292,7 @@
 
 inline void mem_fence()
 {
-  //FIXME: enable mem fence.
-  //apr_memory_rw_barrier(); 
+  port_rw_barrier(); 
 }
 
 inline int64 time_now() 

Added: harmony/enhanced/drlvm/trunk/vm/gc_gen/src/common/gc_properties.h
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/gc_gen/src/common/gc_properties.h?rev=637062&view=auto
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/gc_gen/src/common/gc_properties.h (added)
+++ harmony/enhanced/drlvm/trunk/vm/gc_gen/src/common/gc_properties.h Fri Mar 14 04:21:27 2008
@@ -0,0 +1,229 @@
+/*
+ *  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.
+ */
+
+#ifndef _GC_PROPERTIES
+#define _GC_PROPERTIES
+
+enum GC_CAUSE{
+  GC_CAUSE_NIL,
+  GC_CAUSE_NOS_IS_FULL,
+  GC_CAUSE_LOS_IS_FULL,
+  GC_CAUSE_MOS_IS_FULL,
+  GC_CAUSE_RUNTIME_FORCE_GC
+};
+
+extern unsigned int GC_PROP;
+
+/* ============================================================================ */
+/* legal collection kinds:
+   for ALGO_HAS_NOS:
+     MINOR (i.e., !ALGO_MAJOR)
+
+       ALGO_COPY_SEMISPACE
+       ALGO_COPY_FORWARD
+        
+     ALGO_MAJOR_FALLBACK
+     ALGO_MAJOR_NORMAL
+
+       ALGO_MS_NORMAL
+       ALGO_MS_COMPACT
+       ALGO_COMPACT_SLIDE
+       ALGO_COMPACT_MOVE
+
+  for !ALGO_HAS_NOS (and actually !ALGO_HAS_LOS)
+     ALGO_COMPACT_MOVE
+     ALGO_MS_NORMAL
+     ALGO_MS_COMPACT
+*/
+
+enum GC_Property{
+  ALGO_HAS_NOS          = 0x1,
+  ALGO_HAS_LOS          = 0x2,
+  ALGO_IS_GEN           = 0x4,
+  
+  ALGO_COPY_FORWARD     = 0x10,
+  ALGO_COPY_SEMISPACE   = 0x20, 
+  
+  ALGO_COMPACT_MOVE     = 0x40,
+  ALGO_COMPACT_SLIDE    = 0x80,
+  ALGO_COMPACT_MASK     = 0xc0,
+  
+  ALGO_MARKSWEEP        = 0x100,
+  ALGO_MS_NORMAL        = 0x300,  /* ALGO_MARKSWEEP|0x200 */
+  ALGO_MS_COMPACT       = 0x500,  /* ALGO_MARKSWEEP|0x400 */
+  ALGO_MARKSWEEP_MASK   = 0x700,
+        
+  ALGO_WORK_STEAL       = 0x1000,
+  ALGO_TASK_PUSH        = 0x2000,
+  ALGO_POOL_SHARE       = 0x4000,
+  
+  ALGO_BREADTH_FIRST    = 0x10000,
+  ALGO_DEPTH_FIRST      = 0x20000,
+  ALGO_REORDERING       = 0x40000,
+
+  ALGO_MAJOR            = 0x100000,
+  ALGO_MAJOR_NORMAL     = 0x300000,  /* ALGO_MAJOR|0x200000 */
+  ALGO_MAJOR_FALLBACK   = 0x500000,  /* ALGO_MAJOR|0x400000 */
+  ALGO_MAJOR_MASK       = 0x700000,
+
+  ALGO_CON              = 0x1000000,
+  ALGO_CON_MARK         = 0x3000000,  /* ALGO_CON|0x2000000 */
+  ALGO_CON_SWEEP        = 0x5000000,  /* ALGO_CON|0x4000000 */
+  ALGO_CON_ENUM         = 0x9000000,  /* ALGO_CON|0x8000000 */
+
+};
+
+FORCE_INLINE Boolean gc_is_kind(unsigned int kind)
+{
+  return (Boolean)((GC_PROP & kind) == kind);
+}
+
+FORCE_INLINE void gc_set_gen_flag()
+{
+  GC_PROP |= ALGO_IS_GEN;  
+}
+
+FORCE_INLINE void gc_clear_gen_flag()
+{
+  GC_PROP &= ~ALGO_IS_GEN;  
+}
+
+FORCE_INLINE Boolean gc_is_gen_mode()
+{
+  return gc_is_kind(ALGO_IS_GEN);
+}
+
+FORCE_INLINE Boolean gc_has_los()
+{
+  return gc_is_kind(ALGO_HAS_LOS);
+}
+
+FORCE_INLINE Boolean gc_has_nos()
+{
+  return gc_is_kind(ALGO_HAS_NOS);
+}
+
+FORCE_INLINE Boolean collect_is_major()
+{
+  return gc_is_kind(ALGO_MAJOR);
+}
+
+FORCE_INLINE Boolean collect_is_minor()
+{
+  return gc_has_nos() && !collect_is_major();
+}
+
+FORCE_INLINE Boolean collect_is_major_normal()
+{
+  return gc_is_kind(ALGO_MAJOR_NORMAL);
+}
+
+FORCE_INLINE void collect_set_major_normal()
+{
+  GC_PROP &= ~ALGO_MAJOR_MASK;
+  GC_PROP |= ALGO_MAJOR_NORMAL;
+}
+
+FORCE_INLINE void collect_set_minor()
+{
+  assert( gc_has_nos());
+  GC_PROP &= ~ALGO_MAJOR_MASK;
+}
+
+FORCE_INLINE Boolean collect_is_fallback()
+{
+  return gc_is_kind(ALGO_MAJOR_FALLBACK);
+}
+
+FORCE_INLINE Boolean major_is_marksweep()
+{
+  return gc_is_kind(ALGO_MARKSWEEP|ALGO_HAS_NOS);
+}
+
+FORCE_INLINE Boolean major_is_compact_move()
+{
+  return gc_is_kind(ALGO_COMPACT_MOVE|ALGO_HAS_NOS);
+}
+
+FORCE_INLINE void major_set_compact_move()
+{
+  GC_PROP &= ~ALGO_COMPACT_MASK;
+  GC_PROP |= ALGO_COMPACT_MOVE;  
+}
+
+FORCE_INLINE Boolean major_is_compact_slide()
+{
+  return gc_is_kind(ALGO_COMPACT_SLIDE|ALGO_HAS_NOS);
+}
+
+FORCE_INLINE void major_set_compact_slide()
+{
+  GC_PROP &= ~ALGO_COMPACT_MASK;
+  GC_PROP |= ALGO_COMPACT_SLIDE;  
+}
+
+FORCE_INLINE Boolean minor_is_semispace()
+{
+  return gc_is_kind(ALGO_COPY_SEMISPACE|ALGO_HAS_NOS);  
+}
+
+FORCE_INLINE Boolean minor_is_forward()
+{
+  return gc_is_kind(ALGO_COPY_FORWARD|ALGO_HAS_NOS);  
+}
+
+FORCE_INLINE Boolean collect_move_object()
+{
+ if(gc_has_nos())
+   return collect_is_minor() || 
+         (collect_is_major() && !gc_is_kind(ALGO_MS_NORMAL));
+ else
+   return !gc_is_kind(ALGO_MS_NORMAL);  
+}
+
+FORCE_INLINE Boolean collect_is_compact_move()
+{
+  if(gc_has_nos())
+    return collect_is_major() && gc_is_kind(ALGO_COMPACT_MOVE);
+  else
+    return gc_is_kind(ALGO_COMPACT_MOVE);    
+}
+
+FORCE_INLINE Boolean collect_is_ms_compact()
+{
+  if(gc_has_nos())
+    return collect_is_major() && gc_is_kind(ALGO_MS_COMPACT);
+  else
+    return gc_is_kind(ALGO_MS_COMPACT);    
+}
+
+FORCE_INLINE void collect_set_ms_normal()
+{
+  GC_PROP &= ~ALGO_MARKSWEEP_MASK;
+  GC_PROP |= ALGO_MS_NORMAL;
+
+}
+
+/* This is to distinct from the case of non-moving or trace-moving, where root slots
+   either are updated on-the-fly, or need not updating. The kind below needs to update
+   root slots after collection in an extra phase. i.e., collect_mark_and_move */
+FORCE_INLINE Boolean collect_need_update_repset()
+{
+  return (gc_is_kind(ALGO_MAJOR) || gc_is_kind(ALGO_MS_COMPACT));
+}
+
+#endif /* #ifndef _GC_PROPERTIES */

Propchange: harmony/enhanced/drlvm/trunk/vm/gc_gen/src/common/gc_properties.h
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: harmony/enhanced/drlvm/trunk/vm/gc_gen/src/common/gc_space.h
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/gc_gen/src/common/gc_space.h?rev=637062&r1=637061&r2=637062&view=diff
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/gc_gen/src/common/gc_space.h (original)
+++ harmony/enhanced/drlvm/trunk/vm/gc_gen/src/common/gc_space.h Fri Mar 14 04:21:27 2008
@@ -31,6 +31,8 @@
   POINTER_SIZE_INT size_live_obj;
   POINTER_SIZE_INT size_free_space;
   POINTER_SIZE_INT last_size_free_space;
+  POINTER_SIZE_INT size_new_obj;
+  float space_utilization_ratio;
 }Space_Statistics;
 
 struct GC;

Modified: harmony/enhanced/drlvm/trunk/vm/gc_gen/src/common/large_pages.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/gc_gen/src/common/large_pages.cpp?rev=637062&r1=637061&r2=637062&view=diff
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/gc_gen/src/common/large_pages.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/gc_gen/src/common/large_pages.cpp Fri Mar 14 04:21:27 2008
@@ -56,7 +56,7 @@
 Boolean release_lock_memory_priv()
 {
   HANDLE process = GetCurrentProcess();
-  return set_privilege(process, SE_LOCK_MEMORY_NAME, TRUE);
+  return set_privilege(process, SE_LOCK_MEMORY_NAME, FALSE);
 }
 
 void* alloc_large_pages(size_t size, const char* hint)

Modified: harmony/enhanced/drlvm/trunk/vm/gc_gen/src/common/mark_scan_pool.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/gc_gen/src/common/mark_scan_pool.cpp?rev=637062&r1=637061&r2=637062&view=diff
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/gc_gen/src/common/mark_scan_pool.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/gc_gen/src/common/mark_scan_pool.cpp Fri Mar 14 04:21:27 2008
@@ -147,7 +147,7 @@
       iter = vector_block_iterator_advance(root_set,iter);
 
       Partial_Reveal_Object *p_obj = read_slot(p_ref);
-      /* root ref can't be NULL, (remset may have NULL ref entry, but this function is only for MAJOR_COLLECTION */
+      /* root ref can't be NULL, (remset may have NULL ref entry, but this function is only for ALGO_MAJOR */
       assert(p_obj!=NULL);
       /* we have to mark the object before put it into marktask, because
          it is possible to have two slots containing a same object. They will

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=637062&r1=637061&r2=637062&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 Fri Mar 14 04:21:27 2008
@@ -55,7 +55,7 @@
   return !obj_is_marked_in_vt(p_obj);
 }
 
-#ifdef USE_MARK_SWEEP_GC
+#ifdef USE_UNIQUE_MARK_SWEEP_GC
 inline Boolean obj_is_dead_in_mark_sweep_gc(Partial_Reveal_Object *p_obj)
 {
   return !obj_is_mark_black_in_table(p_obj);
@@ -72,7 +72,7 @@
 {
   assert(p_obj);
 
-#ifdef USE_MARK_SWEEP_GC
+#ifdef USE_UNIQUE_MARK_SWEEP_GC
   return obj_is_dead_in_mark_sweep_gc(p_obj);
 #endif
 
@@ -80,12 +80,12 @@
   return obj_is_dead_in_move_compact_no_los_gc(p_obj);
 #endif
 
-  if(gc_match_kind(gc, MINOR_COLLECTION)){
+  if(collect_is_minor()){
     if(gc_is_gen_mode())
       return obj_is_dead_in_gen_minor_gc(p_obj);
     else
       return obj_is_dead_in_nongen_minor_gc(p_obj);
-  } else if(gc_get_mos((GC_Gen*)gc)->collect_algorithm == MAJOR_MARK_SWEEP){
+  } else if(major_is_marksweep()){
     return obj_is_dead_in_sweep_major_gc(p_obj);
   } else {
     return obj_is_dead_in_compact_major_gc(p_obj);
@@ -100,7 +100,7 @@
 {
   /* assert(!gc_obj_is_dead(gc, p_obj)); commented out for weakroot */
 
-#ifdef USE_MARK_SWEEP_GC
+#ifdef USE_UNIQUE_MARK_SWEEP_GC
   Wspace *wspace = gc_ms_get_wspace((GC_MS*)gc);
   return wspace->move_object;
 #endif
@@ -109,9 +109,9 @@
   Cspace *cspace = gc_mc_get_cspace((GC_MC*)gc);
   return cspace->move_object;
 #endif
-  if(gc_match_kind(gc, MINOR_COLLECTION)){
+  if(collect_is_minor()){
     if(!obj_belongs_to_nos(p_obj)) return FALSE;
-    if(MINOR_ALGO == MINOR_NONGEN_SEMISPACE_POOL || MINOR_ALGO == MINOR_GEN_SEMISPACE_POOL)
+    if(minor_is_semispace())
       return TRUE;
     else if(gc_is_gen_mode())
       return fspace_obj_to_be_forwarded(p_obj);

Modified: harmony/enhanced/drlvm/trunk/vm/gc_gen/src/common/space_tuner.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/gc_gen/src/common/space_tuner.cpp?rev=637062&r1=637061&r2=637062&view=diff
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/gc_gen/src/common/space_tuner.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/gc_gen/src/common/space_tuner.cpp Fri Mar 14 04:21:27 2008
@@ -96,7 +96,7 @@
   * Else, we call the marking function for space tuning.  */
 void gc_compute_space_tune_size_before_marking(GC* gc)
 {
-  if(gc_match_kind(gc, MINOR_COLLECTION))  return;
+  if(collect_is_minor())  return;
   
   gc_decide_space_tune(gc);
   
@@ -204,13 +204,14 @@
     memset(collector->segment_live_size, 0, sizeof(POINTER_SIZE_INT) * NORMAL_SIZE_SEGMENT_NUM);
   }
   
-  //POINTER_SIZE_INT additional_non_los_size = ((collector_num * 2) << GC_BLOCK_SHIFT_COUNT) + (non_los_live_obj_size >> GC_BLOCK_SHIFT_COUNT) * (GC_OBJ_SIZE_THRESHOLD/4);
+  //POINTER_SIZE_INT additional_non_los_size = ((collector_num * 2) << GC_BLOCK_SHIFT_COUNT) + (non_los_live_obj_size >> GC_BLOCK_SHIFT_COUNT) * (GC_LOS_OBJ_SIZE_THRESHOLD/4);
   double additional_non_los_size = 0;
   for(unsigned int i = 0; i < NORMAL_SIZE_SEGMENT_NUM; i++) {
     additional_non_los_size += (double)segment_live_size[i] * SEGMENT_INDEX_TO_SIZE(i) / non_los_live_obj_size;
   }
   additional_non_los_size *= 1.2; // in case of some cases worse than average one
   POINTER_SIZE_INT non_los_live_block = non_los_live_obj_size / (GC_BLOCK_BODY_SIZE_BYTES-(POINTER_SIZE_INT)additional_non_los_size);
+  non_los_live_block += collector_num << 2;
   non_los_live_obj_size = (non_los_live_block << GC_BLOCK_SHIFT_COUNT);
   if(non_los_live_obj_size > non_los_size)
     non_los_live_obj_size = non_los_size;
@@ -264,7 +265,7 @@
       assert(max_heap_size_bytes >= gc->committed_heap_size);
       POINTER_SIZE_INT extend_heap_size = 0;
       POINTER_SIZE_INT potential_max_tuning_size = max_tuning_size + max_heap_size_bytes - gc->committed_heap_size;
-      potential_max_tuning_size -= LOS_HEAD_RESERVE_FOR_HEAP_NULL;
+      potential_max_tuning_size -= LOS_HEAD_RESERVE_FOR_HEAP_BASE;
 
       //debug_adjust
       assert(!(potential_max_tuning_size % SPACE_ALLOC_UNIT));
@@ -438,7 +439,7 @@
 void  gc_space_tuner_reset(GC* gc)
 {
   Space_Tuner* tuner = gc->tuner;
-  if( gc_match_kind(gc, MAJOR_COLLECTION)){
+  if( collect_is_major()){
     /*Clear the fields every major collection except the wast area statistic.*/
     tuner->tuning_size = 0;
     tuner->interim_blocks = NULL;
@@ -536,4 +537,6 @@
   STD_FREE(tuner->interim_blocks);
   return;
 }
+
+