hotspot/src/share/vm/gc_implementation/g1/concurrentMark.inline.hpp
author johnc
Sat, 06 Oct 2012 01:17:44 -0700
changeset 14073 6012178c0c19
parent 13919 01f6d01a9004
child 15949 a55dea304e8c
permissions -rw-r--r--
7127708: G1: change task num types from int to uint in concurrent mark Summary: Change the type of various task num fields, parameters etc to unsigned and rename them to be more consistent with the other collectors. Code changes were also reviewed by Vitaly Davidovich. Reviewed-by: johnc Contributed-by: Kaushik Srenevasan <kaushik@twitter.com>
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
9994
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
     1
/*
11455
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 9999
diff changeset
     2
 * Copyright (c) 2001, 2012, Oracle and/or its affiliates. All rights reserved.
9994
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
     4
 *
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
     7
 * published by the Free Software Foundation.
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
     8
 *
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
    13
 * accompanied this code).
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
    14
 *
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
    18
 *
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
    20
 * or visit www.oracle.com if you need additional information or have any
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
    21
 * questions.
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
    22
 *
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
    23
 */
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
    24
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
    25
#ifndef SHARE_VM_GC_IMPLEMENTATION_G1_CONCURRENTMARK_INLINE_HPP
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
    26
#define SHARE_VM_GC_IMPLEMENTATION_G1_CONCURRENTMARK_INLINE_HPP
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
    27
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
    28
#include "gc_implementation/g1/concurrentMark.hpp"
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
    29
#include "gc_implementation/g1/g1CollectedHeap.inline.hpp"
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
    30
13919
01f6d01a9004 7200261: G1: Liveness counting inconsistencies during marking verification
johnc
parents: 12381
diff changeset
    31
// Utility routine to set an exclusive range of cards on the given
01f6d01a9004 7200261: G1: Liveness counting inconsistencies during marking verification
johnc
parents: 12381
diff changeset
    32
// card liveness bitmap
01f6d01a9004 7200261: G1: Liveness counting inconsistencies during marking verification
johnc
parents: 12381
diff changeset
    33
inline void ConcurrentMark::set_card_bitmap_range(BitMap* card_bm,
01f6d01a9004 7200261: G1: Liveness counting inconsistencies during marking verification
johnc
parents: 12381
diff changeset
    34
                                                  BitMap::idx_t start_idx,
01f6d01a9004 7200261: G1: Liveness counting inconsistencies during marking verification
johnc
parents: 12381
diff changeset
    35
                                                  BitMap::idx_t end_idx,
01f6d01a9004 7200261: G1: Liveness counting inconsistencies during marking verification
johnc
parents: 12381
diff changeset
    36
                                                  bool is_par) {
01f6d01a9004 7200261: G1: Liveness counting inconsistencies during marking verification
johnc
parents: 12381
diff changeset
    37
01f6d01a9004 7200261: G1: Liveness counting inconsistencies during marking verification
johnc
parents: 12381
diff changeset
    38
  // Set the exclusive bit range [start_idx, end_idx).
01f6d01a9004 7200261: G1: Liveness counting inconsistencies during marking verification
johnc
parents: 12381
diff changeset
    39
  assert((end_idx - start_idx) > 0, "at least one card");
01f6d01a9004 7200261: G1: Liveness counting inconsistencies during marking verification
johnc
parents: 12381
diff changeset
    40
  assert(end_idx <= card_bm->size(), "sanity");
01f6d01a9004 7200261: G1: Liveness counting inconsistencies during marking verification
johnc
parents: 12381
diff changeset
    41
01f6d01a9004 7200261: G1: Liveness counting inconsistencies during marking verification
johnc
parents: 12381
diff changeset
    42
  // Silently clip the end index
01f6d01a9004 7200261: G1: Liveness counting inconsistencies during marking verification
johnc
parents: 12381
diff changeset
    43
  end_idx = MIN2(end_idx, card_bm->size());
01f6d01a9004 7200261: G1: Liveness counting inconsistencies during marking verification
johnc
parents: 12381
diff changeset
    44
01f6d01a9004 7200261: G1: Liveness counting inconsistencies during marking verification
johnc
parents: 12381
diff changeset
    45
  // For small ranges use a simple loop; otherwise use set_range or
01f6d01a9004 7200261: G1: Liveness counting inconsistencies during marking verification
johnc
parents: 12381
diff changeset
    46
  // use par_at_put_range (if parallel). The range is made up of the
01f6d01a9004 7200261: G1: Liveness counting inconsistencies during marking verification
johnc
parents: 12381
diff changeset
    47
  // cards that are spanned by an object/mem region so 8 cards will
01f6d01a9004 7200261: G1: Liveness counting inconsistencies during marking verification
johnc
parents: 12381
diff changeset
    48
  // allow up to object sizes up to 4K to be handled using the loop.
01f6d01a9004 7200261: G1: Liveness counting inconsistencies during marking verification
johnc
parents: 12381
diff changeset
    49
  if ((end_idx - start_idx) <= 8) {
01f6d01a9004 7200261: G1: Liveness counting inconsistencies during marking verification
johnc
parents: 12381
diff changeset
    50
    for (BitMap::idx_t i = start_idx; i < end_idx; i += 1) {
01f6d01a9004 7200261: G1: Liveness counting inconsistencies during marking verification
johnc
parents: 12381
diff changeset
    51
      if (is_par) {
01f6d01a9004 7200261: G1: Liveness counting inconsistencies during marking verification
johnc
parents: 12381
diff changeset
    52
        card_bm->par_set_bit(i);
01f6d01a9004 7200261: G1: Liveness counting inconsistencies during marking verification
johnc
parents: 12381
diff changeset
    53
      } else {
01f6d01a9004 7200261: G1: Liveness counting inconsistencies during marking verification
johnc
parents: 12381
diff changeset
    54
        card_bm->set_bit(i);
01f6d01a9004 7200261: G1: Liveness counting inconsistencies during marking verification
johnc
parents: 12381
diff changeset
    55
      }
01f6d01a9004 7200261: G1: Liveness counting inconsistencies during marking verification
johnc
parents: 12381
diff changeset
    56
    }
01f6d01a9004 7200261: G1: Liveness counting inconsistencies during marking verification
johnc
parents: 12381
diff changeset
    57
  } else {
01f6d01a9004 7200261: G1: Liveness counting inconsistencies during marking verification
johnc
parents: 12381
diff changeset
    58
    // Note BitMap::par_at_put_range() and BitMap::set_range() are exclusive.
01f6d01a9004 7200261: G1: Liveness counting inconsistencies during marking verification
johnc
parents: 12381
diff changeset
    59
    if (is_par) {
01f6d01a9004 7200261: G1: Liveness counting inconsistencies during marking verification
johnc
parents: 12381
diff changeset
    60
      card_bm->par_at_put_range(start_idx, end_idx, true);
01f6d01a9004 7200261: G1: Liveness counting inconsistencies during marking verification
johnc
parents: 12381
diff changeset
    61
    } else {
01f6d01a9004 7200261: G1: Liveness counting inconsistencies during marking verification
johnc
parents: 12381
diff changeset
    62
      card_bm->set_range(start_idx, end_idx);
01f6d01a9004 7200261: G1: Liveness counting inconsistencies during marking verification
johnc
parents: 12381
diff changeset
    63
    }
01f6d01a9004 7200261: G1: Liveness counting inconsistencies during marking verification
johnc
parents: 12381
diff changeset
    64
  }
01f6d01a9004 7200261: G1: Liveness counting inconsistencies during marking verification
johnc
parents: 12381
diff changeset
    65
}
01f6d01a9004 7200261: G1: Liveness counting inconsistencies during marking verification
johnc
parents: 12381
diff changeset
    66
11583
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
    67
// Returns the index in the liveness accounting card bitmap
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
    68
// for the given address
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
    69
inline BitMap::idx_t ConcurrentMark::card_bitmap_index_for(HeapWord* addr) {
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
    70
  // Below, the term "card num" means the result of shifting an address
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
    71
  // by the card shift -- address 0 corresponds to card number 0.  One
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
    72
  // must subtract the card num of the bottom of the heap to obtain a
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
    73
  // card table index.
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
    74
  intptr_t card_num = intptr_t(uintptr_t(addr) >> CardTableModRefBS::card_shift);
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
    75
  return card_num - heap_bottom_card_num();
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
    76
}
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
    77
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
    78
// Counts the given memory region in the given task/worker
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
    79
// counting data structures.
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
    80
inline void ConcurrentMark::count_region(MemRegion mr, HeapRegion* hr,
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
    81
                                         size_t* marked_bytes_array,
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
    82
                                         BitMap* task_card_bm) {
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
    83
  G1CollectedHeap* g1h = _g1h;
13919
01f6d01a9004 7200261: G1: Liveness counting inconsistencies during marking verification
johnc
parents: 12381
diff changeset
    84
  CardTableModRefBS* ct_bs = (CardTableModRefBS*) (g1h->barrier_set());
01f6d01a9004 7200261: G1: Liveness counting inconsistencies during marking verification
johnc
parents: 12381
diff changeset
    85
11583
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
    86
  HeapWord* start = mr.start();
13919
01f6d01a9004 7200261: G1: Liveness counting inconsistencies during marking verification
johnc
parents: 12381
diff changeset
    87
  HeapWord* end = mr.end();
11583
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
    88
  size_t region_size_bytes = mr.byte_size();
12381
1438e0fbfa27 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 11584
diff changeset
    89
  uint index = hr->hrs_index();
11583
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
    90
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
    91
  assert(!hr->continuesHumongous(), "should not be HC region");
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
    92
  assert(hr == g1h->heap_region_containing(start), "sanity");
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
    93
  assert(hr == g1h->heap_region_containing(mr.last()), "sanity");
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
    94
  assert(marked_bytes_array != NULL, "pre-condition");
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
    95
  assert(task_card_bm != NULL, "pre-condition");
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
    96
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
    97
  // Add to the task local marked bytes for this region.
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
    98
  marked_bytes_array[index] += region_size_bytes;
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
    99
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   100
  BitMap::idx_t start_idx = card_bitmap_index_for(start);
13919
01f6d01a9004 7200261: G1: Liveness counting inconsistencies during marking verification
johnc
parents: 12381
diff changeset
   101
  BitMap::idx_t end_idx = card_bitmap_index_for(end);
11583
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   102
13919
01f6d01a9004 7200261: G1: Liveness counting inconsistencies during marking verification
johnc
parents: 12381
diff changeset
   103
  // Note: if we're looking at the last region in heap - end
01f6d01a9004 7200261: G1: Liveness counting inconsistencies during marking verification
johnc
parents: 12381
diff changeset
   104
  // could be actually just beyond the end of the heap; end_idx
01f6d01a9004 7200261: G1: Liveness counting inconsistencies during marking verification
johnc
parents: 12381
diff changeset
   105
  // will then correspond to a (non-existent) card that is also
01f6d01a9004 7200261: G1: Liveness counting inconsistencies during marking verification
johnc
parents: 12381
diff changeset
   106
  // just beyond the heap.
01f6d01a9004 7200261: G1: Liveness counting inconsistencies during marking verification
johnc
parents: 12381
diff changeset
   107
  if (g1h->is_in_g1_reserved(end) && !ct_bs->is_card_aligned(end)) {
01f6d01a9004 7200261: G1: Liveness counting inconsistencies during marking verification
johnc
parents: 12381
diff changeset
   108
    // end of region is not card aligned - incremement to cover
01f6d01a9004 7200261: G1: Liveness counting inconsistencies during marking verification
johnc
parents: 12381
diff changeset
   109
    // all the cards spanned by the region.
01f6d01a9004 7200261: G1: Liveness counting inconsistencies during marking verification
johnc
parents: 12381
diff changeset
   110
    end_idx += 1;
11583
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   111
  }
13919
01f6d01a9004 7200261: G1: Liveness counting inconsistencies during marking verification
johnc
parents: 12381
diff changeset
   112
  // The card bitmap is task/worker specific => no need to use
01f6d01a9004 7200261: G1: Liveness counting inconsistencies during marking verification
johnc
parents: 12381
diff changeset
   113
  // the 'par' BitMap routines.
01f6d01a9004 7200261: G1: Liveness counting inconsistencies during marking verification
johnc
parents: 12381
diff changeset
   114
  // Set bits in the exclusive bit range [start_idx, end_idx).
01f6d01a9004 7200261: G1: Liveness counting inconsistencies during marking verification
johnc
parents: 12381
diff changeset
   115
  set_card_bitmap_range(task_card_bm, start_idx, end_idx, false /* is_par */);
11583
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   116
}
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   117
11584
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
   118
// Counts the given memory region in the task/worker counting
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
   119
// data structures for the given worker id.
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
   120
inline void ConcurrentMark::count_region(MemRegion mr,
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
   121
                                         HeapRegion* hr,
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
   122
                                         uint worker_id) {
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
   123
  size_t* marked_bytes_array = count_marked_bytes_array_for(worker_id);
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
   124
  BitMap* task_card_bm = count_card_bitmap_for(worker_id);
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
   125
  count_region(mr, hr, marked_bytes_array, task_card_bm);
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
   126
}
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
   127
11583
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   128
// Counts the given memory region, which may be a single object, in the
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   129
// task/worker counting data structures for the given worker id.
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   130
inline void ConcurrentMark::count_region(MemRegion mr, uint worker_id) {
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   131
  HeapWord* addr = mr.start();
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   132
  HeapRegion* hr = _g1h->heap_region_containing_raw(addr);
11584
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
   133
  count_region(mr, hr, worker_id);
11583
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   134
}
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   135
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   136
// Counts the given object in the given task/worker counting data structures.
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   137
inline void ConcurrentMark::count_object(oop obj,
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   138
                                         HeapRegion* hr,
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   139
                                         size_t* marked_bytes_array,
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   140
                                         BitMap* task_card_bm) {
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   141
  MemRegion mr((HeapWord*)obj, obj->size());
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   142
  count_region(mr, hr, marked_bytes_array, task_card_bm);
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   143
}
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   144
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   145
// Counts the given object in the task/worker counting data
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   146
// structures for the given worker id.
11584
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
   147
inline void ConcurrentMark::count_object(oop obj,
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
   148
                                         HeapRegion* hr,
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
   149
                                         uint worker_id) {
11583
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   150
  size_t* marked_bytes_array = count_marked_bytes_array_for(worker_id);
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   151
  BitMap* task_card_bm = count_card_bitmap_for(worker_id);
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   152
  HeapWord* addr = (HeapWord*) obj;
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   153
  count_object(obj, hr, marked_bytes_array, task_card_bm);
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   154
}
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   155
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   156
// Attempts to mark the given object and, if successful, counts
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   157
// the object in the given task/worker counting structures.
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   158
inline bool ConcurrentMark::par_mark_and_count(oop obj,
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   159
                                               HeapRegion* hr,
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   160
                                               size_t* marked_bytes_array,
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   161
                                               BitMap* task_card_bm) {
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   162
  HeapWord* addr = (HeapWord*)obj;
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   163
  if (_nextMarkBitMap->parMark(addr)) {
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   164
    // Update the task specific count data for the object.
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   165
    count_object(obj, hr, marked_bytes_array, task_card_bm);
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   166
    return true;
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   167
  }
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   168
  return false;
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   169
}
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   170
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   171
// Attempts to mark the given object and, if successful, counts
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   172
// the object in the task/worker counting structures for the
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   173
// given worker id.
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   174
inline bool ConcurrentMark::par_mark_and_count(oop obj,
11584
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
   175
                                               size_t word_size,
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
   176
                                               HeapRegion* hr,
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
   177
                                               uint worker_id) {
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
   178
  HeapWord* addr = (HeapWord*)obj;
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
   179
  if (_nextMarkBitMap->parMark(addr)) {
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
   180
    MemRegion mr(addr, word_size);
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
   181
    count_region(mr, hr, worker_id);
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
   182
    return true;
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
   183
  }
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
   184
  return false;
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
   185
}
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
   186
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
   187
// Attempts to mark the given object and, if successful, counts
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
   188
// the object in the task/worker counting structures for the
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
   189
// given worker id.
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
   190
inline bool ConcurrentMark::par_mark_and_count(oop obj,
11583
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   191
                                               HeapRegion* hr,
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   192
                                               uint worker_id) {
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   193
  HeapWord* addr = (HeapWord*)obj;
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   194
  if (_nextMarkBitMap->parMark(addr)) {
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   195
    // Update the task specific count data for the object.
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   196
    count_object(obj, hr, worker_id);
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   197
    return true;
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   198
  }
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   199
  return false;
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   200
}
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   201
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   202
// As above - but we don't know the heap region containing the
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   203
// object and so have to supply it.
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   204
inline bool ConcurrentMark::par_mark_and_count(oop obj, uint worker_id) {
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   205
  HeapWord* addr = (HeapWord*)obj;
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   206
  HeapRegion* hr = _g1h->heap_region_containing_raw(addr);
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   207
  return par_mark_and_count(obj, hr, worker_id);
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   208
}
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   209
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   210
// Similar to the above routine but we already know the size, in words, of
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   211
// the object that we wish to mark/count
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   212
inline bool ConcurrentMark::par_mark_and_count(oop obj,
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   213
                                               size_t word_size,
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   214
                                               uint worker_id) {
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   215
  HeapWord* addr = (HeapWord*)obj;
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   216
  if (_nextMarkBitMap->parMark(addr)) {
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   217
    // Update the task specific count data for the object.
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   218
    MemRegion mr(addr, word_size);
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   219
    count_region(mr, worker_id);
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   220
    return true;
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   221
  }
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   222
  return false;
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   223
}
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   224
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   225
// Unconditionally mark the given object, and unconditinally count
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   226
// the object in the counting structures for worker id 0.
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   227
// Should *not* be called from parallel code.
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   228
inline bool ConcurrentMark::mark_and_count(oop obj, HeapRegion* hr) {
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   229
  HeapWord* addr = (HeapWord*)obj;
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   230
  _nextMarkBitMap->mark(addr);
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   231
  // Update the task specific count data for the object.
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   232
  count_object(obj, hr, 0 /* worker_id */);
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   233
  return true;
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   234
}
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   235
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   236
// As above - but we don't have the heap region containing the
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   237
// object, so we have to supply it.
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   238
inline bool ConcurrentMark::mark_and_count(oop obj) {
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   239
  HeapWord* addr = (HeapWord*)obj;
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   240
  HeapRegion* hr = _g1h->heap_region_containing_raw(addr);
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   241
  return mark_and_count(obj, hr);
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   242
}
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   243
11574
8a7fe61966c0 7121547: G1: High number mispredicted branches while iterating over the marking bitmap
johnc
parents: 11455
diff changeset
   244
inline bool CMBitMapRO::iterate(BitMapClosure* cl, MemRegion mr) {
8a7fe61966c0 7121547: G1: High number mispredicted branches while iterating over the marking bitmap
johnc
parents: 11455
diff changeset
   245
  HeapWord* start_addr = MAX2(startWord(), mr.start());
8a7fe61966c0 7121547: G1: High number mispredicted branches while iterating over the marking bitmap
johnc
parents: 11455
diff changeset
   246
  HeapWord* end_addr = MIN2(endWord(), mr.end());
8a7fe61966c0 7121547: G1: High number mispredicted branches while iterating over the marking bitmap
johnc
parents: 11455
diff changeset
   247
8a7fe61966c0 7121547: G1: High number mispredicted branches while iterating over the marking bitmap
johnc
parents: 11455
diff changeset
   248
  if (end_addr > start_addr) {
8a7fe61966c0 7121547: G1: High number mispredicted branches while iterating over the marking bitmap
johnc
parents: 11455
diff changeset
   249
    // Right-open interval [start-offset, end-offset).
8a7fe61966c0 7121547: G1: High number mispredicted branches while iterating over the marking bitmap
johnc
parents: 11455
diff changeset
   250
    BitMap::idx_t start_offset = heapWordToOffset(start_addr);
8a7fe61966c0 7121547: G1: High number mispredicted branches while iterating over the marking bitmap
johnc
parents: 11455
diff changeset
   251
    BitMap::idx_t end_offset = heapWordToOffset(end_addr);
8a7fe61966c0 7121547: G1: High number mispredicted branches while iterating over the marking bitmap
johnc
parents: 11455
diff changeset
   252
8a7fe61966c0 7121547: G1: High number mispredicted branches while iterating over the marking bitmap
johnc
parents: 11455
diff changeset
   253
    start_offset = _bm.get_next_one_offset(start_offset, end_offset);
8a7fe61966c0 7121547: G1: High number mispredicted branches while iterating over the marking bitmap
johnc
parents: 11455
diff changeset
   254
    while (start_offset < end_offset) {
8a7fe61966c0 7121547: G1: High number mispredicted branches while iterating over the marking bitmap
johnc
parents: 11455
diff changeset
   255
      HeapWord* obj_addr = offsetToHeapWord(start_offset);
8a7fe61966c0 7121547: G1: High number mispredicted branches while iterating over the marking bitmap
johnc
parents: 11455
diff changeset
   256
      oop obj = (oop) obj_addr;
8a7fe61966c0 7121547: G1: High number mispredicted branches while iterating over the marking bitmap
johnc
parents: 11455
diff changeset
   257
      if (!cl->do_bit(start_offset)) {
8a7fe61966c0 7121547: G1: High number mispredicted branches while iterating over the marking bitmap
johnc
parents: 11455
diff changeset
   258
        return false;
8a7fe61966c0 7121547: G1: High number mispredicted branches while iterating over the marking bitmap
johnc
parents: 11455
diff changeset
   259
      }
8a7fe61966c0 7121547: G1: High number mispredicted branches while iterating over the marking bitmap
johnc
parents: 11455
diff changeset
   260
      HeapWord* next_addr = MIN2(obj_addr + obj->size(), end_addr);
8a7fe61966c0 7121547: G1: High number mispredicted branches while iterating over the marking bitmap
johnc
parents: 11455
diff changeset
   261
      BitMap::idx_t next_offset = heapWordToOffset(next_addr);
8a7fe61966c0 7121547: G1: High number mispredicted branches while iterating over the marking bitmap
johnc
parents: 11455
diff changeset
   262
      start_offset = _bm.get_next_one_offset(next_offset, end_offset);
8a7fe61966c0 7121547: G1: High number mispredicted branches while iterating over the marking bitmap
johnc
parents: 11455
diff changeset
   263
    }
8a7fe61966c0 7121547: G1: High number mispredicted branches while iterating over the marking bitmap
johnc
parents: 11455
diff changeset
   264
  }
8a7fe61966c0 7121547: G1: High number mispredicted branches while iterating over the marking bitmap
johnc
parents: 11455
diff changeset
   265
  return true;
8a7fe61966c0 7121547: G1: High number mispredicted branches while iterating over the marking bitmap
johnc
parents: 11455
diff changeset
   266
}
8a7fe61966c0 7121547: G1: High number mispredicted branches while iterating over the marking bitmap
johnc
parents: 11455
diff changeset
   267
8a7fe61966c0 7121547: G1: High number mispredicted branches while iterating over the marking bitmap
johnc
parents: 11455
diff changeset
   268
inline bool CMBitMapRO::iterate(BitMapClosure* cl) {
8a7fe61966c0 7121547: G1: High number mispredicted branches while iterating over the marking bitmap
johnc
parents: 11455
diff changeset
   269
  MemRegion mr(startWord(), sizeInWords());
8a7fe61966c0 7121547: G1: High number mispredicted branches while iterating over the marking bitmap
johnc
parents: 11455
diff changeset
   270
  return iterate(cl, mr);
8a7fe61966c0 7121547: G1: High number mispredicted branches while iterating over the marking bitmap
johnc
parents: 11455
diff changeset
   271
}
8a7fe61966c0 7121547: G1: High number mispredicted branches while iterating over the marking bitmap
johnc
parents: 11455
diff changeset
   272
9994
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   273
inline void CMTask::push(oop obj) {
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   274
  HeapWord* objAddr = (HeapWord*) obj;
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   275
  assert(_g1h->is_in_g1_reserved(objAddr), "invariant");
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   276
  assert(!_g1h->is_on_master_free_list(
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   277
              _g1h->heap_region_containing((HeapWord*) objAddr)), "invariant");
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   278
  assert(!_g1h->is_obj_ill(obj), "invariant");
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   279
  assert(_nextMarkBitMap->isMarked(objAddr), "invariant");
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   280
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   281
  if (_cm->verbose_high()) {
14073
6012178c0c19 7127708: G1: change task num types from int to uint in concurrent mark
johnc
parents: 13919
diff changeset
   282
    gclog_or_tty->print_cr("[%u] pushing "PTR_FORMAT, _worker_id, (void*) obj);
9994
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   283
  }
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   284
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   285
  if (!_task_queue->push(obj)) {
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   286
    // The local task queue looks full. We need to push some entries
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   287
    // to the global stack.
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   288
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   289
    if (_cm->verbose_medium()) {
14073
6012178c0c19 7127708: G1: change task num types from int to uint in concurrent mark
johnc
parents: 13919
diff changeset
   290
      gclog_or_tty->print_cr("[%u] task queue overflow, "
9994
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   291
                             "moving entries to the global stack",
14073
6012178c0c19 7127708: G1: change task num types from int to uint in concurrent mark
johnc
parents: 13919
diff changeset
   292
                             _worker_id);
9994
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   293
    }
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   294
    move_entries_to_global_stack();
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   295
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   296
    // this should succeed since, even if we overflow the global
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   297
    // stack, we should have definitely removed some entries from the
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   298
    // local queue. So, there must be space on it.
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   299
    bool success = _task_queue->push(obj);
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   300
    assert(success, "invariant");
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   301
  }
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   302
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   303
  statsOnly( int tmp_size = _task_queue->size();
9999
5f0b78217054 7055073: G1: code cleanup in the concurrentMark.* files
tonyp
parents: 9994
diff changeset
   304
             if (tmp_size > _local_max_size) {
9994
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   305
               _local_max_size = tmp_size;
9999
5f0b78217054 7055073: G1: code cleanup in the concurrentMark.* files
tonyp
parents: 9994
diff changeset
   306
             }
9994
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   307
             ++_local_pushes );
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   308
}
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   309
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   310
// This determines whether the method below will check both the local
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   311
// and global fingers when determining whether to push on the stack a
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   312
// gray object (value 1) or whether it will only check the global one
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   313
// (value 0). The tradeoffs are that the former will be a bit more
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   314
// accurate and possibly push less on the stack, but it might also be
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   315
// a little bit slower.
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   316
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   317
#define _CHECK_BOTH_FINGERS_      1
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   318
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   319
inline void CMTask::deal_with_reference(oop obj) {
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   320
  if (_cm->verbose_high()) {
14073
6012178c0c19 7127708: G1: change task num types from int to uint in concurrent mark
johnc
parents: 13919
diff changeset
   321
    gclog_or_tty->print_cr("[%u] we're dealing with reference = "PTR_FORMAT,
6012178c0c19 7127708: G1: change task num types from int to uint in concurrent mark
johnc
parents: 13919
diff changeset
   322
                           _worker_id, (void*) obj);
9994
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   323
  }
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   324
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   325
  ++_refs_reached;
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   326
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   327
  HeapWord* objAddr = (HeapWord*) obj;
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   328
  assert(obj->is_oop_or_null(true /* ignore mark word */), "Error");
11583
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   329
  if (_g1h->is_in_g1_reserved(objAddr)) {
9994
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   330
    assert(obj != NULL, "null check is implicit");
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   331
    if (!_nextMarkBitMap->isMarked(objAddr)) {
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   332
      // Only get the containing region if the object is not marked on the
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   333
      // bitmap (otherwise, it's a waste of time since we won't do
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   334
      // anything with it).
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   335
      HeapRegion* hr = _g1h->heap_region_containing_raw(obj);
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   336
      if (!hr->obj_allocated_since_next_marking(obj)) {
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   337
        if (_cm->verbose_high()) {
14073
6012178c0c19 7127708: G1: change task num types from int to uint in concurrent mark
johnc
parents: 13919
diff changeset
   338
          gclog_or_tty->print_cr("[%u] "PTR_FORMAT" is not considered marked",
6012178c0c19 7127708: G1: change task num types from int to uint in concurrent mark
johnc
parents: 13919
diff changeset
   339
                                 _worker_id, (void*) obj);
9994
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   340
        }
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   341
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   342
        // we need to mark it first
11583
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   343
        if (_cm->par_mark_and_count(obj, hr, _marked_bytes_array, _card_bm)) {
9994
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   344
          // No OrderAccess:store_load() is needed. It is implicit in the
11583
83a7383de44c 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 11574
diff changeset
   345
          // CAS done in CMBitMap::parMark() call in the routine above.
9994
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   346
          HeapWord* global_finger = _cm->finger();
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   347
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   348
#if _CHECK_BOTH_FINGERS_
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   349
          // we will check both the local and global fingers
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   350
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   351
          if (_finger != NULL && objAddr < _finger) {
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   352
            if (_cm->verbose_high()) {
14073
6012178c0c19 7127708: G1: change task num types from int to uint in concurrent mark
johnc
parents: 13919
diff changeset
   353
              gclog_or_tty->print_cr("[%u] below the local finger ("PTR_FORMAT"), "
6012178c0c19 7127708: G1: change task num types from int to uint in concurrent mark
johnc
parents: 13919
diff changeset
   354
                                     "pushing it", _worker_id, _finger);
9994
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   355
            }
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   356
            push(obj);
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   357
          } else if (_curr_region != NULL && objAddr < _region_limit) {
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   358
            // do nothing
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   359
          } else if (objAddr < global_finger) {
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   360
            // Notice that the global finger might be moving forward
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   361
            // concurrently. This is not a problem. In the worst case, we
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   362
            // mark the object while it is above the global finger and, by
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   363
            // the time we read the global finger, it has moved forward
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   364
            // passed this object. In this case, the object will probably
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   365
            // be visited when a task is scanning the region and will also
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   366
            // be pushed on the stack. So, some duplicate work, but no
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   367
            // correctness problems.
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   368
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   369
            if (_cm->verbose_high()) {
14073
6012178c0c19 7127708: G1: change task num types from int to uint in concurrent mark
johnc
parents: 13919
diff changeset
   370
              gclog_or_tty->print_cr("[%u] below the global finger "
9994
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   371
                                     "("PTR_FORMAT"), pushing it",
14073
6012178c0c19 7127708: G1: change task num types from int to uint in concurrent mark
johnc
parents: 13919
diff changeset
   372
                                     _worker_id, global_finger);
9994
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   373
            }
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   374
            push(obj);
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   375
          } else {
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   376
            // do nothing
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   377
          }
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   378
#else // _CHECK_BOTH_FINGERS_
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   379
          // we will only check the global finger
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   380
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   381
          if (objAddr < global_finger) {
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   382
            // see long comment above
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   383
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   384
            if (_cm->verbose_high()) {
14073
6012178c0c19 7127708: G1: change task num types from int to uint in concurrent mark
johnc
parents: 13919
diff changeset
   385
              gclog_or_tty->print_cr("[%u] below the global finger "
9994
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   386
                                     "("PTR_FORMAT"), pushing it",
14073
6012178c0c19 7127708: G1: change task num types from int to uint in concurrent mark
johnc
parents: 13919
diff changeset
   387
                                     _worker_id, global_finger);
9994
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   388
            }
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   389
            push(obj);
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   390
          }
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   391
#endif // _CHECK_BOTH_FINGERS_
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   392
        }
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   393
      }
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   394
    }
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   395
  }
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   396
}
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   397
11455
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 9999
diff changeset
   398
inline void ConcurrentMark::markPrev(oop p) {
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 9999
diff changeset
   399
  assert(!_prevMarkBitMap->isMarked((HeapWord*) p), "sanity");
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 9999
diff changeset
   400
  // Note we are overriding the read-only view of the prev map here, via
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 9999
diff changeset
   401
  // the cast.
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 9999
diff changeset
   402
  ((CMBitMap*)_prevMarkBitMap)->mark((HeapWord*) p);
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 9999
diff changeset
   403
}
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 9999
diff changeset
   404
11584
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
   405
inline void ConcurrentMark::grayRoot(oop obj, size_t word_size,
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
   406
                                     uint worker_id, HeapRegion* hr) {
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
   407
  assert(obj != NULL, "pre-condition");
11455
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 9999
diff changeset
   408
  HeapWord* addr = (HeapWord*) obj;
11584
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
   409
  if (hr == NULL) {
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
   410
    hr = _g1h->heap_region_containing_raw(addr);
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
   411
  } else {
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
   412
    assert(hr->is_in(addr), "pre-condition");
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
   413
  }
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
   414
  assert(hr != NULL, "sanity");
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
   415
  // Given that we're looking for a region that contains an object
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
   416
  // header it's impossible to get back a HC region.
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
   417
  assert(!hr->continuesHumongous(), "sanity");
11455
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 9999
diff changeset
   418
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 9999
diff changeset
   419
  // We cannot assert that word_size == obj->size() given that obj
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 9999
diff changeset
   420
  // might not be in a consistent state (another thread might be in
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 9999
diff changeset
   421
  // the process of copying it). So the best thing we can do is to
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 9999
diff changeset
   422
  // assert that word_size is under an upper bound which is its
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 9999
diff changeset
   423
  // containing region's capacity.
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 9999
diff changeset
   424
  assert(word_size * HeapWordSize <= hr->capacity(),
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 9999
diff changeset
   425
         err_msg("size: "SIZE_FORMAT" capacity: "SIZE_FORMAT" "HR_FORMAT,
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 9999
diff changeset
   426
                 word_size * HeapWordSize, hr->capacity(),
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 9999
diff changeset
   427
                 HR_FORMAT_PARAMS(hr)));
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 9999
diff changeset
   428
11584
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
   429
  if (addr < hr->next_top_at_mark_start()) {
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
   430
    if (!_nextMarkBitMap->isMarked(addr)) {
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
   431
      par_mark_and_count(obj, word_size, hr, worker_id);
e1df4d08a1f4 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 11583
diff changeset
   432
    }
11455
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 9999
diff changeset
   433
  }
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 9999
diff changeset
   434
}
a6ab3d8b9a4c 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 9999
diff changeset
   435
9994
efb74fdbd46e 7046558: G1: concurrent marking optimizations
tonyp
parents:
diff changeset
   436
#endif // SHARE_VM_GC_IMPLEMENTATION_G1_CONCURRENTMARK_INLINE_HPP