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 [2/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...

Modified: harmony/enhanced/drlvm/trunk/vm/gc_gen/src/common/weak_roots.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/gc_gen/src/common/weak_roots.cpp?rev=637062&r1=637061&r2=637062&view=diff
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/gc_gen/src/common/weak_roots.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/gc_gen/src/common/weak_roots.cpp Fri Mar 14 04:21:27 2008
@@ -32,9 +32,9 @@
       if(!p_obj){  // reference has been cleared
         continue;
       }
-      if(IS_FALLBACK_COMPACTION) {
+      assert(p_obj->vt_raw);
+      if(collect_is_fallback()) {
           if(obj_belongs_to_nos(p_obj) && obj_is_fw_in_oi(p_obj)){
-             //this is unreachable for VTable->jlc(p_obj), but needed by general weak roots
              assert(!obj_is_marked_in_vt(p_obj));
              assert(obj_get_vt(p_obj) == obj_get_vt(obj_get_fw_in_oi(p_obj)));
              p_obj = obj_get_fw_in_oi(p_obj);
@@ -48,8 +48,6 @@
   }
 }
 
-extern Boolean IS_MOVE_COMPACT;
-
 /* parameter pointer_addr_in_pool means it is p_ref or p_obj in pool */
 void gc_update_weak_roots(GC *gc, Boolean double_fix)
 {
@@ -67,29 +65,33 @@
       if(!p_obj || !obj_need_move(gc, p_obj)){  // reference has been cleared or not moved
         continue;
       }
+      /* following code knows p_obj's space is movable. So mark-sweep is not considered below. */
+      if( collect_is_compact_move()){ /* move-compact uses offset table */
+        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);
+        }
 
-      if(IS_MOVE_COMPACT){
-        assert(space_of_addr(gc, p_obj)->move_object);
-        *p_ref = obj_get_fw_in_table(p_obj);
-      } else if(gc_match_kind(gc, MC_COLLECTION)){
-        *p_ref = obj_get_fw_in_table(p_obj);
-      } else if(gc_match_kind(gc, MS_COMPACT_COLLECTION) || gc_get_mos((GC_Gen*)gc)->collect_algorithm==MAJOR_MARK_SWEEP){
+      } else if(collect_is_ms_compact()){ 
+        /* ms-compact does not move all live objects, and sometimes need double-fix */
         if(obj_is_fw_in_oi(p_obj)){
           p_obj = obj_get_fw_in_oi(p_obj);
           /* Only major collection in MS Gen GC might need double_fix.
            * Double fixing happens when both forwarding and compaction happen.
            */
           if(double_fix && obj_is_fw_in_oi(p_obj)){
-            assert(gc_get_mos((GC_Gen*)gc)->collect_algorithm == MAJOR_MARK_SWEEP);
+            assert(major_is_marksweep());
             p_obj = obj_get_fw_in_oi(p_obj);
             assert(address_belongs_to_gc_heap(p_obj, gc));
           }
-          *p_ref = p_obj;
         }
-      } else {
+      } else { /* minor collection or slide major compaction */
         assert(obj_is_fw_in_oi(p_obj));
-        *p_ref = obj_get_fw_in_oi(p_obj);
+        p_obj = obj_get_fw_in_oi(p_obj);
       }
+      
+      *p_ref = p_obj;
     }
   }
 }

Modified: harmony/enhanced/drlvm/trunk/vm/gc_gen/src/finalizer_weakref/finalizer_weakref.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/gc_gen/src/finalizer_weakref/finalizer_weakref.cpp?rev=637062&r1=637061&r2=637062&view=diff
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/gc_gen/src/finalizer_weakref/finalizer_weakref.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/gc_gen/src/finalizer_weakref/finalizer_weakref.cpp Fri Mar 14 04:21:27 2008
@@ -56,7 +56,7 @@
 
 static inline void fallback_update_fw_ref(REF *p_ref)
 {
-  assert(IS_FALLBACK_COMPACTION);
+  assert(collect_is_fallback());
   
   Partial_Reveal_Object *p_obj = read_slot(p_ref);
   if(obj_belongs_to_nos(p_obj) && obj_is_fw_in_oi(p_obj)){
@@ -82,8 +82,8 @@
     POINTER_SIZE_INT *iter = vector_block_iterator_init(block);
     for(; !vector_block_iterator_end(block, iter); iter = vector_block_iterator_advance(block, iter)){
       REF *p_ref = (REF*)iter;
-      if(IS_FALLBACK_COMPACTION)
-        fallback_update_fw_ref(p_ref);  // in case that this collection is FALLBACK_COLLECTION
+      if(collect_is_fallback())
+        fallback_update_fw_ref(p_ref);  // in case that this collection is ALGO_MAJOR_FALLBACK
       Partial_Reveal_Object *p_obj = read_slot(p_ref);
       if(!p_obj)
         continue;
@@ -91,7 +91,7 @@
         gc_add_finalizable_obj(gc, p_obj);
         *p_ref = (REF)NULL;
       } else {
-        if(gc_match_kind(gc, MINOR_COLLECTION) && obj_need_move(gc, p_obj)){
+        if(collect_is_minor() && obj_need_move(gc, p_obj)){
           assert(obj_is_fw_in_oi(p_obj));
           write_slot(p_ref, obj_get_fw_in_oi(p_obj));
         }
@@ -105,7 +105,7 @@
   }
   gc_put_finalizable_objects(gc);
   
-  if(gc_match_either_kind(gc, MAJOR_COLLECTION|MS_COMPACT_COLLECTION))
+  if(collect_need_update_repset())
     finref_add_repset_from_pool(gc, obj_with_fin_pool);
 }
 
@@ -135,23 +135,23 @@
   Trace_Object_Func trace_object;
   
   /* set trace_object() function */
-  if(gc_match_kind(gc, MINOR_COLLECTION)){
-    switch( MINOR_ALGO ){
-    case MINOR_NONGEN_FORWARD_POOL:
-      trace_object = trace_obj_in_nongen_fw;
-      break;
-    case MINOR_GEN_FORWARD_POOL:
-      trace_object = trace_obj_in_gen_fw;
-      break;
-    case MINOR_NONGEN_SEMISPACE_POOL:
-      trace_object = trace_obj_in_nongen_ss;
-      break;
-    case MINOR_GEN_SEMISPACE_POOL:
-      trace_object = trace_obj_in_gen_ss;
-      break;
-    default: assert(0);
+  if(collect_is_minor()){
+    if(gc_is_gen_mode()){
+      if(minor_is_forward())
+        trace_object = trace_obj_in_gen_fw;
+      else if(minor_is_semispace())
+        trace_object = trace_obj_in_gen_ss;
+      else 
+        assert(0);
+    }else{
+      if(minor_is_forward())
+        trace_object = trace_obj_in_nongen_fw;
+      else if(minor_is_semispace())
+        trace_object = trace_obj_in_nongen_ss;
+      else 
+        assert(0);
     }
-  } else if(gc_match_kind(gc, NORMAL_MAJOR_COLLECTION)){
+  } else if(collect_is_major_normal()){
     p_ref_or_obj = p_obj;
     if(gc_has_space_tuner(gc) && (gc->tuner->kind != TRANS_NOTHING)){
       trace_object = trace_obj_in_space_tune_marking;
@@ -165,18 +165,18 @@
       } else {
         collector->los_live_obj_size += round_up_to_size(obj_size, KB); 
       }
-    } else if(gc_get_mos((GC_Gen*)gc)->collect_algorithm == MAJOR_MARK_SWEEP){
+    } else if(major_is_marksweep()){
       trace_object = trace_obj_in_ms_marking;
     } else {
       trace_object = trace_obj_in_normal_marking;
     }
-  } else if(gc_match_kind(gc, FALLBACK_COLLECTION)){
-    if(gc_get_mos((GC_Gen*)gc)->collect_algorithm == MAJOR_MARK_SWEEP)
+  } else if(collect_is_fallback()){
+    if(major_is_marksweep())
       trace_object = trace_obj_in_ms_fallback_marking;
     else
       trace_object = trace_obj_in_fallback_marking;
   } else {
-    assert(gc_match_kind(gc, MARK_SWEEP_GC));
+    assert(major_is_marksweep());
     p_ref_or_obj = p_obj;
     if(!gc_mark_is_concurrent())
       trace_object = trace_obj_in_ms_marking;
@@ -194,8 +194,8 @@
     POINTER_SIZE_INT *iter = vector_block_iterator_init(task_block);
     while(!vector_block_iterator_end(task_block, iter)){
       void *p_ref_or_obj = (void*)*iter;
-      assert((gc_match_either_kind(gc, MINOR_COLLECTION|FALLBACK_COLLECTION) && *(Partial_Reveal_Object **)p_ref_or_obj)
-              || (gc_match_either_kind(gc, NORMAL_MAJOR_COLLECTION|MS_COLLECTION|MS_COMPACT_COLLECTION) && p_ref_or_obj));
+      assert(((collect_is_minor()||collect_is_fallback()) && *(Partial_Reveal_Object **)p_ref_or_obj)
+              || ((collect_is_major_normal()||major_is_marksweep()) && p_ref_or_obj));
       trace_object(collector, p_ref_or_obj);
       if(collector->result == FALSE)  break; /* Resurrection fallback happens; force return */
       
@@ -240,7 +240,7 @@
       
       /* Perhaps obj has been resurrected by previous resurrections */
       if(!gc_obj_is_dead(gc, p_obj)){
-        if(gc_match_kind(gc, MINOR_COLLECTION) && obj_need_move(gc, p_obj))
+        if(collect_is_minor() && obj_need_move(gc, p_obj))
           write_slot(p_ref, obj_get_fw_in_oi(p_obj));
         continue;
       }
@@ -248,7 +248,7 @@
       resurrect_obj_tree(collector, p_ref);
       if(collector->result == FALSE){
         /* Resurrection fallback happens */
-        assert(gc_match_kind(gc, MINOR_COLLECTION));
+        assert(collect_is_minor());
         return; /* force return */
       }
     }
@@ -260,7 +260,7 @@
    * Because it is outside heap, we can't update it in ref fixing.
    * In minor collection p_ref of the root dead obj is automatically updated while tracing.
    */
-  if(gc_match_either_kind(gc, MAJOR_COLLECTION|MS_COMPACT_COLLECTION))
+  if(collect_need_update_repset())
     finref_add_repset_from_pool(gc, finalizable_obj_pool);
   metadata->pending_finalizers = TRUE;
   
@@ -271,7 +271,7 @@
 
 static void identify_dead_refs(GC *gc, Pool *pool)
 {
-  if(gc_match_either_kind(gc, MAJOR_COLLECTION|MS_COMPACT_COLLECTION))
+  if(collect_need_update_repset())
     finref_reset_repset(gc);
 
   pool_iterator_init(pool);
@@ -283,7 +283,7 @@
       Partial_Reveal_Object *p_obj = read_slot(p_ref);
       assert(p_obj);
       REF *p_referent_field = obj_get_referent_field(p_obj);
-      if(IS_FALLBACK_COMPACTION)
+      if(collect_is_fallback())
         fallback_update_fw_ref(p_referent_field);
         
       Partial_Reveal_Object *p_referent = read_slot(p_referent_field);
@@ -297,7 +297,7 @@
       }
       if(!gc_obj_is_dead(gc, p_referent)){  // referent is alive
         if(obj_need_move(gc, p_referent)){
-          if(gc_match_kind(gc, MINOR_COLLECTION)){
+          if(collect_is_minor()){
             assert(obj_is_fw_in_oi(p_referent));
             Partial_Reveal_Object* p_new_referent = obj_get_fw_in_oi(p_referent);
             write_slot(p_referent_field, p_new_referent);
@@ -308,7 +308,7 @@
               if(addr_belongs_to_nos(p_new_referent) && !addr_belongs_to_nos(p_obj))
                 collector_remset_add_entry(gc->collectors[0], ( Partial_Reveal_Object**)p_referent_field); 
 
-          } else if(!gc_match_kind(gc, MS_COLLECTION)){
+          } else{ // if(collect_move_object()){ the condition is redundant because obj_need_move already checks 
             finref_repset_add_entry(gc, p_referent_field);
           }
         }
@@ -324,7 +324,7 @@
     block = pool_iterator_next(pool);
   }
   
-  if(gc_match_either_kind(gc, MAJOR_COLLECTION|MS_COMPACT_COLLECTION)){
+  if(collect_need_update_repset()){
     finref_put_repset(gc);
     finref_add_repset_from_pool(gc, pool);
   }
@@ -333,7 +333,7 @@
 static void identify_dead_softrefs(Collector *collector)
 {
   GC *gc = collector->gc;
-  if(gc_match_kind(gc, MINOR_COLLECTION)){
+  if(collect_is_minor()){
     assert(softref_pool_is_empty(gc));
     return;
   }
@@ -360,7 +360,7 @@
   Finref_Metadata *metadata = gc->finref_metadata;
   Pool *phanref_pool = metadata->phanref_pool;
   
-  if(gc_match_either_kind(gc, MAJOR_COLLECTION|MS_COMPACT_COLLECTION))
+  if(collect_need_update_repset())
     finref_reset_repset(gc);
 //  collector_reset_repset(collector);
   pool_iterator_init(phanref_pool);
@@ -372,17 +372,17 @@
       Partial_Reveal_Object *p_obj = read_slot((REF*)p_ref);
       assert(p_obj);
       REF *p_referent_field = obj_get_referent_field(p_obj);
-      if(IS_FALLBACK_COMPACTION)
-      fallback_update_fw_ref(p_referent_field);
-      Partial_Reveal_Object *p_referent = read_slot(p_referent_field);
-      
+      if(collect_is_fallback())
+        fallback_update_fw_ref(p_referent_field);
+
+      Partial_Reveal_Object *p_referent = read_slot(p_referent_field);      
       if(!p_referent){  // referent field has been cleared
         *p_ref = NULL;
         continue;
       }
       if(!gc_obj_is_dead(gc, p_referent)){  // referent is alive
-        if(obj_need_move(gc, p_referent))
-          if(gc_match_kind(gc, MINOR_COLLECTION)){
+        if(obj_need_move(gc, p_referent)){
+          if(collect_is_minor()){
             assert(obj_is_fw_in_oi(p_referent));
             Partial_Reveal_Object* p_new_referent = obj_get_fw_in_oi(p_referent);
             write_slot(p_referent_field, p_new_referent);
@@ -390,9 +390,10 @@
               if(addr_belongs_to_nos(p_new_referent) && !addr_belongs_to_nos(p_obj))
                 collector_remset_add_entry(gc->collectors[0], ( Partial_Reveal_Object**)p_referent_field); 
 
-          } else if(!gc_match_kind(gc, MS_COLLECTION)){
+          } else{ // if(collect_move_object()){ this check is redundant because obj_need_move checks
             finref_repset_add_entry(gc, p_referent_field);
           }
+        }
         *p_ref = (REF)NULL;
         continue;
       }
@@ -408,7 +409,7 @@
     block = pool_iterator_next(phanref_pool);
   }
 //  collector_put_repset(collector);
-  if(gc_match_either_kind(gc, MAJOR_COLLECTION|MS_COMPACT_COLLECTION)){
+  if(collect_need_update_repset()){
     finref_put_repset(gc);
     finref_add_repset_from_pool(gc, phanref_pool);
   }
@@ -588,7 +589,7 @@
   resurrect_finalizable_objects(collector);
   gc->collect_result = gc_collection_result(gc);
   if(!gc->collect_result){
-    assert(gc_match_kind(gc, MINOR_COLLECTION));
+    assert(collect_is_minor());
     resurrection_fallback_handler(gc);
     return;
   }
@@ -650,17 +651,17 @@
       Partial_Reveal_Object *p_obj = read_slot(p_ref);
       assert(p_obj);
       REF *p_referent_field = obj_get_referent_field(p_obj);
-      if(IS_FALLBACK_COMPACTION)
+      if(collect_is_fallback())
         fallback_update_fw_ref(p_referent_field);
-      Partial_Reveal_Object *p_referent = read_slot(p_referent_field);
-      
+        
+      Partial_Reveal_Object *p_referent = read_slot(p_referent_field);      
       if(!p_referent){  // referent field has been cleared
         *p_ref = (REF)NULL;
         continue;
       }
       if(!gc_obj_is_dead(gc, p_referent)){  // referent is alive
         if(obj_need_move(gc, p_referent))
-          if(gc_match_kind(gc, MINOR_COLLECTION)){
+          if(collect_is_minor()){
             assert(obj_is_fw_in_oi(p_referent));
             Partial_Reveal_Object* p_new_referent = obj_get_fw_in_oi(p_referent);
             write_slot(p_referent_field, p_new_referent);
@@ -684,14 +685,14 @@
 {
   Finref_Metadata *metadata = gc->finref_metadata;
   
-  if(gc_match_either_kind(gc, MAJOR_COLLECTION|MS_COMPACT_COLLECTION))
+  if(collect_need_update_repset())
     finref_reset_repset(gc);
-  if(!gc_match_kind(gc, MS_COLLECTION)){
+  if(collect_move_object()){
     update_referent_field_ignore_finref(gc, metadata->softref_pool);
     update_referent_field_ignore_finref(gc, metadata->weakref_pool);
     update_referent_field_ignore_finref(gc, metadata->phanref_pool);
   }
-  if(gc_match_either_kind(gc, MAJOR_COLLECTION|MS_COMPACT_COLLECTION))
+  if(collect_need_update_repset())
     finref_put_repset(gc);
 }
 
@@ -743,7 +744,7 @@
        * Double fixing happens when both forwarding and compaction happen.
        */
       if(double_fix && obj_is_fw_in_oi(p_new_ref)){
-        assert(gc_get_mos((GC_Gen*)gc)->collect_algorithm == MAJOR_MARK_SWEEP);
+        assert(major_is_marksweep());
         p_new_ref = obj_get_fw_in_oi(p_new_ref);
         assert(address_belongs_to_gc_heap(p_new_ref, gc));
       }
@@ -762,16 +763,14 @@
    * Double fixing happens when both forwarding and compaction happen.
    */
   if(double_fix && obj_is_fw_in_oi(p_obj)){
-    assert(gc_get_mos((GC_Gen*)gc)->collect_algorithm == MAJOR_MARK_SWEEP);
+    assert(major_is_marksweep());
     p_obj = obj_get_fw_in_oi(p_obj);
     assert(address_belongs_to_gc_heap(p_obj, gc));
   }
   write_slot(p_ref, p_obj);
 }
 
-extern Boolean IS_MOVE_COMPACT;
-
-/* parameter pointer_addr_in_pool means it is p_ref or p_obj in pool */
+/* only called in non-minor collection. parameter pointer_addr_in_pool means it is p_ref or p_obj in pool*/
 static void nondestructively_fix_finref_pool(GC *gc, Pool *pool, Boolean pointer_addr_in_pool, Boolean double_fix)
 {
   Finref_Metadata *metadata = gc->finref_metadata;
@@ -790,12 +789,12 @@
         p_ref = (REF*)iter;
       p_obj = read_slot(p_ref);
       
-      if(IS_MOVE_COMPACT){
+      if(collect_is_compact_move()){ /* include both unique move-compact and major move-compact */
         move_compaction_update_ref(gc, p_ref);
-      } else if(gc_match_kind(gc, MS_COMPACT_COLLECTION) || gc_get_mos((GC_Gen*)gc)->collect_algorithm==MAJOR_MARK_SWEEP){
+      } else if(collect_is_ms_compact()){
         if(obj_is_fw_in_oi(p_obj))
           moving_mark_sweep_update_ref(gc, p_ref, double_fix);
-      } else {
+      } else { /* major slide compact */
         assert((obj_is_marked_in_vt(p_obj) && obj_is_fw_in_oi(p_obj)));
         write_slot(p_ref , obj_get_fw_in_oi(p_obj));
       }
@@ -806,7 +805,7 @@
 
 void gc_update_finref_repointed_refs(GC *gc, Boolean double_fix)
 {
-  assert(!gc_match_kind(gc, MINOR_COLLECTION));
+  assert(!collect_is_minor());
   
   Finref_Metadata *metadata = gc->finref_metadata;
   Pool *repset_pool = metadata->repset_pool;
@@ -814,7 +813,7 @@
   
   nondestructively_fix_finref_pool(gc, repset_pool, TRUE, double_fix);
   if(!pool_is_empty(fallback_ref_pool)){
-    assert(IS_FALLBACK_COMPACTION);
+    assert(collect_is_fallback());
     nondestructively_fix_finref_pool(gc, fallback_ref_pool, FALSE, double_fix);
   }
 }
@@ -851,6 +850,8 @@
   finref_copy_pool(finalizable_obj_pool, finalizable_obj_pool_copy, gc);
   finref_copy_pool_to_rootset(gc, finalizable_obj_pool_copy);
 }
+
+
 
 
 

Modified: harmony/enhanced/drlvm/trunk/vm/gc_gen/src/finalizer_weakref/finalizer_weakref.h
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/gc_gen/src/finalizer_weakref/finalizer_weakref.h?rev=637062&r1=637061&r2=637062&view=diff
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/gc_gen/src/finalizer_weakref/finalizer_weakref.h (original)
+++ harmony/enhanced/drlvm/trunk/vm/gc_gen/src/finalizer_weakref/finalizer_weakref.h Fri Mar 14 04:21:27 2008
@@ -71,7 +71,7 @@
   }
   switch(type){
     case SOFT_REFERENCE :
-      if(gc_match_kind(collector->gc, MINOR_COLLECTION))
+      if(collect_is_minor())
         scan_slot(collector, p_referent_field);
       else
         collector_add_softref(collector, p_obj);

Modified: harmony/enhanced/drlvm/trunk/vm/gc_gen/src/finalizer_weakref/finalizer_weakref_metadata.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/gc_gen/src/finalizer_weakref/finalizer_weakref_metadata.cpp?rev=637062&r1=637061&r2=637062&view=diff
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/gc_gen/src/finalizer_weakref/finalizer_weakref_metadata.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/gc_gen/src/finalizer_weakref/finalizer_weakref_metadata.cpp Fri Mar 14 04:21:27 2008
@@ -426,6 +426,11 @@
   finref_metadata_clear_pool(gc->finref_metadata->phanref_pool);
 }
 
+void gc_clear_finref_repset_pool(GC* gc)
+{
+  finref_metadata_clear_pool(gc->finref_metadata->repset_pool);
+}
+
 Boolean finref_copy_pool(Pool *src_pool, Pool *dest_pool, GC *gc)
 {
   Vector_Block *dest_block = finref_get_free_block(gc);
@@ -440,4 +445,6 @@
   }
  return TRUE;
 }
+
+
 

Modified: harmony/enhanced/drlvm/trunk/vm/gc_gen/src/finalizer_weakref/finalizer_weakref_metadata.h
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/gc_gen/src/finalizer_weakref/finalizer_weakref_metadata.h?rev=637062&r1=637061&r2=637062&view=diff
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/gc_gen/src/finalizer_weakref/finalizer_weakref_metadata.h (original)
+++ harmony/enhanced/drlvm/trunk/vm/gc_gen/src/finalizer_weakref/finalizer_weakref_metadata.h Fri Mar 14 04:21:27 2008
@@ -91,6 +91,7 @@
 
 
 extern void gc_clear_weakref_pools(GC *gc);
+extern void gc_clear_finref_repset_pool(GC* gc);
 
 extern Vector_Block *finref_metadata_extend(void);
 /* Every place requesting a free vector block in finref should call this function */

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=637062&r1=637061&r2=637062&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 Fri Mar 14 04:21:27 2008
@@ -42,15 +42,30 @@
 POINTER_SIZE_INT MIN_NOS_SIZE = 0;
 POINTER_SIZE_INT MAX_NOS_SIZE = 0;
 
-/* should clean up */
-unsigned int MINOR_ALGO = 0;
-unsigned int MAJOR_ALGO = 0;
-
 Boolean GEN_NONGEN_SWITCH = FALSE;
 
 Boolean JVMTI_HEAP_ITERATION = true;
 
-Boolean gen_mode;
+GC* gc_gen_create()
+{
+  GC* gc = (GC*)STD_MALLOC(sizeof(GC_Gen));  
+  assert(gc);
+  memset(gc, 0, sizeof(GC_Gen));
+  return gc;
+}
+
+void gc_set_gen_mode(Boolean status)
+{
+  if(status){
+    gc_set_gen_flag(); 
+    gc_set_barrier_function(WRITE_BARRIER_REM_SOURCE_REF);
+  }else{
+    gc_clear_gen_flag();
+    gc_set_barrier_function(WRITE_BARRIER_REM_NIL);
+  }
+ 
+  HelperClass_set_GenMode(status);   
+}
 
 #ifndef STATIC_NOS_MAPPING
 void* nos_boundary;
@@ -96,7 +111,7 @@
   determine_min_nos_size(gc_gen, min_heap_size);
   
   POINTER_SIZE_INT los_size = 0;
-  if(MAJOR_ALGO == MAJOR_MARK_SWEEP)
+  if(major_is_marksweep())
     min_los_size_bytes = 0;
   else
     los_size = determine_los_size(min_heap_size);
@@ -202,7 +217,7 @@
 
 #endif  /* STATIC_NOS_MAPPING else */
 
-  HEAP_NULL = (POINTER_SIZE_INT)reserved_base;
+  HEAP_BASE = (POINTER_SIZE_INT)reserved_base;
   
   gc_gen->physical_start = physical_start;
   gc_gen->heap_start = reserved_base;
@@ -218,7 +233,7 @@
   gc_gen->num_collections = 0;
   gc_gen->time_collections = 0;
   gc_gen->blocks = (Block*)reserved_base;
-  gc_gen->force_major_collect = FALSE;
+  gc_gen->next_collect_force_major = FALSE;
   gc_gen->force_gen_mode = FALSE;
 
   max_heap_size_bytes = max_heap_size;
@@ -232,7 +247,7 @@
                                                 + space_committed_size(gc_get_mos(gc_gen))
                                                 + space_committed_size(gc_get_los(gc_gen));
   
-  if(MAJOR_ALGO != MAJOR_MARK_SWEEP){
+  if(!major_is_marksweep()){
     Blocked_Space *nos = (Blocked_Space*)gc_get_nos(gc_gen);
     Blocked_Space *mos = (Blocked_Space*)gc_get_mos(gc_gen);
     /* Connect mos and nos, so that they can be compacted as one space */
@@ -264,7 +279,7 @@
   gc_nos_destruct(gc_gen);
   gc_mos_destruct(gc_gen);
 
-  if(MAJOR_ALGO != MAJOR_MARK_SWEEP){
+  if(!major_is_marksweep()){
     los_size = (int)space_committed_size((Space*)gc_gen->los);
     gc_los_destruct(gc_gen);
   }
@@ -305,7 +320,7 @@
 void gc_nos_initialize(GC_Gen *gc, void *start, POINTER_SIZE_INT nos_size, POINTER_SIZE_INT commit_size)
 {
   Space *nos;
-  if(MINOR_ALGO == MINOR_NONGEN_SEMISPACE_POOL || MINOR_ALGO == MINOR_GEN_SEMISPACE_POOL){
+  if(minor_is_semispace()){
     nos = (Space*)sspace_initialize((GC*)gc, start, nos_size, commit_size);
     nos_alloc = sspace_alloc;
   }else{
@@ -314,12 +329,11 @@
   }
   
   gc_set_nos(gc, nos);
-  nos->collect_algorithm = MINOR_ALGO;
 }
 
 void gc_nos_destruct(GC_Gen *gc)
 { 
-  if(MINOR_ALGO == MINOR_NONGEN_SEMISPACE_POOL || MINOR_ALGO == MINOR_GEN_SEMISPACE_POOL)
+  if(minor_is_semispace())
     sspace_destruct((Sspace*)gc->nos);
   else
     fspace_destruct((Fspace*)gc->nos); 
@@ -328,7 +342,7 @@
 void gc_mos_initialize(GC_Gen *gc, void *start, POINTER_SIZE_INT mos_size, POINTER_SIZE_INT commit_size)
 {
   Space *mos;
-  if(MAJOR_ALGO == MAJOR_MARK_SWEEP){
+  if(major_is_marksweep()){
     mos = (Space*)wspace_initialize((GC*)gc, start, mos_size, commit_size);
     mos_alloc = wspace_alloc;
   } else {
@@ -336,12 +350,11 @@
     mos_alloc = mspace_alloc;
   }
   gc_set_mos(gc, mos);
-  mos->collect_algorithm = MAJOR_ALGO;
 }
 
 void gc_mos_destruct(GC_Gen *gc)
 {
-  if(MAJOR_ALGO == MAJOR_MARK_SWEEP)
+  if(major_is_marksweep())
     wspace_destruct((Wspace*)gc->mos);
   else
     mspace_destruct((Mspace*)gc->mos);
@@ -350,7 +363,7 @@
 void gc_los_initialize(GC_Gen *gc, void *start, POINTER_SIZE_INT los_size)
 {
   Space *los;
-  if(MAJOR_ALGO == MAJOR_MARK_SWEEP){
+  if(major_is_marksweep()){
     assert(los_size == 0);
     los = NULL;
     los_alloc = wspace_alloc;
@@ -363,7 +376,7 @@
 
 void gc_los_destruct(GC_Gen *gc)
 {
-  if(MAJOR_ALGO != MAJOR_MARK_SWEEP)
+  if(!major_is_marksweep())
     lspace_destruct((Lspace*)gc->los);
 }
 
@@ -372,102 +385,86 @@
 Boolean IGNORE_VTABLE_TRACING = FALSE;
 Boolean TRACE_JLC_VIA_VTABLE = FALSE;
 
-unsigned int gc_next_collection_kind(GC_Gen* gc)
+void gc_gen_decide_collection_kind(GC_Gen* gc, unsigned int cause)
 {
-  if(gc->force_major_collect || FORCE_FULL_COMPACT)
-    return MAJOR_COLLECTION;
+  if(gc->next_collect_force_major || cause== GC_CAUSE_LOS_IS_FULL || FORCE_FULL_COMPACT)
+    collect_set_major_normal();
   else
-    return MINOR_COLLECTION;
-}
-
-
-void gc_decide_collection_kind(GC_Gen* gc, unsigned int cause)
-{
-  /* this is for debugging. */
-  gc->last_collect_kind = gc->collect_kind;
-#if defined(USE_MARK_SWEEP_GC)
-  gc->collect_kind = MS_COLLECTION;
-#elif defined(USE_UNIQUE_MOVE_COMPACT_GC)
-  gc->collect_kind = MC_COLLECTION;
-#else
-  if(gc->force_major_collect || cause== GC_CAUSE_LOS_IS_FULL || FORCE_FULL_COMPACT)
-    gc->collect_kind = NORMAL_MAJOR_COLLECTION;
-  else
-    gc->collect_kind = MINOR_COLLECTION;
+    collect_set_minor();
     
-  if(IGNORE_VTABLE_TRACING || (gc->collect_kind == MINOR_COLLECTION))
+  if(IGNORE_VTABLE_TRACING || collect_is_minor())
     TRACE_JLC_VIA_VTABLE = FALSE;
   else
     TRACE_JLC_VIA_VTABLE = TRUE;
-#endif
+
   return;
 }
 
-void gc_decide_collection_algorithm(GC_Gen* gc, char* minor_algo, char* major_algo)
+GC* gc_gen_decide_collection_algo(char* minor_algo, char* major_algo, Boolean has_los)
 {
-  if(!minor_algo){
-    MINOR_ALGO = MINOR_NONGEN_FORWARD_POOL;      
-    gc_disable_gen_mode();
+  GC_PROP = ALGO_POOL_SHARE | ALGO_DEPTH_FIRST;
   
-  }else{
+  /* set default GC properties for generational GC */
+  GC_PROP |= ALGO_HAS_NOS;   
+  
+  /* default is has LOS */
+  GC_PROP |= ALGO_HAS_LOS;
+  
+  Boolean use_default = FALSE;
+
+  if(minor_algo){
     string_to_upper(minor_algo);
      
-    if(!strcmp(minor_algo, "MINOR_NONGEN_FORWARD_POOL")){  
-      MINOR_ALGO = MINOR_NONGEN_FORWARD_POOL;
-      gc_disable_gen_mode();
-      
-    }else if(!strcmp(minor_algo, "MINOR_GEN_FORWARD_POOL")){
-      MINOR_ALGO = MINOR_GEN_FORWARD_POOL;
-      gc_enable_gen_mode();
-    
-    }else if(!strcmp(minor_algo, "MINOR_NONGEN_SEMISPACE_POOL")){
-      MINOR_ALGO = MINOR_NONGEN_SEMISPACE_POOL;
-      gc_disable_gen_mode();
-    
-    }else if(!strcmp(minor_algo, "MINOR_GEN_SEMISPACE_POOL")){
-      MINOR_ALGO = MINOR_GEN_SEMISPACE_POOL;
-      gc_enable_gen_mode();
-
+    if(!strcmp(minor_algo, "PARTIAL_FORWARD")){  
+      GC_PROP |= ALGO_COPY_FORWARD;
+    
+    }else if(!strcmp(minor_algo, "SEMI_SPACE")){
+      GC_PROP |= ALGO_COPY_SEMISPACE;
+    
     }else {
       WARN2("gc.base","\nWarning: GC algorithm setting incorrect. Will use default value.\n");
-      MINOR_ALGO = MINOR_NONGEN_FORWARD_POOL;      
-      gc_disable_gen_mode();    
+      use_default = TRUE;
     }
   }
+  if(!minor_algo || use_default)
+    GC_PROP |= ALGO_COPY_FORWARD;
   
-  if(!major_algo){
-    MAJOR_ALGO = MAJOR_COMPACT_MOVE;
-    
-  }else{
+
+  use_default = FALSE;
+
+  if(major_algo){
     string_to_upper(major_algo);
 
-    if(!strcmp(major_algo, "MAJOR_COMPACT_SLIDE")){
-      MAJOR_ALGO = MAJOR_COMPACT_SLIDE;
+    if(!strcmp(major_algo, "SLIDE_COMPACT")){
+      GC_PROP |= ALGO_COMPACT_SLIDE;
       
-    }else if(!strcmp(major_algo, "MAJOR_COMPACT_MOVE")){
-      MAJOR_ALGO = MAJOR_COMPACT_MOVE;
+    }else if(!strcmp(major_algo, "MOVE_COMPACT")){
+      GC_PROP |= ALGO_COMPACT_MOVE;
+
+    }else if(!strcmp(major_algo, "MARK_SWEEP")){
+      GC_PROP |= ALGO_MARKSWEEP;
     
-    }else if(!strcmp(major_algo, "MAJOR_MARK_SWEEP")){
-      MAJOR_ALGO = MAJOR_MARK_SWEEP;
-      is_collector_local_alloc = FALSE;
     }else{
      WARN2("gc.base","\nWarning: GC algorithm setting incorrect. Will use default value.\n");
-      MAJOR_ALGO = MAJOR_COMPACT_MOVE;
-      
+     use_default = TRUE; 
     }
   }
   
-  return;
-  
+  if(!major_algo || use_default)
+      GC_PROP |= ALGO_COMPACT_MOVE;
+
+  GC* gc = gc_gen_create();
+
+  return gc; 
 }
 
-static Boolean nos_alloc_block(Space* space, Allocator* allocator)
+static Boolean nos_alloc_block(Space* nos, Allocator* allocator)
 {
   Boolean result;
-  if(MINOR_ALGO == MINOR_NONGEN_SEMISPACE_POOL || MINOR_ALGO == MINOR_GEN_SEMISPACE_POOL)
-    result = sspace_alloc_block((Sspace*)space, allocator); 
+  if(minor_is_semispace())
+    result = sspace_alloc_block((Sspace*)nos, allocator); 
   else
-    result = fspace_alloc_block((Fspace*)space, allocator);   
+    result = fspace_alloc_block((Fspace*)nos, allocator);   
  
   return result;   
 }
@@ -495,9 +492,9 @@
 
 static void gc_gen_adjust_heap_size(GC_Gen* gc)
 {
-  assert(gc_match_kind((GC*)gc, MAJOR_COLLECTION));
+  assert(collect_is_major());
   
-  if(gc->committed_heap_size == max_heap_size_bytes - LOS_HEAD_RESERVE_FOR_HEAP_NULL) return;
+  if(gc->committed_heap_size == max_heap_size_bytes - LOS_HEAD_RESERVE_FOR_HEAP_BASE) return;
   
   Mspace* mos = (Mspace*)gc->mos;
   Blocked_Space* nos = (Blocked_Space*)gc->nos;
@@ -534,8 +531,8 @@
 
   if(new_heap_total_size <= heap_total_size) return;
   /*If there is only small piece of area left not committed, we just merge it into the heap at once*/
-  if(new_heap_total_size + (max_heap_size_bytes >> 5) > max_heap_size_bytes - LOS_HEAD_RESERVE_FOR_HEAP_NULL) 
-    new_heap_total_size = max_heap_size_bytes - LOS_HEAD_RESERVE_FOR_HEAP_NULL;
+  if(new_heap_total_size + (max_heap_size_bytes >> 5) > max_heap_size_bytes - LOS_HEAD_RESERVE_FOR_HEAP_BASE) 
+    new_heap_total_size = max_heap_size_bytes - LOS_HEAD_RESERVE_FOR_HEAP_BASE;
 
   adjust_size = new_heap_total_size - heap_total_size;
   assert( !(adjust_size % SPACE_ALLOC_UNIT) );
@@ -600,7 +597,7 @@
 
 static inline void nos_collection(Space *nos)
 { 
-  if(MINOR_ALGO == MINOR_NONGEN_SEMISPACE_POOL || MINOR_ALGO == MINOR_GEN_SEMISPACE_POOL)
+  if(minor_is_semispace())
     sspace_collection((Sspace*)nos); 
   else
     fspace_collection((Fspace*)nos); 
@@ -608,7 +605,7 @@
 
 static inline void mos_collection(Space *mos)
 {
-  if(MAJOR_ALGO == MAJOR_MARK_SWEEP)
+  if(major_is_marksweep())
     wspace_collection((Wspace*)mos);
   else
     mspace_collection((Mspace*)mos);
@@ -616,7 +613,7 @@
 
 static inline void los_collection(Space *los)
 {
-  if(MAJOR_ALGO != MAJOR_MARK_SWEEP)
+  if(!major_is_marksweep())
     lspace_collection((Lspace*)los);
 }
 
@@ -636,7 +633,7 @@
   mos->num_used_blocks = mos_used_space_size((Space*)mos)>> GC_BLOCK_SHIFT_COUNT;
   
   if(los){
-    assert(MAJOR_ALGO != MAJOR_MARK_SWEEP);
+    assert(!major_is_marksweep());
     los->accumu_alloced_size += los->last_alloced_size;
   }
 }
@@ -648,12 +645,12 @@
   Space *los = gc_get_los(gc);
   
   /* Minor collection, but also can be every n minor collections, use fspace->num_collections to identify. */
-  if (gc_match_kind((GC*)gc, MINOR_COLLECTION)){
+  if (collect_is_minor()){
     mos->accumu_alloced_size += mos->last_alloced_size;
     /* The alloced_size reset operation of mos and nos is not necessary, because they are not accumulated.
      * But los->last_alloced_size must be reset, because it is accumulated. */
     if(los){
-      assert(MAJOR_ALGO != MAJOR_MARK_SWEEP);
+      assert(!major_is_marksweep());
       los->last_alloced_size = 0;
     }
   /* Major collection, but also can be every n major collections, use mspace->num_collections to identify. */
@@ -667,7 +664,7 @@
     nos->accumu_alloced_size = 0;
     
     if(los){
-      assert(MAJOR_ALGO != MAJOR_MARK_SWEEP);
+      assert(!major_is_marksweep());
       los->total_alloced_size += los->accumu_alloced_size;
       los->last_alloced_size = 0;
       los->accumu_alloced_size = 0;
@@ -677,7 +674,7 @@
  
 static void nos_reset_after_collection(Space *nos)
 {
-  if(MINOR_ALGO == MINOR_NONGEN_SEMISPACE_POOL || MINOR_ALGO == MINOR_GEN_SEMISPACE_POOL)
+  if(minor_is_semispace())
     sspace_reset_after_collection((Sspace*)nos);
   else
     fspace_reset_after_collection((Fspace*)nos);
@@ -685,19 +682,18 @@
 
 static void nos_prepare_for_collection(Space *nos)
 {
-  if(MINOR_ALGO == MINOR_NONGEN_SEMISPACE_POOL || MINOR_ALGO == MINOR_GEN_SEMISPACE_POOL)
+  if(minor_is_semispace())
     sspace_prepare_for_collection((Sspace*)nos);
 }
 
 static void mos_reset_after_collection(Space *mos)
 {
-  if(MAJOR_ALGO != MAJOR_MARK_SWEEP)
+  if(!major_is_marksweep())
     mspace_reset_after_collection((Mspace*)mos);
   else
     wspace_reset_after_collection((Wspace*)mos);
 }
 
-Boolean IS_FALLBACK_COMPACTION = FALSE; /* only for debugging, don't use it. */
 void gc_gen_stats_verbose(GC_Gen* gc);
 
 void gc_gen_reclaim_heap(GC_Gen *gc, int64 gc_start_time)
@@ -709,10 +705,10 @@
   Space *los = gc->los;
   
   
-  if(verify_live_heap && (MAJOR_ALGO != MAJOR_MARK_SWEEP))
+  if(verify_live_heap && (!major_is_marksweep()))
     gc_verify_heap((GC*)gc, TRUE);
   
-  if(MAJOR_ALGO != MAJOR_MARK_SWEEP){
+  if(!major_is_marksweep()){
     gc_gen_update_space_info_before_gc(gc);
     gc_compute_space_tune_size_before_marking((GC*)gc);
   }
@@ -725,7 +721,7 @@
 
   nos_prepare_for_collection(nos);
 
-  if(gc_match_kind((GC*)gc, MINOR_COLLECTION)){
+  if(collect_is_minor()){
 
     INFO2("gc.process", "GC: start minor collection ...\n");
 
@@ -734,7 +730,7 @@
     
     /* This is for compute mos->last_alloced_size */
     unsigned int mos_used_blocks_before_minor, mos_used_blocks_after_minor; /* only used for non MAJOR_MARK_SWEEP collection */
-    if(MAJOR_ALGO != MAJOR_MARK_SWEEP)
+    if(!major_is_marksweep())
       mos_used_blocks_before_minor = ((Blocked_Space*)mos)->free_block_idx - ((Blocked_Space*)mos)->first_block_idx;
     
     nos_collection(nos);
@@ -743,7 +739,7 @@
     gc_gen_collector_stats_verbose_minor_collection(gc);
 #endif
 
-    if(MAJOR_ALGO != MAJOR_MARK_SWEEP){
+    if(!major_is_marksweep()){
       mos_used_blocks_after_minor = ((Blocked_Space*)mos)->free_block_idx - ((Blocked_Space*)mos)->first_block_idx;
       assert( mos_used_blocks_before_minor <= mos_used_blocks_after_minor );
       ((Blocked_Space*)mos)->last_alloced_size = GC_BLOCK_SIZE_BYTES * ( mos_used_blocks_after_minor - mos_used_blocks_before_minor );
@@ -765,13 +761,13 @@
 
     INFO2("gc.process", "GC: start major collection ...\n");
 
-    if(MAJOR_ALGO != MAJOR_MARK_SWEEP)
+    if(!major_is_marksweep())
       los->move_object = TRUE;
     
     mos_collection(mos); /* collect mos and nos  together */
     los_collection(los);
     
-    if(MAJOR_ALGO != MAJOR_MARK_SWEEP)
+    if(!major_is_marksweep())
       los->move_object = FALSE;
 
 #ifdef GC_GEN_STATS
@@ -782,19 +778,18 @@
     INFO2("gc.process", "GC: end of major collection ...\n");
   }
   
-  if(gc->collect_result == FALSE && gc_match_kind((GC*)gc, MINOR_COLLECTION)){
+  if(gc->collect_result == FALSE && collect_is_minor()){
     
     INFO2("gc.process", "GC: Minor collection failed, transform to fallback collection ...");
         
     /* runout mos in minor collection */
-    if(MAJOR_ALGO != MAJOR_MARK_SWEEP){
+    if(!major_is_marksweep()){
       assert(((Blocked_Space*)mos)->free_block_idx == ((Blocked_Space*)mos)->ceiling_block_idx + 1);
       ((Blocked_Space*)mos)->num_used_blocks = ((Blocked_Space*)mos)->num_managed_blocks;
     }
     
-    IS_FALLBACK_COMPACTION = TRUE;
     gc_reset_collect_result((GC*)gc);
-    gc->collect_kind = FALLBACK_COLLECTION;
+    GC_PROP |= ALGO_MAJOR_FALLBACK;
 
 #ifdef GC_GEN_STATS
     /*since stats is changed in minor collection, we need to reset stats before fallback collection*/
@@ -805,19 +800,17 @@
     if(gc_is_gen_mode()) 
       gc_clear_remset((GC*)gc);
 
-    if(verify_live_heap && (MAJOR_ALGO != MAJOR_MARK_SWEEP))
+    if(verify_live_heap && (!major_is_marksweep()))
       event_gc_collect_kind_changed((GC*)gc);
     
-    if(MAJOR_ALGO != MAJOR_MARK_SWEEP)
+    if(!major_is_marksweep())
       los->move_object = TRUE;
 
     mos_collection(mos); /* collect both mos and nos */
     los_collection(los);
-    if(MAJOR_ALGO != MAJOR_MARK_SWEEP)
+    if(!major_is_marksweep())
       los->move_object = FALSE;
     
-    IS_FALLBACK_COMPACTION = FALSE;
-
 #ifdef GC_GEN_STATS
     gc->stats->num_fallback_collections++;
     gc_gen_collector_stats_verbose_major_collection(gc);
@@ -834,20 +827,20 @@
   }
   
   nos_reset_after_collection(nos);
-  if(gc_match_kind((GC*)gc, MAJOR_COLLECTION))
+  if(collect_is_major())
     mos_reset_after_collection(mos);
   
-  if(verify_live_heap && (MAJOR_ALGO != MAJOR_MARK_SWEEP))
+  if(verify_live_heap && (!major_is_marksweep()))
     gc_verify_heap((GC*)gc, FALSE);
   
-  assert(MAJOR_ALGO == MAJOR_MARK_SWEEP || !los->move_object);
+  assert(major_is_marksweep() || !los->move_object);
 
   int64 pause_time = time_now() - gc_start_time;
   gc->time_collections += pause_time;
   
-  if(MAJOR_ALGO != MAJOR_MARK_SWEEP){ /* adaptations here */
+  if(!major_is_marksweep()){ /* adaptations here */
     
-    if(gc_match_kind((GC*)gc, MAJOR_COLLECTION))
+    if(collect_is_major())
       gc_gen_adjust_heap_size(gc);  /* adjust committed GC heap size */
       
     gc_gen_adapt(gc, pause_time); /* 1. decide next collection kind; 2. adjust nos_boundary */
@@ -944,24 +937,24 @@
     <<"\nGC: GC id: GC["<<gc->num_collections<<"]"
     <<"\nGC: current collection num: "<<gc->num_collections);
 
-  switch(gc->collect_kind) {
-  case MINOR_COLLECTION:
+  if( collect_is_minor()) {
     INFO2("gc.collect","GC: collection type: minor");
 #ifdef GC_GEN_STATS
     INFO2("gc.collect","GC: current minor collection num: "<<gc->stats->num_minor_collections);
 #endif
-    break;
-  case NORMAL_MAJOR_COLLECTION:
+  }else if( collect_is_major_normal() ){
     INFO2("gc.collect","GC: collection type: normal major");
 #ifdef GC_GEN_STATS
     INFO2("gc.collect","GC: current normal major collection num: "<<gc->stats->num_major_collections);
 #endif
-    break;
-  case FALLBACK_COLLECTION:
+
+  }else if( collect_is_fallback() ){
     INFO2("gc.collect","GC: collection type: fallback");
 #ifdef GC_GEN_STATS
     INFO2("gc.collect","GC: current fallback collection num: "<<gc->stats->num_fallback_collections);
 #endif
+  }else{
+    assert(0);  
   }
 
   switch(gc->cause) {
@@ -973,6 +966,9 @@
     break;
   case GC_CAUSE_RUNTIME_FORCE_GC:
     INFO2("gc.collect","GC: collection cause: runtime force gc");
+    break;
+  default:
+    assert(0);
   }
 
   INFO2("gc.collect","GC: pause time: "<<(pause_time>>10)<<"ms"
@@ -987,7 +983,7 @@
     <<"\nGC: LOS size: "<<verbose_print_size(gc->los->committed_heap_size)<<", free size:"<<verbose_print_size(lspace_free_memory_size((Lspace*)gc->los))
     <<"\nGC: MOS size: "<<verbose_print_size(gc->mos->committed_heap_size)<<", free size:"<<verbose_print_size(blocked_space_free_mem_size((Blocked_Space*)gc->mos)) << "\n");
 
-  if(MINOR_ALGO == MINOR_NONGEN_SEMISPACE_POOL || MINOR_ALGO == MINOR_GEN_SEMISPACE_POOL){
+  if(minor_is_semispace()){
     INFO2("gc.space", 
     	"GC: NOS size: "<<verbose_print_size(gc->nos->committed_heap_size)
     	<<", tospace size:"<<verbose_print_size(sspace_tospace_size((Sspace*)gc->nos))
@@ -1008,10 +1004,10 @@
     <<"\ninitial num collectors: "<<gc->num_collectors
     <<"\ninitial nos size: "<<verbose_print_size(gc->nos->committed_heap_size)
     <<"\nnos collection algo: "
-    <<((gc->nos->collect_algorithm==MINOR_NONGEN_SEMISPACE_POOL || gc->nos->collect_algorithm==MINOR_GEN_SEMISPACE_POOL)?"semi space":"partial forward")
+    <<(minor_is_semispace()?"semi space":"partial forward")
     <<"\ninitial mos size: "<<verbose_print_size(gc->mos->committed_heap_size)
     <<"\nmos collection algo: "
-    <<((gc->mos->collect_algorithm==MAJOR_COMPACT_MOVE)?"move compact":"slide compact")
+    <<(major_is_compact_move()?"move compact":"slide compact")
     <<"\ninitial los size: "<<verbose_print_size(gc->los->committed_heap_size)<<"\n");
 }
 
@@ -1035,14 +1031,14 @@
 /* init collector alloc_space */
 void gc_gen_init_collector_alloc(GC_Gen* gc, Collector* collector)
 {
-  if(MAJOR_ALGO == MAJOR_MARK_SWEEP){
+  if(major_is_marksweep()){
     allocator_init_local_chunks((Allocator*)collector);
     gc_init_collector_free_chunk_list(collector);
   }
 
   Allocator* allocator = (Allocator*)collector;
   
-  if( MINOR_ALGO == MINOR_NONGEN_SEMISPACE_POOL || MINOR_ALGO == MINOR_GEN_SEMISPACE_POOL){
+  if( minor_is_semispace()){
     allocator->alloc_space = gc->nos; 
     /* init backup allocator */
     unsigned int size = sizeof(Allocator);
@@ -1057,14 +1053,14 @@
 void gc_gen_reset_collector_alloc(GC_Gen* gc, Collector* collector)
 {
   alloc_context_reset((Allocator*)collector);
-  if( MINOR_ALGO == MINOR_NONGEN_SEMISPACE_POOL || MINOR_ALGO == MINOR_GEN_SEMISPACE_POOL){
+  if( minor_is_semispace()){
     alloc_context_reset(collector->backup_allocator);
   }      
 }
 
 void gc_gen_destruct_collector_alloc(GC_Gen* gc, Collector* collector)
 {
-  if( MINOR_ALGO == MINOR_NONGEN_SEMISPACE_POOL || MINOR_ALGO == MINOR_GEN_SEMISPACE_POOL){
+  if( minor_is_semispace()){
     STD_FREE(collector->backup_allocator);  
   }
 }

Modified: harmony/enhanced/drlvm/trunk/vm/gc_gen/src/gen/gen.h
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/gc_gen/src/gen/gen.h?rev=637062&r1=637061&r2=637062&view=diff
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/gc_gen/src/gen/gen.h (original)
+++ harmony/enhanced/drlvm/trunk/vm/gc_gen/src/gen/gen.h Fri Mar 14 04:21:27 2008
@@ -33,33 +33,7 @@
 struct GC_Gen_Stats;
 #endif
 
-extern Boolean gen_mode;
-
-inline Boolean gc_is_gen_mode()
-{  return gen_mode; }
-
-inline void gc_enable_gen_mode()
-{  
-  gen_mode = TRUE;
-  gc_set_barrier_function(WRITE_BARRIER_REM_SOURCE_REF);
-  HelperClass_set_GenMode(TRUE);
-}
-
-inline void gc_disable_gen_mode()
-{  
-  gen_mode = FALSE; 
-  gc_set_barrier_function(WRITE_BARRIER_REM_NIL);
-  HelperClass_set_GenMode(FALSE);
-}
-
-inline void gc_set_gen_mode(Boolean status)
-{
-  gen_mode = status; 
-  if(gen_mode) 
-    gc_set_barrier_function(WRITE_BARRIER_REM_SOURCE_REF);
-  HelperClass_set_GenMode(status);   
-}
-
+void gc_set_gen_mode(Boolean status);
 
 /* some globals */
 extern POINTER_SIZE_INT NOS_SIZE;
@@ -145,7 +119,7 @@
   Space *mos;
   Space *los;
       
-  Boolean force_major_collect;
+  Boolean next_collect_force_major;
   Gen_Mode_Adaptor* gen_mode_adaptor;
   Boolean force_gen_mode;
 
@@ -164,16 +138,6 @@
 void gc_gen_init_verbose(GC_Gen *gc);
 void gc_gen_wrapup_verbose(GC_Gen* gc);
                         
-inline POINTER_SIZE_INT gc_gen_free_memory_size(GC_Gen* gc)
-{  return blocked_space_free_mem_size((Blocked_Space*)gc->nos) +
-          blocked_space_free_mem_size((Blocked_Space*)gc->mos) +
-          lspace_free_memory_size((Lspace*)gc->los);  }
-                    
-inline POINTER_SIZE_INT gc_gen_total_memory_size(GC_Gen* gc)
-{  return space_committed_size((Space*)gc->nos) +
-          space_committed_size((Space*)gc->mos) +
-          lspace_committed_size((Lspace*)gc->los);  }
-
 /////////////////////////////////////////////////////////////////////////////////////////
 
 void gc_nos_initialize(GC_Gen *gc, void *start, POINTER_SIZE_INT nos_size, POINTER_SIZE_INT commit_size);
@@ -204,9 +168,8 @@
 void gc_set_mos(GC_Gen* gc, Space* mos);
 void gc_set_los(GC_Gen* gc, Space* los);
 
-void gc_decide_collection_algorithm(GC_Gen* gc, char* minor_algo, char* major_algo);
-void gc_decide_collection_kind(GC_Gen* gc, unsigned int cause);
-unsigned int gc_next_collection_kind(GC_Gen* gc);
+GC* gc_gen_decide_collection_algo(char* minor_algo, char* major_algo, Boolean has_los);
+void gc_gen_decide_collection_kind(GC_Gen* gc, unsigned int cause);
 
 void gc_gen_adapt(GC_Gen* gc, int64 pause_time);
 
@@ -235,11 +198,23 @@
 POINTER_SIZE_INT mos_used_space_size(Space* mos);
 POINTER_SIZE_INT nos_used_space_size(Space* nos);
 
+inline POINTER_SIZE_INT gc_gen_free_memory_size(GC_Gen* gc)
+{  return nos_free_space_size((Space*)gc->nos) +
+          blocked_space_free_mem_size((Blocked_Space*)gc->mos) +
+          lspace_free_memory_size((Lspace*)gc->los);  }
+                    
+inline POINTER_SIZE_INT gc_gen_total_memory_size(GC_Gen* gc)
+{  return space_committed_size((Space*)gc->nos) +
+          space_committed_size((Space*)gc->mos) +
+          lspace_committed_size((Lspace*)gc->los);  }
+
 #ifndef STATIC_NOS_MAPPING
 void* nos_space_adjust(Space* space, void* new_nos_boundary, POINTER_SIZE_INT new_nos_size);
 #endif
 
 #endif /* ifndef _GC_GEN_H_ */
+
+
 
 
 

Modified: harmony/enhanced/drlvm/trunk/vm/gc_gen/src/gen/gen_adapt.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/gc_gen/src/gen/gen_adapt.cpp?rev=637062&r1=637061&r2=637062&view=diff
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/gc_gen/src/gen/gen_adapt.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/gc_gen/src/gen/gen_adapt.cpp Fri Mar 14 04:21:27 2008
@@ -103,14 +103,14 @@
   POINTER_SIZE_INT nos_free_size = blocked_space_free_mem_size(nos);
   POINTER_SIZE_INT total_free_size = mos_free_size  + nos_free_size;
   
-  if(gc_match_kind((GC*)gc, MAJOR_COLLECTION)) {
+  if(collect_is_major()) {
     assert(!gc_is_gen_mode());
     
     if(gen_mode_adaptor->major_survive_ratio_threshold != 0 && mos->survive_ratio > gen_mode_adaptor->major_survive_ratio_threshold){    
       if(gen_mode_adaptor->major_repeat_count > MAX_MAJOR_REPEAT_COUNT ){
         gc->force_gen_mode = TRUE;
-        gc_enable_gen_mode();
-        gc->force_major_collect = FALSE;
+        gc_set_gen_mode(TRUE);
+        gc->next_collect_force_major = FALSE;
         return;
       }else{
         gen_mode_adaptor->major_repeat_count++;
@@ -121,7 +121,7 @@
     
   }else{
     /*compute throughput*/
-    if(gc->last_collect_kind != MINOR_COLLECTION){
+    if(!collect_last_is_minor((GC*)gc)){
       gen_mode_adaptor->nongen_minor_throughput = 1.0f;
     }
     if(gc->force_gen_mode){
@@ -141,7 +141,7 @@
    }
 
     if(gen_mode_adaptor->nongen_minor_throughput <=  gen_mode_adaptor->gen_minor_throughput ){
-      if( gc->last_collect_kind != MINOR_COLLECTION ){
+      if( !collect_last_is_minor((GC*)gc) ){
         gen_mode_adaptor->major_survive_ratio_threshold = mos->survive_ratio;
       }else if( !gc->force_gen_mode ){
         gc->force_gen_mode = TRUE;
@@ -149,18 +149,18 @@
       } 
     }
 
-    if(gc->force_major_collect && !gc->force_gen_mode){
-        gc->force_major_collect = FALSE;
+    if(gc->next_collect_force_major && !gc->force_gen_mode){
+        gc->next_collect_force_major = FALSE;
         gc->force_gen_mode = TRUE;
         gen_mode_adaptor->gen_mode_trial_count = 2;
-    }else if(gc->last_collect_kind != MINOR_COLLECTION && gc->force_gen_mode){
+    }else if( collect_last_is_minor((GC*)gc) && gc->force_gen_mode){
        gen_mode_adaptor->gen_mode_trial_count = MAX_INT32;
     }
 
     if(gc->force_gen_mode && (total_free_size <= ((float)min_nos_size_bytes) * 1.3 )){
         gc->force_gen_mode = FALSE;
-        gc_disable_gen_mode();
-        gc->force_major_collect = TRUE;
+        gc_set_gen_mode(FALSE);
+        gc->next_collect_force_major = TRUE;
         gen_mode_adaptor->gen_mode_trial_count = 0;
         return;
     }
@@ -170,17 +170,17 @@
 
       gen_mode_adaptor->gen_mode_trial_count --;
       if( gen_mode_adaptor->gen_mode_trial_count >= 0){
-        gc_enable_gen_mode();
+        gc_set_gen_mode(TRUE);
         return;
       }
           
       gc->force_gen_mode = FALSE;
-      gc->force_major_collect = TRUE;    
+      gc->next_collect_force_major = TRUE;    
       gen_mode_adaptor->gen_mode_trial_count = 0;
     }
   }
   
-  gc_disable_gen_mode();
+  gc_set_gen_mode(FALSE);
   return;
 }
 
@@ -206,31 +206,35 @@
   POINTER_SIZE_INT nos_free_size = space_committed_size(nos);  
 
   POINTER_SIZE_INT total_free_size = mos_free_size  + nos_free_size;
-  if(gc_match_kind((GC*)gc, MAJOR_COLLECTION)) gc->force_gen_mode = FALSE;
+  if(collect_is_major()) gc->force_gen_mode = FALSE;
   if(!gc->force_gen_mode){
     /*Major collection:*/
-    if(gc_match_kind((GC*)gc, MAJOR_COLLECTION)){
+    if(collect_is_major()){
       mos->time_collections += pause_time;
   
       Tslow = (float)pause_time;
       SMax = total_free_size;
       /*If fall back happens, and nos_boundary reaches heap_ceiling, then we force major.*/
       if( nos_free_size == 0)
-        gc->force_major_collect = TRUE;
-      else gc->force_major_collect = FALSE;
+        gc->next_collect_force_major = TRUE;
+      else gc->next_collect_force_major = FALSE;
       
-      /*If major is caused by LOS, or collection kind is EXTEND_COLLECTION, all survive ratio is not updated.*/
-      if((gc->cause != GC_CAUSE_LOS_IS_FULL) && (!gc_match_kind((GC*)gc, EXTEND_COLLECTION))){
+      /*If major is caused by LOS, or collection kind is ALGO_MAJOR_EXTEND, all survive ratio is not updated.*/
+      extern Boolean mos_extended;
+      if((gc->cause != GC_CAUSE_LOS_IS_FULL) && !mos_extended ){
         survive_ratio = (float)mos->period_surviving_size/(float)mos->committed_heap_size;
         mos->survive_ratio = survive_ratio;
       }
+      /* why do I set it FALSE here? because here is the only place where it's used. */
+      mos_extended = FALSE;
+      
       /*If there is no minor collection at all, we must give mos expected threshold a reasonable value.*/
       if((gc->tuner->kind != TRANS_NOTHING) && (nos->num_collections == 0))
         mspace_set_expected_threshold_ratio((Mspace *)mos, 0.5f);
       /*If this major is caused by fall back compaction, we must give nos->survive_ratio 
         *a conservative and reasonable number to avoid next fall back.
         *In fallback compaction, the survive_ratio of mos must be 1.*/
-      if(gc_match_kind((GC*)gc, FALLBACK_COLLECTION)) nos->survive_ratio = 1;
+      if(collect_is_fallback()) nos->survive_ratio = 1;
 
     }
     /*Minor collection:*/    
@@ -250,7 +254,7 @@
       POINTER_SIZE_INT minor_surviving_size = last_total_free_size - total_free_size;
       /*If the first GC is caused by LOS, mos->last_alloced_size should be smaller than this minor_surviving_size
         *Because the last_total_free_size is not accurate.*/
-      extern unsigned int MINOR_ALGO;
+
       if(nos->num_collections != 1){
       	assert(minor_surviving_size == mos->last_alloced_size);
       }
@@ -267,8 +271,8 @@
       /* FIXME: if the total free size is lesser than threshold, the time point might be too late!
        * Have a try to test whether the backup solution is better for specjbb.
        */
-      //   if ((mos_free_size + nos_free_size + minor_surviving_size) < free_size_threshold) gc->force_major_collect = TRUE;  
-      if ((mos_free_size + nos_free_size)< free_size_threshold) gc->force_major_collect = TRUE;
+      //   if ((mos_free_size + nos_free_size + minor_surviving_size) < free_size_threshold) gc->next_collect_force_major = TRUE;  
+      if ((mos_free_size + nos_free_size)< free_size_threshold) gc->next_collect_force_major = TRUE;
   
       survive_ratio = (float)minor_surviving_size/(float)space_committed_size((Space*)nos);
       nos->survive_ratio = survive_ratio;
@@ -314,7 +318,7 @@
     total_size = max_heap_size_bytes - space_committed_size(los);
 #else
     POINTER_SIZE_INT curr_heap_commit_end = 
-                              (POINTER_SIZE_INT)gc->heap_start + LOS_HEAD_RESERVE_FOR_HEAP_NULL + gc->committed_heap_size;
+                              (POINTER_SIZE_INT)gc->heap_start + LOS_HEAD_RESERVE_FOR_HEAP_BASE + gc->committed_heap_size;
     assert(curr_heap_commit_end > (POINTER_SIZE_INT)mos->heap_start);
     total_size = curr_heap_commit_end - (POINTER_SIZE_INT)mos->heap_start;
 #endif
@@ -408,7 +412,7 @@
 
   /* below are ajustment */  
   POINTER_SIZE_INT curr_heap_commit_end = 
-                             (POINTER_SIZE_INT)gc->heap_start + LOS_HEAD_RESERVE_FOR_HEAP_NULL + gc->committed_heap_size;
+                             (POINTER_SIZE_INT)gc->heap_start + LOS_HEAD_RESERVE_FOR_HEAP_BASE + gc->committed_heap_size;
   
   void* new_nos_boundary = (void*)(curr_heap_commit_end - new_nos_size);
 

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=637062&r1=637061&r2=637062&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 Fri Mar 14 04:21:27 2008
@@ -43,7 +43,7 @@
 {
   GC_Gen_Stats* stats = gc->stats;
 
-  if(gc_match_kind((GC*)gc, MINOR_COLLECTION)){
+  if(collect_is_minor()){
     stats->nos_surviving_obj_num_minor = 0;
     stats->nos_surviving_obj_size_minor = 0;
     stats->los_suviving_obj_num = 0;
@@ -65,7 +65,7 @@
   GC_Gen_Collector_Stats* collector_stats;
   Boolean is_los_collected = gc_gen_stats->is_los_collected;
 
-  if(gc_match_kind((GC*)gc, MINOR_COLLECTION)) {
+  if(collect_is_minor()) {
 
     for (unsigned int i=0; i<gc->num_active_collectors; i++) {
       collector_stats = (GC_Gen_Collector_Stats*)collector[i]->stats;
@@ -101,15 +101,16 @@
 {
   GC_Gen_Stats* stats = gc->stats;
   Boolean is_los_collected = stats->is_los_collected;
-  if (gc_match_kind((GC*)gc, MINOR_COLLECTION)){
-    TRACE2("gc.space", "GC: Fspace Collection stats: "
-      <<"\nGC: collection algo: "<<((stats->nos_collection_algo_minor==MINOR_NONGEN_FORWARD_POOL)?"nongen forward":"gen forward")
-      <<"\nGC: num surviving objs: "<<stats->nos_surviving_obj_num_minor
-      <<"\nGC: size surviving objs: "<<verbose_print_size(stats->nos_surviving_obj_size_minor)
-      <<"\nGC: surviving ratio: "<<(int)(stats->nos_surviving_ratio_minor*100)<<"%\n");
+  if (collect_is_minor()){
+    TRACE2("gc.space", "GC: NOS Collection stats: "
+      <<"\nGC: " << (gc_is_gen_mode()?"generational":"nongenerational")
+      <<"\nGC: collection algo: " << (minor_is_semispace()?"semi-space":"partial-forward")
+      <<"\nGC: num surviving objs: " << stats->nos_surviving_obj_num_minor
+      <<"\nGC: size surviving objs: " << verbose_print_size(stats->nos_surviving_obj_size_minor)
+      <<"\nGC: surviving ratio: " << (int)(stats->nos_surviving_ratio_minor*100) << "%\n");
   }else{
-    TRACE2("gc.space", "GC: Mspace Collection stats: "
-      <<"\nGC: collection algo: "<<((stats->nos_mos_collection_algo_major==MAJOR_COMPACT_SLIDE)?"slide compact":"move compact")
+    TRACE2("gc.space", "GC: MOS Collection stats: "
+      <<"\nGC: collection algo: " << (major_is_marksweep()?"mark-sweep":"slide compact")
       <<"\nGC: num surviving objs: "<<stats->nos_mos_suviving_obj_num_major
       <<"\nGC: size surviving objs: "<<verbose_print_size(stats->nos_mos_suviving_obj_size_major)
       <<"\nGC: surviving ratio: "<<(int)(stats->nos_mos_suviving_ratio_major*100)<<"%\n");
@@ -117,7 +118,7 @@
 
   if(stats->is_los_collected) { /*if los is collected, need to output los related info*/
     TRACE2("gc.space", "GC: Lspace Collection stats: "
-      <<"\nGC: collection algo: "<<((stats->los_collection_algo==MAJOR_COMPACT_SLIDE)?"slide compact":"mark sweep")
+      <<"\nGC: collection algo: "<<(collect_is_major()?"slide compact":"mark sweep")
       <<"\nGC: num surviving objs: "<<stats->los_suviving_obj_num
       <<"\nGC: size surviving objs: "<<verbose_print_size(stats->los_suviving_obj_size)
       <<"\nGC: surviving ratio: "<<(int)(stats->los_surviving_ratio*100)<<"%\n");

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=637062&r1=637061&r2=637062&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 Fri Mar 14 04:21:27 2008
@@ -24,9 +24,9 @@
 #ifndef STATIC_NOS_MAPPING
 void* nos_space_adjust(Space* nos, void* new_nos_boundary, POINTER_SIZE_INT new_nos_size)
 {
-  if(nos->collect_algorithm == MINOR_NONGEN_SEMISPACE_POOL || nos->collect_algorithm == MINOR_GEN_SEMISPACE_POOL)
+  if(minor_is_semispace())
     return sspace_heap_start_adjust((Sspace*)nos, new_nos_boundary, new_nos_size);
-  else if( nos->collect_algorithm == MINOR_NONGEN_FORWARD_POOL || nos->collect_algorithm == MINOR_GEN_FORWARD_POOL )
+  else if(minor_is_forward())
     return fspace_heap_start_adjust((Fspace*)nos, new_nos_boundary, new_nos_size);  
   
   assert(0);
@@ -37,7 +37,7 @@
 POINTER_SIZE_INT mos_free_space_size(Space* mos)
 {
   POINTER_SIZE_INT free_size = 0;
-  if( mos->collect_algorithm != MAJOR_MARK_SWEEP )
+  if( !major_is_marksweep())
     return mspace_free_space_size((Mspace*)mos);
 
   assert(0);
@@ -47,9 +47,9 @@
 POINTER_SIZE_INT nos_free_space_size(Space* nos)
 {
   POINTER_SIZE_INT free_size = 0;
-  if(nos->collect_algorithm == MINOR_NONGEN_SEMISPACE_POOL || nos->collect_algorithm == MINOR_GEN_SEMISPACE_POOL)
+  if(minor_is_semispace())
     return sspace_free_space_size((Sspace*)nos);
-  else if( nos->collect_algorithm == MINOR_NONGEN_FORWARD_POOL || nos->collect_algorithm == MINOR_GEN_FORWARD_POOL)
+  else if( minor_is_forward())
     return fspace_free_space_size((Fspace*)nos);
 
   assert(0);
@@ -60,7 +60,7 @@
 POINTER_SIZE_INT mos_used_space_size(Space* mos)
 {
   POINTER_SIZE_INT free_size = 0;
-  if( mos->collect_algorithm != MAJOR_MARK_SWEEP )
+  if( !major_is_marksweep() )
     return mspace_used_space_size((Mspace*)mos);
 
   assert(0);
@@ -70,9 +70,9 @@
 POINTER_SIZE_INT nos_used_space_size(Space* nos)
 {
   POINTER_SIZE_INT free_size = 0;
-  if(nos->collect_algorithm == MINOR_NONGEN_SEMISPACE_POOL || nos->collect_algorithm == MINOR_GEN_SEMISPACE_POOL)
+  if(minor_is_semispace())
     return sspace_used_space_size((Sspace*)nos);
-  else if( nos->collect_algorithm == MINOR_NONGEN_FORWARD_POOL || nos->collect_algorithm == MINOR_GEN_FORWARD_POOL)
+  else if( minor_is_forward())
     return fspace_used_space_size((Fspace*)nos);
 
   assert(0);

Modified: harmony/enhanced/drlvm/trunk/vm/gc_gen/src/jni/java_natives.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/gc_gen/src/jni/java_natives.cpp?rev=637062&r1=637061&r2=637062&view=diff
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/gc_gen/src/jni/java_natives.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/gc_gen/src/jni/java_natives.cpp Fri Mar 14 04:21:27 2008
@@ -116,7 +116,7 @@
 
 JNIEXPORT jint JNICALL Java_org_apache_harmony_drlvm_gc_1gen_GCHelper_getLargeObjectSize(JNIEnv *, jclass) 
 {
-   return (jint) GC_OBJ_SIZE_THRESHOLD;
+   return (jint) GC_LOS_OBJ_SIZE_THRESHOLD;
 }
 
 #ifdef __cplusplus

Modified: harmony/enhanced/drlvm/trunk/vm/gc_gen/src/jni/java_support.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/gc_gen/src/jni/java_support.cpp?rev=637062&r1=637061&r2=637062&view=diff
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/gc_gen/src/jni/java_support.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/gc_gen/src/jni/java_support.cpp Fri Mar 14 04:21:27 2008
@@ -50,10 +50,10 @@
   
   //"org.apache.harmony.drlvm.gc_gen.GCHelper" 
   jclass GCHelper = jni_env->FindClass("GCHelper");
-  jfieldID gen_mode = jni_env->GetStaticFieldID(GCHelper, "GEN_MODE", "Z");
-  assert(gen_mode);
+  jfieldID gen_mode_field = jni_env->GetStaticFieldID(GCHelper, "GEN_MODE", "Z");
+  assert(gen_mode_field);
   
-  jni_env->SetStaticBooleanField(GCHelper, gen_mode, status?JNI_TRUE:JNI_FALSE);
+  jni_env->SetStaticBooleanField(GCHelper, gen_mode_field, status?JNI_TRUE:JNI_FALSE);
   
   hythread_suspend_disable();
 */  

Modified: harmony/enhanced/drlvm/trunk/vm/gc_gen/src/los/free_area_pool.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/gc_gen/src/los/free_area_pool.cpp?rev=637062&r1=637061&r2=637062&view=diff
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/gc_gen/src/los/free_area_pool.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/gc_gen/src/los/free_area_pool.cpp Fri Mar 14 04:21:27 2008
@@ -41,7 +41,7 @@
 
 Free_Area* free_pool_find_size_area(Free_Area_Pool* pool, POINTER_SIZE_INT size)
 {
-  assert(size >= GC_OBJ_SIZE_THRESHOLD);
+  assert(size >= GC_LOS_OBJ_SIZE_THRESHOLD);
   
   size = ALIGN_UP_TO_KILO(size);
   unsigned int index = pool_list_index_with_size(size);

Modified: harmony/enhanced/drlvm/trunk/vm/gc_gen/src/los/free_area_pool.h
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/gc_gen/src/los/free_area_pool.h?rev=637062&r1=637061&r2=637062&view=diff
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/gc_gen/src/los/free_area_pool.h (original)
+++ harmony/enhanced/drlvm/trunk/vm/gc_gen/src/los/free_area_pool.h Fri Mar 14 04:21:27 2008
@@ -61,7 +61,7 @@
   area->next = area->prev = (Bidir_List*)area;
   area->size = size;
   
-  if( size < GC_OBJ_SIZE_THRESHOLD) return NULL;
+  if( size < GC_LOS_OBJ_SIZE_THRESHOLD) return NULL;
   else return area;
 }
 
@@ -92,7 +92,7 @@
 
 inline unsigned int pool_list_index_with_size(POINTER_SIZE_INT size)
 {
-  assert(size >= GC_OBJ_SIZE_THRESHOLD);
+  assert(size >= GC_LOS_OBJ_SIZE_THRESHOLD);
   
   unsigned int index;
   index = (unsigned int) (size >> BIT_SHIFT_TO_KILO);
@@ -102,7 +102,7 @@
 
 inline Free_Area* free_pool_add_area(Free_Area_Pool* pool, Free_Area* free_area)
 {
-  assert( free_area->size >= GC_OBJ_SIZE_THRESHOLD);
+  assert( free_area->size >= GC_LOS_OBJ_SIZE_THRESHOLD);
   
   unsigned int index = pool_list_index_with_size(free_area->size);
   bidir_list_add_item((Bidir_List*)&(pool->sized_area_list[index]), (Bidir_List*)free_area);

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=637062&r1=637061&r2=637062&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 Fri Mar 14 04:21:27 2008
@@ -42,10 +42,10 @@
     vm_commit_mem(reserved_base, lspace_size);
   memset(reserved_base, 0, lspace_size);
 
-  min_los_size_bytes -= LOS_HEAD_RESERVE_FOR_HEAP_NULL;
-  lspace->committed_heap_size = committed_size - LOS_HEAD_RESERVE_FOR_HEAP_NULL;
-  lspace->reserved_heap_size = gc->reserved_heap_size - min_none_los_size_bytes - LOS_HEAD_RESERVE_FOR_HEAP_NULL;
-  lspace->heap_start = (void*)((POINTER_SIZE_INT)reserved_base + LOS_HEAD_RESERVE_FOR_HEAP_NULL);
+  min_los_size_bytes -= LOS_HEAD_RESERVE_FOR_HEAP_BASE;
+  lspace->committed_heap_size = committed_size - LOS_HEAD_RESERVE_FOR_HEAP_BASE;
+  lspace->reserved_heap_size = gc->reserved_heap_size - min_none_los_size_bytes - LOS_HEAD_RESERVE_FOR_HEAP_BASE;
+  lspace->heap_start = (void*)((POINTER_SIZE_INT)reserved_base + LOS_HEAD_RESERVE_FOR_HEAP_BASE);
   lspace->heap_end = (void *)((POINTER_SIZE_INT)reserved_base + committed_size);
 
   lspace->gc = gc;
@@ -130,4 +130,6 @@
 {
   return lspace->failure_size;
 }
+
+
 

Modified: harmony/enhanced/drlvm/trunk/vm/gc_gen/src/los/lspace.h
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/gc_gen/src/los/lspace.h?rev=637062&r1=637061&r2=637062&view=diff
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/gc_gen/src/los/lspace.h (original)
+++ harmony/enhanced/drlvm/trunk/vm/gc_gen/src/los/lspace.h Fri Mar 14 04:21:27 2008
@@ -29,11 +29,11 @@
 #include "../common/hashcode.h"
 #endif
 
-/*Fixme: This macro is for handling HEAP_NULL issues caused by JIT OPT*/
+/*Fixme: This macro is for handling HEAP_BASE issues caused by JIT OPT*/
 #ifdef COMPRESS_REFERENCE
-  #define LOS_HEAD_RESERVE_FOR_HEAP_NULL ( SPACE_ALLOC_UNIT )
+  #define LOS_HEAD_RESERVE_FOR_HEAP_BASE ( SPACE_ALLOC_UNIT )
 #else
-  #define LOS_HEAD_RESERVE_FOR_HEAP_NULL ( 0*KB )
+  #define LOS_HEAD_RESERVE_FOR_HEAP_BASE ( 0*KB )
 #endif
 
 typedef struct Lspace{

Modified: harmony/enhanced/drlvm/trunk/vm/gc_gen/src/los/lspace_alloc_collect.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/gc_gen/src/los/lspace_alloc_collect.cpp?rev=637062&r1=637061&r2=637062&view=diff
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/gc_gen/src/los/lspace_alloc_collect.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/gc_gen/src/los/lspace_alloc_collect.cpp Fri Mar 14 04:21:27 2008
@@ -66,7 +66,7 @@
     /*if the list head is not NULL, it definitely satisfies the request. */   
     remain_size = free_area->size - alloc_size;
     assert(remain_size >= 0);
-    if( remain_size >= GC_OBJ_SIZE_THRESHOLD){
+    if( remain_size >= GC_LOS_OBJ_SIZE_THRESHOLD){
         new_list_nr = pool_list_index_with_size(remain_size);
         p_result = (void*)((POINTER_SIZE_INT)free_area + remain_size);
         if(new_list_nr == list_hint){
@@ -89,7 +89,7 @@
         free_pool_unlock_nr_list(pool, list_hint);
         p_result = (void*)((POINTER_SIZE_INT)free_area + remain_size);
         if(remain_size > 0){
-            assert((remain_size >= KB) && (remain_size < GC_OBJ_SIZE_THRESHOLD));
+            assert((remain_size >= KB) && (remain_size < GC_LOS_OBJ_SIZE_THRESHOLD));
             free_area->size = remain_size;
         }
         return p_result;
@@ -118,7 +118,7 @@
     free_area = (Free_Area*)(head->next);
     while(  free_area != (Free_Area*)head ){
         remain_size = free_area->size - alloc_size;
-        if( remain_size >= GC_OBJ_SIZE_THRESHOLD){
+        if( remain_size >= GC_LOS_OBJ_SIZE_THRESHOLD){
             new_list_nr = pool_list_index_with_size(remain_size);
             p_result = (void*)((POINTER_SIZE_INT)free_area + remain_size);
             if(new_list_nr == MAX_LIST_INDEX){
@@ -141,7 +141,7 @@
             free_pool_unlock_nr_list(pool, MAX_LIST_INDEX);
             p_result = (void*)((POINTER_SIZE_INT)free_area + remain_size);
             if(remain_size > 0){
-                assert((remain_size >= KB) && (remain_size < GC_OBJ_SIZE_THRESHOLD));
+                assert((remain_size >= KB) && (remain_size < GC_LOS_OBJ_SIZE_THRESHOLD));
                 free_area->size = remain_size;
             }
             return p_result;
@@ -343,7 +343,7 @@
         assert(!(tuner->tuning_size % GC_BLOCK_SIZE_BYTES));
         new_fa_size = (POINTER_SIZE_INT)lspace->scompact_fa_end - (POINTER_SIZE_INT)lspace->scompact_fa_start + tuner->tuning_size;
         Free_Area* fa = free_area_new(lspace->scompact_fa_start,  new_fa_size);
-        if(new_fa_size >= GC_OBJ_SIZE_THRESHOLD) free_pool_add_area(lspace->free_pool, fa);
+        if(new_fa_size >= GC_LOS_OBJ_SIZE_THRESHOLD) free_pool_add_area(lspace->free_pool, fa);
         lspace->committed_heap_size += trans_size;
         break;
       }
@@ -358,7 +358,7 @@
         assert((POINTER_SIZE_INT)lspace->scompact_fa_end > (POINTER_SIZE_INT)lspace->scompact_fa_start + tuner->tuning_size);
         new_fa_size = (POINTER_SIZE_INT)lspace->scompact_fa_end - (POINTER_SIZE_INT)lspace->scompact_fa_start - tuner->tuning_size;
         Free_Area* fa = free_area_new(lspace->scompact_fa_start,  new_fa_size);
-        if(new_fa_size >= GC_OBJ_SIZE_THRESHOLD) free_pool_add_area(lspace->free_pool, fa);
+        if(new_fa_size >= GC_LOS_OBJ_SIZE_THRESHOLD) free_pool_add_area(lspace->free_pool, fa);
         break;
       }
       default:{
@@ -368,7 +368,7 @@
         new_fa_size = (POINTER_SIZE_INT)lspace->scompact_fa_end - (POINTER_SIZE_INT)lspace->scompact_fa_start;
         if(new_fa_size == 0) break;
         Free_Area* fa = free_area_new(lspace->scompact_fa_start,  new_fa_size);
-        if(new_fa_size >= GC_OBJ_SIZE_THRESHOLD) free_pool_add_area(lspace->free_pool, fa);
+        if(new_fa_size >= GC_LOS_OBJ_SIZE_THRESHOLD) free_pool_add_area(lspace->free_pool, fa);
         break;
       }
     }
@@ -479,5 +479,7 @@
   TRACE2("gc.process", "GC: end of lspace sweep algo ...\n");
   return;
 }
+
+
 
 

Modified: harmony/enhanced/drlvm/trunk/vm/gc_gen/src/mark_compact/fallback_mark_scan.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/gc_gen/src/mark_compact/fallback_mark_scan.cpp?rev=637062&r1=637061&r2=637062&view=diff
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/gc_gen/src/mark_compact/fallback_mark_scan.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/gc_gen/src/mark_compact/fallback_mark_scan.cpp Fri Mar 14 04:21:27 2008
@@ -120,7 +120,7 @@
   GC_Gen_Collector_Stats* stats = (GC_Gen_Collector_Stats*)collector->stats;
 #endif
   
-  assert(gc_match_kind(gc, FALLBACK_COLLECTION));
+  assert(collect_is_fallback());
 
   /* reset the num_finished_collectors to be 0 by one collector. This is necessary for the barrier later. */
   unsigned int num_active_collectors = gc->num_active_collectors;
@@ -138,7 +138,7 @@
       REF *p_ref = (REF *)*iter;
       iter = vector_block_iterator_advance(root_set,iter);
 
-      /* 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_ref);
       
       collector_tracestack_push(collector, p_ref);
@@ -210,7 +210,7 @@
   GC* gc = collector->gc;
   Blocked_Space* space = (Blocked_Space*)((GC_Gen*)gc)->nos;
 
-  assert(gc_match_kind(gc, FALLBACK_COLLECTION));
+  assert(collect_is_fallback());
 
   unsigned int num_active_collectors = gc->num_active_collectors;
   atomic_cas32( &num_finished_collectors, 0, num_active_collectors);
@@ -251,6 +251,8 @@
     
 }
 #endif
+
+
 
 
 

Modified: harmony/enhanced/drlvm/trunk/vm/gc_gen/src/mark_compact/mspace_alloc.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/gc_gen/src/mark_compact/mspace_alloc.cpp?rev=637062&r1=637061&r2=637062&view=diff
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/gc_gen/src/mark_compact/mspace_alloc.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/gc_gen/src/mark_compact/mspace_alloc.cpp Fri Mar 14 04:21:27 2008
@@ -55,7 +55,7 @@
    
   /* All chunks of data requested need to be multiples of GC_OBJECT_ALIGNMENT */
   assert((size % GC_OBJECT_ALIGNMENT) == 0);
-  assert( size <= GC_OBJ_SIZE_THRESHOLD );
+  assert( size <= GC_LOS_OBJ_SIZE_THRESHOLD );
 
   /* check if collector local alloc block is ok. If not, grab a new block */
   p_return = thread_local_alloc(size, allocator);
@@ -71,5 +71,7 @@
     
   return p_return;
 }
+
+
 
 

Modified: harmony/enhanced/drlvm/trunk/vm/gc_gen/src/mark_compact/mspace_collect_compact.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/gc_gen/src/mark_compact/mspace_collect_compact.cpp?rev=637062&r1=637061&r2=637062&view=diff
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/gc_gen/src/mark_compact/mspace_collect_compact.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/gc_gen/src/mark_compact/mspace_collect_compact.cpp Fri Mar 14 04:21:27 2008
@@ -22,8 +22,6 @@
 #include "mspace_collect_compact.h"
 
 
-Boolean IS_MOVE_COMPACT;
-
 struct GC_Gen;
 Space* gc_get_nos(GC_Gen* gc);
 
@@ -267,69 +265,35 @@
 
   pool_iterator_init(gc->metadata->gc_rootset_pool);
 
-  /* dual mark bits will consume two bits in obj info, that makes current 
-     header hashbits only 5 bits. That's not enough. We implement on-demend
-     hash field allocation in obj during moving. move_compact doesn't support it.
-     Dual mark bits is used for MINOR_NONGEN_FORWARD algorithm */
-
   //For_LOS_extend
   if(gc->tuner->kind != TRANS_NOTHING){
+    major_set_compact_slide();
+  }else if (collect_is_fallback()){
+    major_set_compact_slide();
+  }else{
+    major_set_compact_move();    
+  }
 
+  if(major_is_compact_slide()){
+  
     TRACE2("gc.process", "GC: slide compact algo start ... \n");
     collector_execute_task(gc, (TaskType)slide_compact_mspace, (Space*)mspace);
     TRACE2("gc.process", "\nGC: end of slide compact algo ... \n");
-
-#ifdef GC_GEN_STATS
-    gc_gen_stats_set_mos_algo((GC_Gen*)gc, MAJOR_COMPACT_SLIDE);
-#endif
-
-  }else if (gc_match_kind(gc, FALLBACK_COLLECTION)){
-
-    TRACE2("gc.process", "GC: slide compact algo start ... \n");
-    collector_execute_task(gc, (TaskType)slide_compact_mspace, (Space*)mspace);  
-    TRACE2("gc.process", "\nGC: end of slide compact algo ... \n");
-
-#ifdef GC_GEN_STATS
-    gc_gen_stats_set_los_collected_flag((GC_Gen*)gc, true);
-    gc_gen_stats_set_mos_algo((GC_Gen*)gc, MAJOR_COMPACT_SLIDE);
-#endif
-    //IS_MOVE_COMPACT = TRUE;
-    //collector_execute_task(gc, (TaskType)move_compact_mspace, (Space*)mspace);
-    //IS_MOVE_COMPACT = FALSE;
-  }else{
-
-    switch(mspace->collect_algorithm){
-      case MAJOR_COMPACT_SLIDE:
-        TRACE2("gc.process", "GC: slide compact algo start ... \n");
-        collector_execute_task(gc, (TaskType)slide_compact_mspace, (Space*)mspace);
-        TRACE2("gc.process", "\nGC: end of slide compact algo ... \n");
-#ifdef GC_GEN_STATS
-        gc_gen_stats_set_los_collected_flag((GC_Gen*)gc, true);
-        gc_gen_stats_set_mos_algo((GC_Gen*)gc, MAJOR_COMPACT_SLIDE);
-#endif
-        break;
-        
-      case MAJOR_COMPACT_MOVE:
-        IS_MOVE_COMPACT = TRUE;
-        
-        TRACE2("gc.process", "GC: move compact algo start ... \n");
-        collector_execute_task(gc, (TaskType)move_compact_mspace, (Space*)mspace);
-        TRACE2("gc.process", "\nGC: end of move compact algo ... \n");
-        IS_MOVE_COMPACT = FALSE;
-#ifdef GC_GEN_STATS
-        gc_gen_stats_set_mos_algo((GC_Gen*)gc, MAJOR_COMPACT_MOVE);
-#endif
-        break;
   
-      default:
-        DIE2("gc.collect", "The speficied major collection algorithm doesn't exist!");
-        exit(0);
-        break;
-    }
+  }else if( major_is_compact_move()){      
+    
+    TRACE2("gc.process", "GC: move compact algo start ... \n");
+    collector_execute_task(gc, (TaskType)move_compact_mspace, (Space*)mspace);
+    TRACE2("gc.process", "\nGC: end of move compact algo ... \n");
 
-  }  
+  }else{
+    DIE2("gc.collect", "The speficied major collection algorithm doesn't exist!");
+    exit(0);
+  }
 
   return;  
 } 
+
+
 
 

Modified: harmony/enhanced/drlvm/trunk/vm/gc_gen/src/mark_compact/mspace_collect_compact.h
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/gc_gen/src/mark_compact/mspace_collect_compact.h?rev=637062&r1=637061&r2=637062&view=diff
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/gc_gen/src/mark_compact/mspace_collect_compact.h (original)
+++ harmony/enhanced/drlvm/trunk/vm/gc_gen/src/mark_compact/mspace_collect_compact.h Fri Mar 14 04:21:27 2008
@@ -49,9 +49,9 @@
 void fallback_clear_fwd_obj_oi_init(Collector* collector);
 #endif
 
-extern Boolean IS_MOVE_COMPACT;
-
 #endif /* _MSPACE_COLLECT_COMPACT_H_ */
+
+
 
 
 

Modified: harmony/enhanced/drlvm/trunk/vm/gc_gen/src/mark_compact/mspace_extend_compact.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/gc_gen/src/mark_compact/mspace_extend_compact.cpp?rev=637062&r1=637061&r2=637062&view=diff
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/gc_gen/src/mark_compact/mspace_extend_compact.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/gc_gen/src/mark_compact/mspace_extend_compact.cpp Fri Mar 14 04:21:27 2008
@@ -27,6 +27,8 @@
 static volatile Block *nos_first_free_block = NULL;
 static volatile Block *first_block_to_move = NULL;
 
+Boolean mos_extended = FALSE;
+
 static void set_first_and_end_block_to_move(Collector *collector, unsigned int mem_changed_size)
 {
   GC_Gen *gc_gen = (GC_Gen *)collector->gc;
@@ -205,7 +207,7 @@
 static void gc_reupdate_repointed_sets(GC* gc, Pool* pool, void *start_address, void *end_address, unsigned int addr_diff)
 {
   GC_Metadata *metadata = gc->metadata;
-  assert(gc_match_kind(gc, EXTEND_COLLECTION));
+  assert(mos_extended);
   
   pool_iterator_init(pool);
 
@@ -227,8 +229,8 @@
   GC *gc = collector->gc;  
   GC_Metadata *metadata = gc->metadata;
 
-  /* only for MAJOR_COLLECTION and FALLBACK_COLLECTION */
-  assert(gc_match_kind(gc, EXTEND_COLLECTION));
+  /* only for ALGO_MAJOR and ALGO_MAJOR_FALLBACK */
+  assert(mos_extended);
   
   gc_reupdate_repointed_sets(gc, metadata->gc_rootset_pool, start_address, end_address, addr_diff);
 
@@ -272,8 +274,8 @@
   Blocked_Space *mspace = (Blocked_Space *)gc_gen->mos;
   Blocked_Space *nspace = (Blocked_Space *)gc_gen->nos;
 
-  /*For_LOS adaptive: when doing EXTEND_COLLECTION, mspace->survive_ratio should not be updated in gc_decide_next_collect( )*/
-  gc_gen->collect_kind |= EXTEND_COLLECTION;
+  /*For_LOS adaptive: when doing ALGO_MAJOR_EXTEND, mspace->survive_ratio should not be updated in gc_decide_next_collect( )*/
+  mos_extended = TRUE;
   
   unsigned int num_active_collectors = gc_gen->num_active_collectors;
   unsigned int old_num;
@@ -319,8 +321,8 @@
   Fspace *nspace = gc_gen->nos;
   Lspace *lspace = gc_gen->los;
 
-  /*For_LOS adaptive: when doing EXTEND_COLLECTION, mspace->survive_ratio should not be updated in gc_decide_next_collect( )*/
-  gc_gen->collect_kind |= EXTEND_COLLECTION;
+  /*For_LOS adaptive: when doing ALGO_MAJOR_EXTEND, mspace->survive_ratio should not be updated in gc_decide_next_collect()*/
+  mos_extended = TRUE;
   
   unsigned int num_active_collectors = gc_gen->num_active_collectors;
   unsigned int old_num;

Modified: harmony/enhanced/drlvm/trunk/vm/gc_gen/src/mark_compact/mspace_move_compact.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/gc_gen/src/mark_compact/mspace_move_compact.cpp?rev=637062&r1=637061&r2=637062&view=diff
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/gc_gen/src/mark_compact/mspace_move_compact.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/gc_gen/src/mark_compact/mspace_move_compact.cpp Fri Mar 14 04:21:27 2008
@@ -46,7 +46,7 @@
   Block_Header *local_last_dest = dest_block;
 
   void* dest_sector_addr = dest_block->base;
-  Boolean is_fallback = gc_match_kind(collector->gc, FALLBACK_COLLECTION);
+  Boolean is_fallback = collect_is_fallback();
   
 #ifdef USE_32BITS_HASHCODE
   Hashcode_Buf* old_hashcode_buf = NULL;
@@ -83,10 +83,9 @@
     void* src_sector_addr = p_obj;
           
     while( p_obj ){
-
       debug_num_live_obj++;
       assert( obj_is_marked_in_vt(p_obj));
-      /* we don't check if it's set, since only remaining objs from last NOS partial collection need it. */
+      /* we don't check if it's set, since only non-forwarded objs from last NOS partial-forward collection need it. */
       obj_clear_dual_bits_in_oi(p_obj); 
 
 #ifdef GC_GEN_STATS
@@ -125,7 +124,7 @@
         
       assert(((POINTER_SIZE_INT)dest_sector_addr + curr_sector_size) <= block_end );
 
-      /* check if current sector has no more sector. If not, loop back. FIXME:: we should add a condition for block check */      
+      /* check if next live object is out of current sector. If not, loop back to continue within this sector. FIXME:: we should add a condition for block check (?) */      
       p_obj =  block_get_next_marked_object(curr_block, &start_pos);
       if ((p_obj != NULL) && (OBJECT_INDEX_TO_OFFSET_TABLE(p_obj) == curr_sector))
         continue;
@@ -133,7 +132,7 @@
       /* current sector is done, let's move it. */
       POINTER_SIZE_INT sector_distance = (POINTER_SIZE_INT)src_sector_addr - (POINTER_SIZE_INT)dest_sector_addr;
       assert((sector_distance % GC_OBJECT_ALIGNMENT) == 0);
-      /* if sector_distance is zero, we don't do anything. But since block stable is never cleaned, we have to set 0 to it. */
+      /* if sector_distance is zero, we don't do anything. But since block offset table is never cleaned, we have to set 0 to it. */
       curr_block->table[curr_sector] = sector_distance;
 
       if(sector_distance != 0) 
@@ -203,7 +202,7 @@
 
   unsigned int old_num = atomic_cas32( &num_marking_collectors, 0, num_active_collectors+1);
 
-  if(!gc_match_kind(gc, FALLBACK_COLLECTION))
+  if(!collect_is_fallback())
        mark_scan_heap(collector);  
   else
        mark_scan_heap_for_fallback(collector);

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=637062&r1=637061&r2=637062&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 Fri Mar 14 04:21:27 2008
@@ -158,7 +158,7 @@
 {
   Block_Header *curr_block = blocked_space_block_iterator_next((Blocked_Space*)mspace);
   
-  /* for MAJOR_COLLECTION, we must iterate over all compact blocks */
+  /* for ALGO_MAJOR, we must iterate over all compact blocks */
   while( curr_block){
     block_fix_ref_after_repointing(curr_block); 
     curr_block = blocked_space_block_iterator_next((Blocked_Space*)mspace);
@@ -420,7 +420,7 @@
 
   unsigned int old_num = atomic_cas32( &num_marking_collectors, 0, num_active_collectors+1);
 
-  if(gc_match_kind(gc, FALLBACK_COLLECTION))
+  if(collect_is_fallback())
     mark_scan_heap_for_fallback(collector);
   else if(gc->tuner->kind != TRANS_NOTHING)
     mark_scan_heap_for_space_tune(collector);
@@ -447,7 +447,7 @@
     gc_init_block_for_collectors(gc, mspace);
     
 #ifdef USE_32BITS_HASHCODE
-    if(gc_match_kind(gc, FALLBACK_COLLECTION))
+    if(collect_is_fallback())
       fallback_clear_fwd_obj_oi_init(collector);
 #endif
 
@@ -465,7 +465,7 @@
   atomic_cas32( &num_repointing_collectors, 0, num_active_collectors+1);
 
 #ifdef USE_32BITS_HASHCODE
-  if(gc_match_kind(gc, FALLBACK_COLLECTION))
+  if(collect_is_fallback())
     fallback_clear_fwd_obj_oi(collector);
 #endif
   mspace_compute_object_target(collector, mspace);

Modified: harmony/enhanced/drlvm/trunk/vm/gc_gen/src/mark_compact/space_tune_mark_scan.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/gc_gen/src/mark_compact/space_tune_mark_scan.cpp?rev=637062&r1=637061&r2=637062&view=diff
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/gc_gen/src/mark_compact/space_tune_mark_scan.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/gc_gen/src/mark_compact/space_tune_mark_scan.cpp Fri Mar 14 04:21:27 2008
@@ -155,7 +155,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/mark_sweep/gc_ms.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/gc_gen/src/mark_sweep/gc_ms.cpp?rev=637062&r1=637061&r2=637062&view=diff
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/gc_gen/src/mark_sweep/gc_ms.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/gc_gen/src/mark_sweep/gc_ms.cpp Fri Mar 14 04:21:27 2008
@@ -17,8 +17,6 @@
 
 #include "../common/gc_common.h"
 
-#ifdef USE_MARK_SWEEP_GC
-
 #include "gc_ms.h"
 #include "wspace_mark_sweep.h"
 #include "../finalizer_weakref/finalizer_weakref.h"
@@ -29,6 +27,13 @@
 #include "../common/hashcode.h"
 #endif
 
+GC* gc_ms_create()
+{
+  GC* gc = (GC*)STD_MALLOC(sizeof(GC_MS));  
+  assert(gc);
+  memset(gc, 0, sizeof(GC_MS));
+  return gc;
+}
 
 void gc_ms_initialize(GC_MS *gc_ms, POINTER_SIZE_INT min_heap_size, POINTER_SIZE_INT max_heap_size)
 {
@@ -43,7 +48,7 @@
   wspace_base = vm_reserve_mem(0, max_heap_size);
   wspace_initialize((GC*)gc_ms, wspace_base, max_heap_size, max_heap_size);
   
-  HEAP_NULL = (POINTER_SIZE_INT)wspace_base;
+  HEAP_BASE = (POINTER_SIZE_INT)wspace_base;
   
   gc_ms->heap_start = wspace_base;
   gc_ms->heap_end = (void*)((POINTER_SIZE_INT)wspace_base + max_heap_size);
@@ -138,7 +143,8 @@
 void gc_ms_update_space_statistics(GC_MS* gc)
 {
   POINTER_SIZE_INT num_live_obj = 0;
-  POINTER_SIZE_INT size_live_obj = 0;
+  POINTER_SIZE_INT size_live_obj = 0;  
+  POINTER_SIZE_INT new_obj_size = 0;
   
   Space_Statistics* wspace_stat = gc->wspace->space_statistic;
 
@@ -151,14 +157,33 @@
     size_live_obj += collector->live_obj_size;
   }
 
+  lock(gc->mutator_list_lock);
+  Mutator* mutator = gc->mutator_list;
+  while (mutator) {
+    new_obj_size += mutator->new_obj_size;
+    mutator->new_obj_size = 0;
+    mutator = mutator->next;
+  }  
+  unlock(gc->mutator_list_lock);
+
+  wspace_stat->size_new_obj += new_obj_size;
+  
   wspace_stat->num_live_obj = num_live_obj;
   wspace_stat->size_live_obj = size_live_obj;  
   wspace_stat->last_size_free_space = wspace_stat->size_free_space;
-  wspace_stat->size_free_space = gc->committed_heap_size - size_live_obj;/*TODO:inaccurate value.*/
+  wspace_stat->size_free_space = gc->committed_heap_size - size_live_obj;/*TODO:inaccurate value.*/  
+  wspace_stat->space_utilization_ratio = (float)wspace_stat->size_new_obj / wspace_stat->last_size_free_space;;
 }
 
-void gc_ms_iterate_heap(GC_MS *gc)
+void gc_ms_reset_space_statistics(GC_MS* gc)
 {
+  Space_Statistics* wspace_stat = gc->wspace->space_statistic;
+  wspace_stat->size_new_obj = 0;
+  wspace_stat->num_live_obj = 0;
+  wspace_stat->size_live_obj = 0;
+  wspace_stat->space_utilization_ratio = 0;
 }
 
-#endif // USE_MARK_SWEEP_GC
+void gc_ms_iterate_heap(GC_MS *gc)
+{
+}

Modified: harmony/enhanced/drlvm/trunk/vm/gc_gen/src/mark_sweep/gc_ms.h
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/gc_gen/src/mark_sweep/gc_ms.h?rev=637062&r1=637061&r2=637062&view=diff
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/gc_gen/src/mark_sweep/gc_ms.h (original)
+++ harmony/enhanced/drlvm/trunk/vm/gc_gen/src/mark_sweep/gc_ms.h Fri Mar 14 04:21:27 2008
@@ -18,8 +18,6 @@
 #ifndef _GC_MS_H_
 #define _GC_MS_H_
 
-#ifdef USE_MARK_SWEEP_GC
-
 #include "wspace.h"
 
 
@@ -123,9 +121,6 @@
 void gc_ms_start_concurrent_sweep(GC_MS* gc, unsigned int num_collectors);
 void gc_ms_start_most_concurrent_mark(GC_MS* gc, unsigned int num_markers);
 void gc_ms_start_final_mark_after_concurrent(GC_MS* gc, unsigned int num_markers);
-
-
-
-#endif // USE_MARK_SWEEP_GC
+void gc_ms_reset_space_statistics(GC_MS* gc);
 
 #endif // _GC_MS_H_