Return-Path: Delivered-To: apmail-harmony-commits-archive@www.apache.org Received: (qmail 16364 invoked from network); 24 May 2007 08:17:49 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (140.211.11.2) by minotaur.apache.org with SMTP; 24 May 2007 08:17:49 -0000 Received: (qmail 6188 invoked by uid 500); 24 May 2007 08:17:54 -0000 Delivered-To: apmail-harmony-commits-archive@harmony.apache.org Received: (qmail 6167 invoked by uid 500); 24 May 2007 08:17:54 -0000 Mailing-List: contact commits-help@harmony.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@harmony.apache.org Delivered-To: mailing list commits@harmony.apache.org Received: (qmail 6158 invoked by uid 99); 24 May 2007 08:17:54 -0000 Received: from herse.apache.org (HELO herse.apache.org) (140.211.11.133) by apache.org (qpsmtpd/0.29) with ESMTP; Thu, 24 May 2007 01:17:54 -0700 X-ASF-Spam-Status: No, hits=-99.5 required=10.0 tests=ALL_TRUSTED,NO_REAL_NAME X-Spam-Check-By: apache.org Received: from [140.211.11.3] (HELO eris.apache.org) (140.211.11.3) by apache.org (qpsmtpd/0.29) with ESMTP; Thu, 24 May 2007 01:17:47 -0700 Received: by eris.apache.org (Postfix, from userid 65534) id A5F9F1A981D; Thu, 24 May 2007 01:17:27 -0700 (PDT) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r541224 [2/2] - in /harmony/enhanced/drlvm/trunk/vm/gc_gen/src: common/ finalizer_weakref/ gen/ mark_compact/ mark_sweep/ utils/ Date: Thu, 24 May 2007 08:17:26 -0000 To: commits@harmony.apache.org From: xli@apache.org X-Mailer: svnmailer-1.1.0 Message-Id: <20070524081727.A5F9F1A981D@eris.apache.org> X-Virus-Checked: Checked by ClamAV on apache.org 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?view=diff&rev=541224&r1=541223&r2=541224 ============================================================================== --- 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 Thu May 24 01:17:25 2007 @@ -292,13 +292,44 @@ } } +static inline void gc_init_block_for_fix_repointed_refs(GC* gc, Mspace* mspace) +{ + Space_Tuner* tuner = gc->tuner; + POINTER_SIZE_INT tuning_size = tuner->tuning_size; + /*If LOS_Shrink, we just fix the repointed refs from the start of old mspace.*/ + if((tuner->kind == TRANS_NOTHING) || (tuner->kind == TRANS_FROM_LOS_TO_MOS)){ + mspace_block_iterator_init(mspace); + return; + }else{ + /*If LOS_Extend, we fix from the new start of mspace, because the block list is start from there.*/ + mspace->block_iterator = (Block_Header*)((POINTER_SIZE_INT)mspace->blocks + tuning_size); + } + return; +} + static inline void gc_init_block_for_sliding_compact(GC *gc, Mspace *mspace) { /* initialize related static variables */ next_block_for_dest = NULL; current_dest_block.block = NULL; current_dest_block.lock = FREE_LOCK; - mspace_block_iterator_init(mspace); + + Space_Tuner* tuner = gc->tuner; + POINTER_SIZE_INT tuning_size = tuner->tuning_size; + + if( tuner->kind == TRANS_NOTHING ){ + /*If space is not tuned, we just start from mspace->heap_start.*/ + mspace_block_iterator_init(mspace); + return; + }else if (tuner->kind == TRANS_FROM_MOS_TO_LOS){ + /*If LOS_Extend, we compact from the new start of mspace, because the block list is start from there.*/ + mspace->block_iterator = (Block_Header*)((POINTER_SIZE_INT)mspace->blocks + tuning_size); + }else{ + /*If LOS_Shrink, we compact from the new start of mspace too. + *This is different from the operations in function gc_init_block_for_fix_repointed_refs, + *because we want to compact mspace to the new start.*/ + mspace->block_iterator = (Block_Header*)((POINTER_SIZE_INT)mspace->blocks - tuning_size); + } return; } @@ -353,8 +384,8 @@ } -//For_LOS_extend -void mspace_restore_block_chain(Mspace* mspace) +/*For LOS_Extend*/ +static void mspace_restore_block_chain(Mspace* mspace) { GC* gc = mspace->gc; Fspace* fspace = (Fspace*)gc_get_nos((GC_Gen*)gc); @@ -381,32 +412,22 @@ unsigned int num_active_collectors = gc->num_active_collectors; /* Pass 1: ************************************************** - mark all live objects in heap, and save all the slots that - have references that are going to be repointed */ + *mark all live objects in heap, and save all the slots that + *have references that are going to be repointed. + */ unsigned int old_num = atomic_cas32( &num_marking_collectors, 0, num_active_collectors+1); if(gc_match_kind(gc, FALLBACK_COLLECTION)) - fallback_mark_scan_heap(collector); + mark_scan_heap_for_fallback(collector); else if(gc->tuner->kind != TRANS_NOTHING) - los_adaptation_mark_scan_heap(collector); + mark_scan_heap_for_space_tune(collector); else mark_scan_heap(collector); - old_num = atomic_inc32(&num_marking_collectors); + + /* last collector's world here */ if( ++old_num == num_active_collectors ){ - /* last collector's world here */ - /*Retune space tuner to insure the tuning size is not to great*/ -// Boolean retune_result; - if(gc->tuner->kind != TRANS_NOTHING) gc_space_retune(gc); -// if(gc->tuner->kind == TRANS_FROM_LOS_TO_MOS) printf("los shrink...\n"); -// if(gc->tuner->kind == TRANS_FROM_MOS_TO_LOS) printf("los extend...\n"); - -/* if(!retune_result){ - gc->collect_result = FALSE; - num_marking_collectors++; - return; - }*/ - + if( gc->tuner->kind != TRANS_NOTHING ) gc_compute_space_tune_size_after_marking(gc); assert(!(gc->tuner->tuning_size % GC_BLOCK_SIZE_BYTES)); /* prepare for next phase */ gc_init_block_for_collectors(gc, mspace); @@ -426,12 +447,10 @@ #endif last_block_for_dest = NULL; - /* let other collectors go */ num_marking_collectors++; } while(num_marking_collectors != num_active_collectors + 1); -// if(!gc->collect_result) return; /* Pass 2: ************************************************** assign target addresses for all to-be-moved objects */ @@ -445,40 +464,43 @@ mspace_compute_object_target(collector, mspace); old_num = atomic_inc32(&num_repointing_collectors); + /*last collector's world here*/ if( ++old_num == num_active_collectors ){ - /* single thread world */ - /*LOS_Shrink: */ + /*LOS_Shrink: but lspace->move_object could be set individually without shrinking LOS.*/ if(lspace->move_object) lspace_compute_object_target(collector, lspace); gc->collect_result = gc_collection_result(gc); if(!gc->collect_result){ num_repointing_collectors++; return; } - gc_reset_block_for_collectors(gc, mspace); - mspace_block_iterator_init(mspace); + gc_init_block_for_fix_repointed_refs(gc, mspace); num_repointing_collectors++; } while(num_repointing_collectors != num_active_collectors + 1); if(!gc->collect_result) return; /* Pass 3: ************************************************** - update all references whose objects are to be moved */ + *update all references whose objects are to be moved + */ old_num = atomic_cas32( &num_fixing_collectors, 0, num_active_collectors+1); mspace_fix_repointed_refs(collector, mspace); old_num = atomic_inc32(&num_fixing_collectors); + /*last collector's world here */ if( ++old_num == num_active_collectors ){ - /* last collector's world here */ lspace_fix_repointed_refs(collector, lspace); gc_fix_rootset(collector); gc_init_block_for_sliding_compact(gc, mspace); - /*LOS_Shrink: Fixme: This operation moves objects in LOS, and should be part of Pass 4*/ + /*LOS_Shrink: This operation moves objects in LOS, and should be part of Pass 4 + *lspace_sliding_compact is not binded with los shrink, we could slide compact los individually. + *So we use a flag lspace->move_object here, not tuner->kind == TRANS_FROM_LOS_TO_MOS. + */ if(lspace->move_object) lspace_sliding_compact(collector, lspace); - mspace_settle_fake_blocks_for_los_shrink(mspace); - /*Fixme: LOS_Shrink: set dest block for sliding compact*/ - if(gc->tuner->kind == TRANS_FROM_LOS_TO_MOS) - mspace->block_iterator = (Block_Header*)((POINTER_SIZE_INT)mspace->blocks - (mspace->gc)->tuner->tuning_size); - + /*The temp blocks for storing interim infomation is copied to the real place they should be. + *And the space of the blocks are freed, which is alloced in gc_space_tuner_init_fake_blocks_for_los_shrink. + */ + last_block_for_dest = (Block_Header *)round_down_to_size((POINTER_SIZE_INT)last_block_for_dest->base, GC_BLOCK_SIZE_BYTES); + if(gc->tuner->kind == TRANS_FROM_LOS_TO_MOS) gc_space_tuner_release_fake_blocks_for_los_shrink(gc); num_fixing_collectors++; } while(num_fixing_collectors != num_active_collectors + 1); @@ -502,11 +524,9 @@ #endif old_num = atomic_inc32(&num_restoring_collectors); - if( ++old_num == num_active_collectors ){ - mspace_update_info_for_los_extension(mspace); - mspace_update_info_for_los_shrink(mspace); - + if( ++old_num == num_active_collectors ){ + if(gc->tuner->kind != TRANS_NOTHING) mspace_update_info_after_space_tuning(mspace); num_restoring_collectors++; } while(num_restoring_collectors != num_active_collectors + 1); @@ -529,7 +549,7 @@ mspace_reset_after_compaction(mspace); fspace_reset_for_allocation(fspace); - //For_LOS_extend + /*For LOS_Extend*/ mspace_restore_block_chain(mspace); gc_set_pool_clear(gc->metadata->gc_rootset_pool); Modified: harmony/enhanced/drlvm/trunk/vm/gc_gen/src/mark_sweep/lspace.cpp URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/gc_gen/src/mark_sweep/lspace.cpp?view=diff&rev=541224&r1=541223&r2=541224 ============================================================================== --- harmony/enhanced/drlvm/trunk/vm/gc_gen/src/mark_sweep/lspace.cpp (original) +++ harmony/enhanced/drlvm/trunk/vm/gc_gen/src/mark_sweep/lspace.cpp Thu May 24 01:17:25 2007 @@ -111,7 +111,6 @@ lspace in that function lspace_get_next_marked_object is not true*/ if(!lspace->move_object) lspace_sweep(lspace); lspace->move_object = FALSE; -// printf("lspace: %d MB \n", lspace->committed_heap_size / MB); return; } Modified: harmony/enhanced/drlvm/trunk/vm/gc_gen/src/mark_sweep/lspace_alloc_collect.cpp URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/gc_gen/src/mark_sweep/lspace_alloc_collect.cpp?view=diff&rev=541224&r1=541223&r2=541224 ============================================================================== --- harmony/enhanced/drlvm/trunk/vm/gc_gen/src/mark_sweep/lspace_alloc_collect.cpp (original) +++ harmony/enhanced/drlvm/trunk/vm/gc_gen/src/mark_sweep/lspace_alloc_collect.cpp Thu May 24 01:17:25 2007 @@ -300,9 +300,6 @@ POINTER_SIZE_INT target_obj_end = (POINTER_SIZE_INT)p_target_obj + obj_size; if( p_obj != p_target_obj){ memmove(p_target_obj, p_obj, obj_size); - /*Fixme: For LOS_Shrink debug*/ -// unsigned int padding_lenth = ALIGN_UP_TO_KILO(target_obj_end) - target_obj_end; -// memset(p_target_obj, 0, padding_lenth); } set_obj_info(p_target_obj, 0); p_obj = lspace_get_next_marked_object(lspace, &iterate_index); Modified: harmony/enhanced/drlvm/trunk/vm/gc_gen/src/utils/seq_list.h URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/gc_gen/src/utils/seq_list.h?view=diff&rev=541224&r1=541223&r2=541224 ============================================================================== --- harmony/enhanced/drlvm/trunk/vm/gc_gen/src/utils/seq_list.h (original) +++ harmony/enhanced/drlvm/trunk/vm/gc_gen/src/utils/seq_list.h Thu May 24 01:17:25 2007 @@ -118,123 +118,3 @@ } #endif #endif //_SEQ_LIST_H_ -#ifndef _SEQ_LIST_H_ -#define _SEQ_LIST_H_ - -#include "vector_block.h" - -typedef struct List_Node{ - List_Node* next; -}List_Node; - -typedef struct Seq_List{ - List_Node* head; - List_Node* end; - List_Node* curr; -#ifdef _DEBUG - unsigned int node_num; -#endif -}Seq_List; - -inline Seq_List* seq_list_create() -{ - unsigned int size = sizeof(Seq_List); - Seq_List* seq_list = (Seq_List*)STD_MALLOC(size); - memset(seq_list, 0, size); - - //List Head - size = sizeof(List_Node); - List_Node* lnode = (List_Node*)STD_MALLOC(size); - seq_list->head = seq_list->end = lnode; - lnode->next = lnode; - - return seq_list; -} - -inline void seq_list_destruct(Seq_List* seq_list) -{ - STD_FREE(seq_list->head); - STD_FREE(seq_list); -} - -inline Boolean seq_list_add(Seq_List* seq_list, List_Node* node) -{ -#ifdef _DEBUG - seq_list->node_num ++; -#endif - seq_list->end ->next = node; - seq_list->end = node; - node->next = seq_list->head; - return TRUE; -} - -inline void seq_list_iterate_init(Seq_List* seq_list) -{ - seq_list->curr = seq_list->head->next; -} - -inline void seq_list_iterate_init_after_node(Seq_List* seq_list, List_Node* begin) -{ - seq_list->curr = begin->next; -} - -inline List_Node* seq_list_iterate_next(Seq_List* seq_list) -{ - if(seq_list->curr != seq_list->head){ - List_Node* ret_node = seq_list->curr; - seq_list->curr =seq_list->curr->next; - return ret_node; - } - return NULL; -} - -inline Boolean seq_list_has_next(Seq_List* seq_list) -{ - return seq_list->curr != seq_list->head; -} - -inline List_Node* seq_list_end_node(Seq_List* seq_list) -{ return seq_list->end; } - -inline List_Node* seq_list_lookup_prev_node(Seq_List* seq_list, List_Node* node) -{ - List_Node* prev_node = seq_list->head; - seq_list_iterate_init(seq_list); - while(seq_list_has_next(seq_list)){ - List_Node* curr_node = seq_list_iterate_next(seq_list); - if( node == curr_node ) return prev_node; - prev_node = curr_node; - } - return NULL; -} - -inline Boolean seq_list_remove(Seq_List* seq_list, List_Node* node) -{ - List_Node* prev_node = seq_list_lookup_prev_node(seq_list, node); - if(prev_node==NULL) return FALSE; //need assertion here. - prev_node->next = node->next; -#ifdef _DEBUG - seq_list->node_num --; -#endif - if(seq_list->end == node) seq_list->end = prev_node; - return TRUE; -} - -inline void seq_list_clear(Seq_List* seq_list) -{ - seq_list->end = seq_list->head; - seq_list->curr = seq_list->head; - List_Node* head = seq_list->head; - head->next = seq_list->head; -#ifdef _DEBUG - seq_list->node_num = 0; -#endif -} - -#ifdef _DEBUG -inline unsigned int seq_list_size(Seq_List* seq_list) -{ - return seq_list->node_num; -} -#endif -#endif //_SEQ_LIST_H_