You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@harmony.apache.org by xl...@apache.org on 2008/01/13 14:07:33 UTC
svn commit: r611569 -
/harmony/enhanced/drlvm/trunk/vm/gc_gen/src/semi_space/sspace_gen_ss_pool.cpp
Author: xli
Date: Sun Jan 13 05:07:30 2008
New Revision: 611569
URL: http://svn.apache.org/viewvc?rev=611569&view=rev
Log:
fixed a bug in generational semispace GC, which remembered redundant slots in remset.
Modified:
harmony/enhanced/drlvm/trunk/vm/gc_gen/src/semi_space/sspace_gen_ss_pool.cpp
Modified: harmony/enhanced/drlvm/trunk/vm/gc_gen/src/semi_space/sspace_gen_ss_pool.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/gc_gen/src/semi_space/sspace_gen_ss_pool.cpp?rev=611569&r1=611568&r2=611569&view=diff
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/gc_gen/src/semi_space/sspace_gen_ss_pool.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/gc_gen/src/semi_space/sspace_gen_ss_pool.cpp Sun Jan 13 05:07:30 2008
@@ -87,7 +87,7 @@
return;
}
-/* NOTE:: At this point, p_ref can be in anywhere like root, and other spaces, but *p_ref must be in fspace,
+/* NOTE:: At this point, p_ref can be in anywhere like root, and other spaces, but *p_ref must be in sspace,
since only slot which points to object in fspace could be added into TraceStack.
The problem is the *p_ref may be forwarded already so that, when we come here we find it's pointing to tospace.
We will simply return for that case. It might be forwarded due to:
@@ -102,7 +102,9 @@
GC* gc = collector->gc;
Partial_Reveal_Object *p_obj = read_slot(p_ref);
- if(!obj_belongs_to_nos(p_obj)) return;
+ /* p_obj can also be in tospace because this p_ref is a redundant one in mutator remset.
+ We don't rem p_ref because it was remembered in first time it's met. */
+ if(!obj_belongs_to_nos(p_obj) || obj_belongs_to_tospace(p_obj)) return;
Partial_Reveal_Object* p_target_obj = NULL;
Boolean to_rem_slot = FALSE;
@@ -114,20 +116,12 @@
/* check if the target obj stays in NOS, and p_ref from MOS. If yes, rem p_ref. */
if(obj_is_survivor(p_target_obj))
- to_rem_slot = TRUE;
+ if( !addr_belongs_to_nos(p_ref) && address_belongs_to_gc_heap(p_ref, gc))
+ collector_remset_add_entry(collector, ( Partial_Reveal_Object**) p_ref);
- }else if( obj_belongs_to_tospace(p_obj)){
- /* if p_obj the new copy in tospace, rem p_ref if it's from MOS */
- to_rem_slot = TRUE;
+ return;
}
-
- if( to_rem_slot == TRUE ){
- if( !addr_belongs_to_nos(p_ref) && address_belongs_to_gc_heap(p_ref, gc))
- collector_remset_add_entry(collector, ( Partial_Reveal_Object**) p_ref);
- return;
- }
-
/* following is the logic for forwarding */
p_target_obj = collector_forward_object(collector, p_obj);