Top


定義場所(file name)

hotspot/src/share/vm/gc_implementation/g1/heapRegionRemSet.cpp

名前(function name)

  void par_expand() {

本体部(body)

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

        int n = HeapRegionRemSet::num_par_rem_sets()-1;
        if (n <= 0) return;
        if (_par_tables == NULL) {
          PerRegionTable* res =
            (PerRegionTable*)
            Atomic::cmpxchg_ptr((PerRegionTable*)ReserveParTableExpansion,
                                &_par_tables, NULL);
          if (res != NULL) return;
          // Otherwise, we reserved the right to do the expansion.

          PerRegionTable** ptables = NEW_C_HEAP_ARRAY(PerRegionTable*, n);
          for (int i = 0; i < n; i++) {
            PerRegionTable* ptable = PerRegionTable::alloc(hr());
            ptables[i] = ptable;
          }
          // Here we do not need an atomic.
          _par_tables = ptables;
    #if COUNT_PAR_EXPANDS
          print_par_expand();
    #endif
          // We must put this table on the expanded list.
          PosParPRT* exp_head = _par_expanded_list;
          while (true) {
            set_next_par_expanded(exp_head);
            PosParPRT* res =
              (PosParPRT*)
              Atomic::cmpxchg_ptr(this, &_par_expanded_list, exp_head);
            if (res == exp_head) return;
            // Otherwise.
            exp_head = res;
          }
          ShouldNotReachHere();
        }
      }

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