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 2007/12/26 11:17:15 UTC
svn commit: r606876 [6/6] - in /harmony/enhanced/drlvm/trunk/vm/gc_gen/src:
common/ finalizer_weakref/ gen/ jni/ los/ mark_compact/ mark_sweep/
semi_space/ thread/ trace_forward/ utils/ verify/
Modified: harmony/enhanced/drlvm/trunk/vm/gc_gen/src/thread/mutator.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/gc_gen/src/thread/mutator.cpp?rev=606876&r1=606875&r2=606876&view=diff
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/gc_gen/src/thread/mutator.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/gc_gen/src/thread/mutator.cpp Wed Dec 26 02:17:10 2007
@@ -21,7 +21,7 @@
#include "mutator.h"
#include "../trace_forward/fspace.h"
-#include "../mark_sweep/sspace.h"
+#include "../mark_sweep/wspace.h"
#include "../finalizer_weakref/finalizer_weakref.h"
struct GC_Gen;
@@ -38,7 +38,7 @@
mutator->rem_set = free_set_pool_get_entry(gc->metadata);
assert(vector_block_is_empty(mutator->rem_set));
}
- mutator->dirty_obj_snapshot = free_set_pool_get_entry(gc->metadata);
+ mutator->dirty_set = free_set_pool_get_entry(gc->metadata);
if(!IGNORE_FINREF )
mutator->obj_with_fin = finref_get_free_block(gc);
@@ -69,12 +69,13 @@
alloc_context_reset((Allocator*)mutator);
-#ifdef USE_MARK_SWEEP_GC
- allocactor_destruct_local_chunks((Allocator*)mutator);
-#endif
lock(gc->mutator_list_lock); // vvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
+#ifdef USE_MARK_SWEEP_GC
+ allocactor_destruct_local_chunks((Allocator*)mutator);
+#endif
+
volatile Mutator *temp = gc->mutator_list;
if (temp == mutator) { /* it is at the head of the list */
gc->mutator_list = temp->next;
@@ -99,13 +100,16 @@
mutator->obj_with_fin = NULL;
}
- if( mutator->dirty_obj_snapshot != NULL){
- if(vector_block_is_empty(mutator->dirty_obj_snapshot))
- pool_put_entry(gc->metadata->free_set_pool, mutator->dirty_obj_snapshot);
- else /* FIXME:: this condition may be released. */
- pool_put_entry(gc->metadata->dirty_obj_snaptshot_pool, mutator->dirty_obj_snapshot);
+ lock(mutator->dirty_set_lock);
+ if( mutator->dirty_set != NULL){
+ if(vector_block_is_empty(mutator->dirty_set))
+ pool_put_entry(gc->metadata->free_set_pool, mutator->dirty_set);
+ else{ /* FIXME:: this condition may be released. */
+ pool_put_entry(gc->metadata->gc_dirty_set_pool, mutator->dirty_set);
+ mutator->dirty_set = NULL;
+ }
}
-
+ unlock(mutator->dirty_set_lock);
//gc_set_tls(NULL);
return;
@@ -132,32 +136,14 @@
return;
}
-/*
-Boolean gc_local_snapshot_is_empty(GC* gc)
+Boolean gc_local_dirtyset_is_empty(GC* gc)
{
lock(gc->mutator_list_lock);
Mutator *mutator = gc->mutator_list;
while (mutator) {
- if(mutator->concurrent_mark_handshake_status != LOCAL_SNAPSHOT_CONTAINER_IS_EMPTY){
- unlock(gc->mutator_list_lock);
- return FALSE;
- }
- mutator = mutator->next;
- }
-
- unlock(gc->mutator_list_lock);
- return TRUE;
-}*/
-
-Boolean gc_local_snapshot_is_empty(GC* gc)
-{
- lock(gc->mutator_list_lock);
-
- Mutator *mutator = gc->mutator_list;
- while (mutator) {
- Vector_Block* local_snapshot_set = mutator->dirty_obj_snapshot;
- if(!vector_block_is_empty(local_snapshot_set)){
+ Vector_Block* local_dirty_set = mutator->dirty_set;
+ if(!vector_block_is_empty(local_dirty_set)){
unlock(gc->mutator_list_lock);
return FALSE;
}
@@ -168,16 +154,16 @@
return TRUE;
}
-Vector_Block* gc_get_local_snapshot(GC* gc, unsigned int shared_id)
+Vector_Block* gc_get_local_dirty_set(GC* gc, unsigned int shared_id)
{
lock(gc->mutator_list_lock);
Mutator *mutator = gc->mutator_list;
while (mutator) {
- Vector_Block* local_snapshot = mutator->dirty_obj_snapshot;
- if(!vector_block_is_empty(local_snapshot) && vector_block_set_shared(local_snapshot,shared_id)){
+ Vector_Block* local_dirty_set = mutator->dirty_set;
+ if(!vector_block_is_empty(local_dirty_set) && vector_block_set_shared(local_dirty_set,shared_id)){
unlock(gc->mutator_list_lock);
- return local_snapshot;
+ return local_dirty_set;
}
mutator = mutator->next;
}
@@ -185,5 +171,7 @@
unlock(gc->mutator_list_lock);
return NULL;
}
+
+
Modified: harmony/enhanced/drlvm/trunk/vm/gc_gen/src/thread/mutator.h
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/gc_gen/src/thread/mutator.h?rev=606876&r1=606875&r2=606876&view=diff
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/gc_gen/src/thread/mutator.h (original)
+++ harmony/enhanced/drlvm/trunk/vm/gc_gen/src/thread/mutator.h Wed Dec 26 02:17:10 2007
@@ -37,12 +37,17 @@
Space* alloc_space;
GC* gc;
VmThreadHandle thread_handle; /* This thread; */
+ volatile unsigned int handshake_signal; /*Handshake is used in concurrent GC.*/
+
/* END of Allocator --> */
Vector_Block* rem_set;
Vector_Block* obj_with_fin;
Mutator* next; /* The gc info area associated with the next active thread. */
- Vector_Block* dirty_obj_snapshot;
+ Vector_Block* dirty_set;
+ SpinLock dirty_set_lock;
+ unsigned int dirty_obj_slot_num; //only ON_THE_FLY
+ unsigned int dirty_obj_num; //concurrent mark
} Mutator;
void mutator_initialize(GC* gc, void* tls_gc_info);
@@ -52,6 +57,19 @@
void gc_reset_mutator_context(GC* gc);
void gc_prepare_mutator_remset(GC* gc);
-Boolean gc_local_snapshot_is_empty(GC* gc);
-Vector_Block* gc_get_local_snapshot(GC* gc, unsigned int shared_id);
+Boolean gc_local_dirtyset_is_empty(GC* gc);
+Vector_Block* gc_get_local_dirty_set(GC* gc, unsigned int shared_id);
+
+inline void mutator_post_signal(Mutator* mutator, unsigned int handshake_signal)
+{
+ //FIXME: Need barrier here.
+ //apr_memory_rw_barrier();
+ mutator->handshake_signal = handshake_signal;
+ //apr_memory_rw_barrier();
+}
+
+inline void wait_mutator_signal(Mutator* mutator, unsigned int handshake_signal)
+{ while(mutator->handshake_signal == handshake_signal); }
+
+
#endif /*ifndef _MUTATOR_H_ */
Modified: harmony/enhanced/drlvm/trunk/vm/gc_gen/src/thread/mutator_alloc.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/gc_gen/src/thread/mutator_alloc.cpp?rev=606876&r1=606875&r2=606876&view=diff
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/gc_gen/src/thread/mutator_alloc.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/gc_gen/src/thread/mutator_alloc.cpp Wed Dec 26 02:17:10 2007
@@ -30,6 +30,8 @@
//#define GC_OBJ_SIZE_STATISTIC
+volatile Boolean obj_alloced_live = FALSE;
+
#ifdef GC_OBJ_SIZE_STATISTIC
#define GC_OBJ_SIZE_STA_MAX 256*KB
unsigned int obj_size_distribution_map[GC_OBJ_SIZE_STA_MAX>>10];
@@ -68,7 +70,7 @@
size = (size & NEXT_TO_HIGH_BIT_CLEAR_MASK);
Allocator* allocator = (Allocator*)gc_get_tls();
- Boolean type_has_fin = type_has_finalizer((Partial_Reveal_VTable*)uncompress_vt((VT)ah));
+ Boolean type_has_fin = type_has_finalizer((Partial_Reveal_VTable*)decode_vt((VT)ah));
if(type_has_fin && !IGNORE_FINREF && mutator_need_block)
vm_heavy_finalizer_block_mutator();
@@ -77,7 +79,11 @@
gc_alloc_statistic_obj_distrubution(size);
#endif
-#ifndef USE_MARK_SWEEP_GC
+#if defined(USE_MARK_SWEEP_GC)
+ p_obj = (Managed_Object_Handle)gc_ms_alloc(size, allocator);
+#elif defined(USE_UNIQUE_MOVE_COMPACT_GC)
+ p_obj = (Managed_Object_Handle)gc_mc_alloc(size, allocator);
+#else
if ( size > GC_OBJ_SIZE_THRESHOLD ){
p_obj = (Managed_Object_Handle)los_alloc(size, allocator);
#ifdef GC_GEN_STATS
@@ -90,8 +96,6 @@
}else{
p_obj = (Managed_Object_Handle)nos_alloc(size, allocator);
}
-#else
- p_obj = (Managed_Object_Handle)gc_ms_alloc(size, allocator);
#endif
if( p_obj == NULL )
@@ -114,7 +118,7 @@
assert((size % GC_OBJECT_ALIGNMENT) == 0);
assert(ah);
- if(type_has_finalizer((Partial_Reveal_VTable *) uncompress_vt((VT)ah)))
+ if(type_has_finalizer((Partial_Reveal_VTable *) decode_vt((VT)ah)))
return NULL;
#ifdef GC_OBJ_SIZE_STATISTIC
@@ -128,10 +132,12 @@
/* Try to allocate an object from the current Thread Local Block */
Managed_Object_Handle p_obj;
-#ifndef USE_MARK_SWEEP_GC
- p_obj = (Managed_Object_Handle)thread_local_alloc(size, allocator);
-#else
+#if defined(USE_MARK_SWEEP_GC)
p_obj = (Managed_Object_Handle)gc_ms_fast_alloc(size, allocator);
+#elif defined(USE_UNIQUE_MOVE_COMPACT_GC)
+ p_obj = (Managed_Object_Handle)gc_mc_fast_alloc(size, allocator);
+#else
+ p_obj = (Managed_Object_Handle)thread_local_alloc(size, allocator);
#endif
if(p_obj == NULL) return NULL;
Modified: harmony/enhanced/drlvm/trunk/vm/gc_gen/src/trace_forward/fspace.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/gc_gen/src/trace_forward/fspace.cpp?rev=606876&r1=606875&r2=606876&view=diff
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/gc_gen/src/trace_forward/fspace.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/gc_gen/src/trace_forward/fspace.cpp Wed Dec 26 02:17:10 2007
@@ -27,14 +27,6 @@
Boolean forward_first_half;
void* object_forwarding_boundary=NULL;
-static void fspace_destruct_blocks(Fspace* fspace)
-{
-#ifdef USE_32BITS_HASHCODE
- space_desturct_blocks((Blocked_Space*)fspace);
-#endif
- return;
-}
-
struct GC_Gen;
void gc_set_nos(GC_Gen* gc, Space* space);
@@ -101,7 +93,10 @@
void fspace_destruct(Fspace *fspace)
{
- fspace_destruct_blocks(fspace);
+#ifdef USE_32BITS_HASHCODE
+ space_desturct_blocks((Blocked_Space*)fspace);
+#endif
+
STD_FREE(fspace);
}
@@ -119,7 +114,7 @@
fspace->free_block_idx = first_idx;
fspace->ceiling_block_idx = first_idx + fspace->num_managed_blocks - 1;
forward_first_half = TRUE; /* only useful for not-FORWARD_ALL*/
- fspace->num_used_blocks = 0;
+ fspace->num_used_blocks = 0;
}else{
if(forward_first_half){
@@ -163,31 +158,6 @@
return;
}
-
-#ifdef USE_32BITS_HASHCODE
-Block_Header* fspace_next_block;
-
-void fspace_block_iterate_init(Fspace* fspace)
-{
- fspace_next_block = (Block_Header*) fspace->blocks;
-}
-
-Block_Header* fspace_get_next_block()
-{
- Block_Header* curr_block = (Block_Header*) fspace_next_block;
- while(fspace_next_block != NULL){
- Block_Header* next_block = curr_block->next;
-
- Block_Header* temp = (Block_Header*)atomic_casptr((volatile void**)&fspace_next_block, next_block, curr_block);
- if(temp != curr_block){
- curr_block = (Block_Header*) fspace_next_block;
- continue;
- }
- return curr_block;
- }
- return NULL;
-}
-#endif
void collector_execute_task(GC* gc, TaskType task_func, Space* space);
Modified: harmony/enhanced/drlvm/trunk/vm/gc_gen/src/trace_forward/fspace.h
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/gc_gen/src/trace_forward/fspace.h?rev=606876&r1=606875&r2=606876&view=diff
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/gc_gen/src/trace_forward/fspace.h (original)
+++ harmony/enhanced/drlvm/trunk/vm/gc_gen/src/trace_forward/fspace.h Wed Dec 26 02:17:10 2007
@@ -40,6 +40,7 @@
void fspace_destruct(Fspace *fspace);
void* fspace_alloc(unsigned size, Allocator *allocator);
+Boolean fspace_alloc_block(Fspace* fspace, Allocator* allocator);
void fspace_reset_after_collection(Fspace* fspace);
@@ -59,8 +60,4 @@
void fspace_collection(Fspace* fspace);
-#ifdef USE_32BITS_HASHCODE
-void fspace_block_iterate_init(Fspace* fspace);
-Block_Header* fspace_get_next_block();
-#endif
#endif // _FROM_SPACE_H_
Modified: harmony/enhanced/drlvm/trunk/vm/gc_gen/src/trace_forward/fspace_alloc.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/gc_gen/src/trace_forward/fspace_alloc.cpp?rev=606876&r1=606875&r2=606876&view=diff
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/gc_gen/src/trace_forward/fspace_alloc.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/gc_gen/src/trace_forward/fspace_alloc.cpp Wed Dec 26 02:17:10 2007
@@ -23,7 +23,7 @@
#include "../common/gc_concurrent.h"
#include "../common/collection_scheduler.h"
-static Boolean fspace_alloc_block(Fspace* fspace, Allocator* allocator)
+Boolean fspace_alloc_block(Fspace* fspace, Allocator* allocator)
{
alloc_context_reset(allocator);
@@ -61,8 +61,8 @@
p_return = thread_local_alloc(size, allocator);
if (p_return) return p_return;
- if(gc_need_start_concurrent_mark(allocator->gc))
- gc_start_concurrent_mark(allocator->gc);
+ gc_try_schedule_collection(allocator->gc, GC_CAUSE_NIL);
+
/* ran out local block, grab a new one*/
Fspace* fspace = (Fspace*)allocator->alloc_space;
int attempts = 0;
@@ -97,4 +97,6 @@
return p_return;
}
+
+
Modified: harmony/enhanced/drlvm/trunk/vm/gc_gen/src/trace_forward/fspace_gen_forward_pool.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/gc_gen/src/trace_forward/fspace_gen_forward_pool.cpp?rev=606876&r1=606875&r2=606876&view=diff
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/gc_gen/src/trace_forward/fspace_gen_forward_pool.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/gc_gen/src/trace_forward/fspace_gen_forward_pool.cpp Wed Dec 26 02:17:10 2007
@@ -52,8 +52,8 @@
static FORCE_INLINE void scan_object(Collector* collector, Partial_Reveal_Object *p_obj)
{
assert((((POINTER_SIZE_INT)p_obj) % GC_OBJECT_ALIGNMENT) == 0);
- Partial_Reveal_VTable *vtable = uncompress_vt(obj_get_vt(p_obj));
- if(VTABLE_TRACING)
+ Partial_Reveal_VTable *vtable = decode_vt(obj_get_vt(p_obj));
+ if(TRACE_JLC_VIA_VTABLE)
if(vtable->vtmark == VT_UNMARKED) {
vtable->vtmark = VT_MARKED;
trace_forwarded_gen_jlC_from_vtable(collector, vtable->jlC);
Modified: harmony/enhanced/drlvm/trunk/vm/gc_gen/src/trace_forward/fspace_nongen_forward_pool.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/gc_gen/src/trace_forward/fspace_nongen_forward_pool.cpp?rev=606876&r1=606875&r2=606876&view=diff
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/gc_gen/src/trace_forward/fspace_nongen_forward_pool.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/gc_gen/src/trace_forward/fspace_nongen_forward_pool.cpp Wed Dec 26 02:17:10 2007
@@ -40,16 +40,21 @@
return;
}
-void trace_forwarded_nongen_jlC_from_vtable(Collector* collector, Partial_Reveal_Object *p_obj) ;
+/* forward declaration */
+static void forward_jlc_instance(Collector* collector, Partial_Reveal_Object *p_obj);
+
static FORCE_INLINE void scan_object(Collector* collector, Partial_Reveal_Object *p_obj)
{
assert((((POINTER_SIZE_INT)p_obj) % GC_OBJECT_ALIGNMENT) == 0);
- Partial_Reveal_VTable *vtable = uncompress_vt(obj_get_vt(p_obj));
- if(VTABLE_TRACING)
+
+ Partial_Reveal_VTable *vtable = decode_vt(obj_get_vt(p_obj));
+ if(TRACE_JLC_VIA_VTABLE){
if(vtable->vtmark == VT_UNMARKED) {
vtable->vtmark = VT_MARKED;
- trace_forwarded_nongen_jlC_from_vtable(collector, vtable->jlC);
+ forward_jlc_instance(collector, vtable->jlC);
}
+ }
+
if (!object_has_ref_field_before_scan(p_obj)) return;
REF *p_ref;
@@ -142,9 +147,13 @@
return;
}
-void trace_forwarded_nongen_jlC_from_vtable(Collector* collector, Partial_Reveal_Object *p_obj)
-//Forward the vtable->jlc and trace the forwarded object. But do not update the vtable->jlc but leave them for weakroots updating
-//We probably do not need this function if we do not perform class unloading in copy-collections. That means all vtable->jlc would be strong roots in this algorithm
+/*
+ Forward the vtable->jlc and trace the forwarded object.
+ But do not update the vtable->jlc but leave them for weakroots updating
+ We probably do not need this function if we do not perform class unloading in minor collections.
+ That means all the weakroots to jlc instances are treated as strong roots.
+*/
+static void forward_jlc_instance(Collector* collector, Partial_Reveal_Object *p_obj)
{
if(!obj_belongs_to_nos(p_obj)){
if(obj_mark_in_oi(p_obj))
@@ -157,7 +166,7 @@
if( p_target_obj == NULL ){
if(collector->result == FALSE ){
vector_stack_clear(collector->trace_stack);
- return;
+ return; /* FIXME: the failure result is not propagated back to GC */
}
assert(obj_get_fw_in_oi(p_obj));
return;
Added: harmony/enhanced/drlvm/trunk/vm/gc_gen/src/trace_forward/sspace_temp.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/gc_gen/src/trace_forward/sspace_temp.cpp?rev=606876&view=auto
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/gc_gen/src/trace_forward/sspace_temp.cpp (added)
+++ harmony/enhanced/drlvm/trunk/vm/gc_gen/src/trace_forward/sspace_temp.cpp Wed Dec 26 02:17:10 2007
@@ -0,0 +1,14 @@
+/* this file is temporarily existent for developing semi-space algorithm */
+#include "../semi_space/sspace.h"
+
+Sspace *sspace_initialize(GC* gc, void* start, POINTER_SIZE_INT sspace_size, POINTER_SIZE_INT commit_size){return null;}
+void sspace_destruct(Sspace *sspace){ return;}
+
+void* sspace_alloc(unsigned size, Allocator *allocator){return NULL;}
+void* semispace_alloc(unsigned size, Allocator *allocator){return NULL;}
+
+Boolean sspace_alloc_block(Sspace* sspace, Allocator* allocator){return FALSE;}
+
+void sspace_collection(Sspace* sspace){return;}
+void sspace_reset_after_collection(Sspace* sspace){return;}
+void sspace_prepare_for_collection(Sspace* sspace){return;}
Propchange: harmony/enhanced/drlvm/trunk/vm/gc_gen/src/trace_forward/sspace_temp.cpp
------------------------------------------------------------------------------
svn:eol-style = native
Modified: harmony/enhanced/drlvm/trunk/vm/gc_gen/src/utils/vector_block.h
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/gc_gen/src/utils/vector_block.h?rev=606876&r1=606875&r2=606876&view=diff
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/gc_gen/src/utils/vector_block.h (original)
+++ harmony/enhanced/drlvm/trunk/vm/gc_gen/src/utils/vector_block.h Wed Dec 26 02:17:10 2007
@@ -88,6 +88,20 @@
#endif
return value;
}
+inline void vector_block_add_entry_to_index(Vector_Block* block, unsigned int index, POINTER_SIZE_INT value)
+{
+#ifdef _DEBUG
+ assert(index < VECTOR_BLOCK_ENTRY_NUM);
+#endif
+ block->entries[index] = value;
+}
+inline POINTER_SIZE_INT vector_block_get_entry_from_index(Vector_Block* block, unsigned int index)
+{
+#ifdef _DEBUG
+ assert(index < VECTOR_BLOCK_ENTRY_NUM);
+#endif
+ return block->entries[index];
+}
#define VECTOR_BLOCK_SHARE_BIT 0x01
#define VECTOR_BLOCK_FULL_BIT 0x02
Modified: harmony/enhanced/drlvm/trunk/vm/gc_gen/src/verify/verifier_common.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/gc_gen/src/verify/verifier_common.cpp?rev=606876&r1=606875&r2=606876&view=diff
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/gc_gen/src/verify/verifier_common.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/gc_gen/src/verify/verifier_common.cpp Wed Dec 26 02:17:10 2007
@@ -85,10 +85,11 @@
{
Partial_Reveal_Object* p_obj = read_slot(p_ref);
assert(address_belongs_to_gc_heap(p_obj,heap_verifier->gc));
-#ifndef USE_MARK_SWEEP_GC
+#if !defined(USE_MARK_SWEEP_GC) && !defined(USE_UNIQUE_MOVE_COMPACT_GC)
GC_Gen* gc = (GC_Gen*)heap_verifier->gc;
Space* mspace = gc_get_mos(gc);
Space* lspace = gc_get_los(gc);
+ Space* nos = gc_get_nos(gc);
if(p_obj == NULL){
if(gc_match_kind((GC*)gc, MAJOR_COLLECTION) ||(!heap_verifier->gc_is_gen_mode && !NOS_PARTIAL_FORWARD)){
@@ -115,7 +116,7 @@
assert(0);
return FALSE;
}
-#ifndef USE_MARK_SWEEP_GC
+#if !defined(USE_MARK_SWEEP_GC) && !defined(USE_UNIQUE_MOVE_COMPACT_GC)
}else{
if(heap_verifier->gc_verifier->is_before_fallback_collection){
if(!address_belongs_to_gc_heap(p_obj, heap_verifier->gc)){
@@ -127,8 +128,16 @@
}
if(!address_belongs_to_space(p_obj, mspace) && !address_belongs_to_space(p_obj, lspace) && !NOS_PARTIAL_FORWARD){
+ if( nos->collect_algorithm == MINOR_NONGEN_SEMISPACE_POOL){
+ if( obj_belongs_to_survivor_area((Sspace*)nos, p_obj)) return TRUE;
+ else{
+ printf("\nERROR: obj referenced by rootset is not in survivor_area after semispace GC!\n");
+ assert(0);
+ }
+ }
+
+ printf("\nERROR: obj referenced by rootset is in NOS after GC!\n");
assert(0);
- printf("\nERROR: obj referenced by rootset is in nos after GC!\n");
return FALSE;
}
}
@@ -260,5 +269,7 @@
{
printf(" %-14s: %-7s | Before %10d | After %10d |\n", "hashcode", "NUM", gc_verifier->num_hash_before_gc, gc_verifier->num_hash_after_gc);
}
+
+
Modified: harmony/enhanced/drlvm/trunk/vm/gc_gen/src/verify/verifier_common.h
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/gc_gen/src/verify/verifier_common.h?rev=606876&r1=606875&r2=606876&view=diff
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/gc_gen/src/verify/verifier_common.h (original)
+++ harmony/enhanced/drlvm/trunk/vm/gc_gen/src/verify/verifier_common.h Wed Dec 26 02:17:10 2007
@@ -23,12 +23,13 @@
#include "../common/gc_space.h"
#include "../gen/gen.h"
#include "../mark_sweep/gc_ms.h"
+#include "../semi_space/sspace.h"
#include "../common/space_tuner.h"
#ifdef USE_32BITS_HASHCODE
#include "../common/hashcode.h"
#endif
#ifdef USE_MARK_SWEEP_GC
-#include "../mark_sweep/sspace_mark_sweep.h"
+#include "../mark_sweep/wspace_mark_sweep.h"
#endif
#include "../common/gc_concurrent.h"
@@ -116,10 +117,8 @@
assert(address_belongs_to_gc_heap(read_slot(p_ref), (GC*)heap_verifier->gc));
Partial_Reveal_Object* UNUSED p_obj = read_slot(p_ref);
assert(p_obj);
- assert(uncompress_vt(obj_get_vt(p_obj)));
- assert(!address_belongs_to_gc_heap(uncompress_vt(obj_get_vt(p_obj)), (GC*)heap_verifier->gc));
-
-//ynhe
+ assert(decode_vt(obj_get_vt(p_obj)));
+ assert(!address_belongs_to_gc_heap(decode_vt(obj_get_vt(p_obj)), (GC*)heap_verifier->gc));
#ifdef USE_MARK_SWEEP_GC
GC_MS* gc = (GC_MS*)heap_verifier->gc;
@@ -129,7 +128,6 @@
if(!obj_is_alloc_in_color_table(p_obj))
printf("\nERROR: obj after GC should be set its alloc color!\n");
}else{
- //ynhe
if(gc_mark_is_concurrent())
assert(obj_is_mark_black_in_table(p_obj));
}
@@ -148,7 +146,9 @@
assert(address_belongs_to_gc_heap(p_obj, (GC*)heap_verifier->gc));
assert(obj_get_vt(p_obj));
- assert(!address_belongs_to_gc_heap(uncompress_vt(obj_get_vt(p_obj)), (GC*)heap_verifier->gc));
+
+ /*FIXME:: should add more sanity checks, such as vt->gcvt->class... */
+ assert(!address_belongs_to_gc_heap(decode_vt(obj_get_vt(p_obj)), (GC*)heap_verifier->gc));
}
Modified: harmony/enhanced/drlvm/trunk/vm/gc_gen/src/verify/verifier_scanner.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/gc_gen/src/verify/verifier_scanner.cpp?rev=606876&r1=606875&r2=606876&view=diff
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/gc_gen/src/verify/verifier_scanner.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/gc_gen/src/verify/verifier_scanner.cpp Wed Dec 26 02:17:10 2007
@@ -36,7 +36,7 @@
static FORCE_INLINE void scan_object(Heap_Verifier* heap_verifier, Partial_Reveal_Object *p_obj)
{
GC_Verifier* gc_verifier = heap_verifier->gc_verifier;
-#ifndef USE_MARK_SWEEP_GC
+#if !defined(USE_MARK_SWEEP_GC) && !defined(USE_UNIQUE_MOVE_COMPACT_GC)
if(gc_verifier->is_before_fallback_collection) {
if(obj_belongs_to_nos(p_obj) && obj_is_fw_in_oi(p_obj)){
assert(obj_get_vt(p_obj) == obj_get_vt(obj_get_fw_in_oi(p_obj)));
@@ -364,7 +364,7 @@
void verifier_scan_all_objects(Heap_Verifier* heap_verifier)
{
-#ifndef USE_MARK_SWEEP_GC
+#if !defined(USE_MARK_SWEEP_GC) && !defined(USE_UNIQUE_MOVE_COMPACT_GC)
GC_Gen* gc = (GC_Gen*)heap_verifier->gc;
Space* fspace = gc_get_nos(gc);
Space* mspace = gc_get_mos(gc);
@@ -412,7 +412,7 @@
void verifier_scan_unreachable_objects(Heap_Verifier* heap_verifier)
{
-#ifndef USE_MARK_SWEEP_GC
+#if !defined(USE_MARK_SWEEP_GC) && !defined(USE_UNIQUE_MOVE_COMPACT_GC)
if(heap_verifier->is_before_gc) return;
GC_Gen* gc = (GC_Gen*)heap_verifier->gc;
Space* mspace = gc_get_mos(gc);
@@ -431,5 +431,7 @@
heap_verifier->live_obj_scanner = verifier_scan_live_objects;
heap_verifier->all_obj_scanner = verifier_scan_all_objects;
}
+
+
Modified: harmony/enhanced/drlvm/trunk/vm/gc_gen/src/verify/verify_gc_effect.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/gc_gen/src/verify/verify_gc_effect.cpp?rev=606876&r1=606875&r2=606876&view=diff
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/gc_gen/src/verify/verify_gc_effect.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/gc_gen/src/verify/verify_gc_effect.cpp Wed Dec 26 02:17:10 2007
@@ -18,7 +18,7 @@
#include "verifier_common.h"
#include "verify_gc_effect.h"
#ifdef USE_MARK_SWEEP_GC
-#include "../mark_sweep/sspace_mark_sweep.h"
+#include "../mark_sweep/wspace_mark_sweep.h"
#endif
static POINTER_SIZE_INT hash_obj_distance = 0;
@@ -325,7 +325,6 @@
if(!obj_is_alloc_in_color_table(p_obj))
printf("\nERROR: obj after GC should be set its alloc color!\n");
}else{
- //ynhe
if(gc_mark_is_concurrent())
assert(obj_is_mark_black_in_table(p_obj));
}
@@ -550,6 +549,8 @@
void verifier_reset_hash_distance()
{ hash_obj_distance = 0;}
+
+
Modified: harmony/enhanced/drlvm/trunk/vm/gc_gen/src/verify/verify_live_heap.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/gc_gen/src/verify/verify_live_heap.cpp?rev=606876&r1=606875&r2=606876&view=diff
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/gc_gen/src/verify/verify_live_heap.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/gc_gen/src/verify/verify_live_heap.cpp Wed Dec 26 02:17:10 2007
@@ -146,6 +146,30 @@
Heap_Verifier* get_heap_verifier()
{ return heap_verifier; }
+/* this is tempoprarily used to check the rootset sanity after fallback mark-scan */
+void gc_verify_rootset(GC* gc)
+{
+ Heap_Verifier_Metadata* verifier_metadata = heap_verifier->heap_verifier_metadata;
+ Pool* root_set_pool = verifier_metadata->root_set_pool;
+
+ pool_iterator_init(root_set_pool);
+ Vector_Block* root_set = pool_iterator_next(root_set_pool);
+
+ while(root_set){
+ POINTER_SIZE_INT* iter = vector_block_iterator_init(root_set);
+ while(!vector_block_iterator_end(root_set,iter)){
+ REF* p_ref = (REF* )*iter;
+ iter = vector_block_iterator_advance(root_set,iter);
+ Partial_Reveal_Object* p_obj = read_slot(p_ref);
+ if(obj_belongs_to_nos(p_obj)){
+ assert(!obj_is_fw_in_oi(p_obj));
+ }
+ verify_object_header(p_obj, heap_verifier);
+ }
+ root_set = pool_iterator_next(root_set_pool);
+ }
+ return;
+}
Modified: harmony/enhanced/drlvm/trunk/vm/gc_gen/src/verify/verify_live_heap.h
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/gc_gen/src/verify/verify_live_heap.h?rev=606876&r1=606875&r2=606876&view=diff
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/gc_gen/src/verify/verify_live_heap.h (original)
+++ harmony/enhanced/drlvm/trunk/vm/gc_gen/src/verify/verify_live_heap.h Wed Dec 26 02:17:10 2007
@@ -25,8 +25,9 @@
void gc_init_heap_verification(GC* gc);
void gc_terminate_heap_verification(GC* gc);
void gc_verify_heap(GC* gc, Boolean is_before_gc);
-
+void gc_verify_rootset(GC* gc);
void event_mutator_allocate_newobj(Partial_Reveal_Object* p_newobj, POINTER_SIZE_INT size, VT vt_raw);
void event_gc_collect_kind_changed(GC* gc);
+
#endif