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/08/20 15:39:52 UTC
svn commit: r567700 - in /harmony/enhanced/drlvm/trunk/vm:
gc_gen/src/common/weak_roots.cpp gc_gen/src/los/lspace_alloc_collect.cpp
vmcore/src/init/finalizer_thread.cpp
Author: xli
Date: Mon Aug 20 06:39:51 2007
New Revision: 567700
URL: http://svn.apache.org/viewvc?rev=567700&view=rev
Log:
added a missed new file, and fix two issues in last commit.
Added:
harmony/enhanced/drlvm/trunk/vm/gc_gen/src/common/weak_roots.cpp (with props)
Modified:
harmony/enhanced/drlvm/trunk/vm/gc_gen/src/los/lspace_alloc_collect.cpp
harmony/enhanced/drlvm/trunk/vm/vmcore/src/init/finalizer_thread.cpp
Added: 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=567700&view=auto
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/gc_gen/src/common/weak_roots.cpp (added)
+++ harmony/enhanced/drlvm/trunk/vm/gc_gen/src/common/weak_roots.cpp Mon Aug 20 06:39:51 2007
@@ -0,0 +1,79 @@
+/*
+ * Copyright 2005-2006 The Apache Software Foundation or its licensors, as applicable.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "gc_common.h"
+#include "gc_metadata.h"
+#include "../gen/gen.h"
+
+void identify_dead_weak_roots(GC *gc, Pool *pool)
+{
+ pool_iterator_init(pool);
+ while(Vector_Block *block = pool_iterator_next(pool)){
+ POINTER_SIZE_INT *iter = vector_block_iterator_init(block);
+ for(; !vector_block_iterator_end(block, iter); iter = vector_block_iterator_advance(block, iter)){
+ Partial_Reveal_Object** p_ref = (Partial_Reveal_Object**)*iter;
+ Partial_Reveal_Object *p_obj = *p_ref;
+ if(!p_obj){ // reference has been cleared
+ continue;
+ }
+ if(IS_FALLBACK_COMPACTION) {
+ 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);
+ assert(p_obj);
+ *p_ref = p_obj;
+ }
+ }
+ if(gc_obj_is_dead(gc, p_obj))
+ *p_ref = 0;
+ }
+ }
+}
+
+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_pool(GC *gc)
+{
+ GC_Metadata* metadata = gc->metadata;
+ Pool *pool = metadata->weak_roots_pool;
+ Partial_Reveal_Object** p_ref;
+ Partial_Reveal_Object *p_obj;
+
+ pool_iterator_init(pool);
+ while(Vector_Block *repset = pool_iterator_next(pool)){
+ POINTER_SIZE_INT *iter = vector_block_iterator_init(repset);
+ for(; !vector_block_iterator_end(repset,iter); iter = vector_block_iterator_advance(repset,iter)){
+ p_ref = (Partial_Reveal_Object**)*iter;
+ p_obj = *p_ref;
+ if(!p_obj){ // reference has been cleared
+ continue;
+ }
+
+ if(obj_need_move(gc, p_obj)) {
+ if(!IS_MOVE_COMPACT){
+ assert((POINTER_SIZE_INT)obj_get_fw_in_oi(p_obj) > DUAL_MARKBITS);
+ *p_ref = obj_get_fw_in_oi(p_obj);
+ } else {
+ assert(space_of_addr(gc, (void*)p_obj)->move_object);
+ *p_ref = ref_to_obj_ptr(obj_get_fw_in_table(p_obj));
+ }
+ }
+ }
+ }
+}
Propchange: harmony/enhanced/drlvm/trunk/vm/gc_gen/src/common/weak_roots.cpp
------------------------------------------------------------------------------
svn:eol-style = native
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=567700&r1=567699&r2=567700&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 Mon Aug 20 06:39:51 2007
@@ -353,7 +353,6 @@
/*LOS_Shrink: We don't have to scan lspace to build free pool when slide compact LOS*/
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;
- 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);
break;
@@ -363,6 +362,7 @@
assert(tuner->kind == TRANS_NOTHING);
assert(!tuner->tuning_size);
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);
break;
Modified: harmony/enhanced/drlvm/trunk/vm/vmcore/src/init/finalizer_thread.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/vmcore/src/init/finalizer_thread.cpp?rev=567700&r1=567699&r2=567700&view=diff
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/vmcore/src/init/finalizer_thread.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/vmcore/src/init/finalizer_thread.cpp Mon Aug 20 06:39:51 2007
@@ -160,7 +160,7 @@
hymutex_lock(&fin_thread_info->end_mutex);
unsigned int fin_obj_num = vm_get_finalizable_objects_quantity();
while(fin_thread_info->working_thread_num || fin_obj_num){
- unsigned int wait_time = restrict_wait_time(fin_obj_num + 100, FIN_MAX_WAIT_TIME << 7);
+ unsigned int wait_time = restrict_wait_time((fin_obj_num + 100)<<1, FIN_MAX_WAIT_TIME << 7);
atomic_inc32(&fin_thread_info->end_waiting_num);
IDATA status = hycond_wait_timed(&fin_thread_info->end_cond, &fin_thread_info->end_mutex, (I_64)wait_time, 0);
atomic_dec32(&fin_thread_info->end_waiting_num);