src/share/vm/gc_implementation/g1/heapRegionSeq.hpp

Sat, 06 Oct 2012 01:17:44 -0700

author
johnc
date
Sat, 06 Oct 2012 01:17:44 -0700
changeset 4173
8a5ea0a9ccc4
parent 3900
d2a62e0f25eb
child 5074
b0d20fa374b4
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>

     1 /*
     2  * Copyright (c) 2001, 2012, Oracle and/or its affiliates. All rights reserved.
     3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
     4  *
     5  * This code is free software; you can redistribute it and/or modify it
     6  * under the terms of the GNU General Public License version 2 only, as
     7  * published by the Free Software Foundation.
     8  *
     9  * This code is distributed in the hope that it will be useful, but WITHOUT
    10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    12  * version 2 for more details (a copy is included in the LICENSE file that
    13  * accompanied this code).
    14  *
    15  * You should have received a copy of the GNU General Public License version
    16  * 2 along with this work; if not, write to the Free Software Foundation,
    17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    18  *
    19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
    20  * or visit www.oracle.com if you need additional information or have any
    21  * questions.
    22  *
    23  */
    25 #ifndef SHARE_VM_GC_IMPLEMENTATION_G1_HEAPREGIONSEQ_HPP
    26 #define SHARE_VM_GC_IMPLEMENTATION_G1_HEAPREGIONSEQ_HPP
    28 class HeapRegion;
    29 class HeapRegionClosure;
    30 class FreeRegionList;
    32 // This class keeps track of the region metadata (i.e., HeapRegion
    33 // instances). They are kept in the _regions array in address
    34 // order. A region's index in the array corresponds to its index in
    35 // the heap (i.e., 0 is the region at the bottom of the heap, 1 is
    36 // the one after it, etc.). Two regions that are consecutive in the
    37 // array should also be adjacent in the address space (i.e.,
    38 // region(i).end() == region(i+1).bottom().
    39 //
    40 // We create a HeapRegion when we commit the region's address space
    41 // for the first time. When we uncommit the address space of a
    42 // region we retain the HeapRegion to be able to re-use it in the
    43 // future (in case we recommit it).
    44 //
    45 // We keep track of three lengths:
    46 //
    47 // * _length (returned by length()) is the number of currently
    48 //   committed regions.
    49 // * _allocated_length (not exposed outside this class) is the
    50 //   number of regions for which we have HeapRegions.
    51 // * _max_length (returned by max_length()) is the maximum number of
    52 //   regions the heap can have.
    53 //
    54 // and maintain that: _length <= _allocated_length <= _max_length
    56 class HeapRegionSeq: public CHeapObj<mtGC> {
    57   friend class VMStructs;
    59   // The array that holds the HeapRegions.
    60   HeapRegion** _regions;
    62   // Version of _regions biased to address 0
    63   HeapRegion** _regions_biased;
    65   // The number of regions committed in the heap.
    66   uint _length;
    68   // The address of the first reserved word in the heap.
    69   HeapWord* _heap_bottom;
    71   // The address of the last reserved word in the heap - 1.
    72   HeapWord* _heap_end;
    74   // The log of the region byte size.
    75   uint _region_shift;
    77   // A hint for which index to start searching from for humongous
    78   // allocations.
    79   uint _next_search_index;
    81   // The number of regions for which we have allocated HeapRegions for.
    82   uint _allocated_length;
    84   // The maximum number of regions in the heap.
    85   uint _max_length;
    87   // Find a contiguous set of empty regions of length num, starting
    88   // from the given index.
    89   uint find_contiguous_from(uint from, uint num);
    91   // Map a heap address to a biased region index. Assume that the
    92   // address is valid.
    93   inline uintx addr_to_index_biased(HeapWord* addr) const;
    95   void increment_length(uint* length) {
    96     assert(*length < _max_length, "pre-condition");
    97     *length += 1;
    98   }
   100   void decrement_length(uint* length) {
   101     assert(*length > 0, "pre-condition");
   102     *length -= 1;
   103   }
   105  public:
   106   // Empty contructor, we'll initialize it with the initialize() method.
   107   HeapRegionSeq() { }
   109   void initialize(HeapWord* bottom, HeapWord* end, uint max_length);
   111   // Return the HeapRegion at the given index. Assume that the index
   112   // is valid.
   113   inline HeapRegion* at(uint index) const;
   115   // If addr is within the committed space return its corresponding
   116   // HeapRegion, otherwise return NULL.
   117   inline HeapRegion* addr_to_region(HeapWord* addr) const;
   119   // Return the HeapRegion that corresponds to the given
   120   // address. Assume the address is valid.
   121   inline HeapRegion* addr_to_region_unsafe(HeapWord* addr) const;
   123   // Return the number of regions that have been committed in the heap.
   124   uint length() const { return _length; }
   126   // Return the maximum number of regions in the heap.
   127   uint max_length() const { return _max_length; }
   129   // Expand the sequence to reflect that the heap has grown from
   130   // old_end to new_end. Either create new HeapRegions, or re-use
   131   // existing ones, and return them in the given list. Returns the
   132   // memory region that covers the newly-created regions. If a
   133   // HeapRegion allocation fails, the result memory region might be
   134   // smaller than the desired one.
   135   MemRegion expand_by(HeapWord* old_end, HeapWord* new_end,
   136                       FreeRegionList* list);
   138   // Return the number of contiguous regions at the end of the sequence
   139   // that are available for allocation.
   140   uint free_suffix();
   142   // Find a contiguous set of empty regions of length num and return
   143   // the index of the first region or G1_NULL_HRS_INDEX if the
   144   // search was unsuccessful.
   145   uint find_contiguous(uint num);
   147   // Apply blk->doHeapRegion() on all committed regions in address order,
   148   // terminating the iteration early if doHeapRegion() returns true.
   149   void iterate(HeapRegionClosure* blk) const;
   151   // As above, but start the iteration from hr and loop around. If hr
   152   // is NULL, we start from the first region in the heap.
   153   void iterate_from(HeapRegion* hr, HeapRegionClosure* blk) const;
   155   // Tag as uncommitted as many regions that are completely free as
   156   // possible, up to shrink_bytes, from the suffix of the committed
   157   // sequence. Return a MemRegion that corresponds to the address
   158   // range of the uncommitted regions. Assume shrink_bytes is page and
   159   // heap region aligned.
   160   MemRegion shrink_by(size_t shrink_bytes, uint* num_regions_deleted);
   162   // Do some sanity checking.
   163   void verify_optional() PRODUCT_RETURN;
   164 };
   166 #endif // SHARE_VM_GC_IMPLEMENTATION_G1_HEAPREGIONSEQ_HPP

mercurial