Top


定義場所(file name)

hotspot/src/share/vm/gc_implementation/parallelScavenge/psPromotionManager.inline.hpp

名前(function name)

template <class T>
inline void PSPromotionManager::claim_or_forward_internal_depth(T* p) {

本体部(body)

  {- -------------------------------------------
  (1) 
      ---------------------------------------- -}

      if (p != NULL) { // XXX: error if p != NULL here

  {- -------------------------------------------
  (1) 処理対象のポインタ(p)が指している oop を取得する.
      ---------------------------------------- -}

        oop o = oopDesc::load_decode_heap_oop_not_null(p);

  {- -------------------------------------------
  (1) 既に forward 済み(forwarding pointer)なら, 
        (1) New 領域を指している場合には, CardTableExtension::inline_write_ref_field_gc() で
            該当する card を youngergen_card (つまり「New 領域への参照有り」) に設定した後, 
        (2) oopDesc::encode_store_heap_oop_not_null() で, 処理対象のポインタ(p)をコピー先のアドレスに書き換える.

      forward 済みでなければ, PSPromotionManager::push_depth() でキューにポインタを登録する.
      ---------------------------------------- -}

        if (o->is_forwarded()) {
          o = o->forwardee();
          // Card mark
          if (PSScavenge::is_obj_in_young((HeapWord*) o)) {
            PSScavenge::card_table()->inline_write_ref_field_gc(p, o);
          }
          oopDesc::encode_store_heap_oop_not_null(p, o);
        } else {
          push_depth(p);
        }
      }
    }

This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.