src/hotspot/share/memory/metaspace/blockListArray.hpp
author stuefe
Tue, 26 Nov 2019 11:29:20 +0100
branchstuefe-new-metaspace-branch
changeset 59271 1558266946de
parent 59257 990b1fed3b47
permissions -rw-r--r--
Improve BLA and LOM tests
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
59238
6ce12ce00d3e Factor out block list array from LOM since we may use it elsewhere
stuefe
parents:
diff changeset
     1
/*
6ce12ce00d3e Factor out block list array from LOM since we may use it elsewhere
stuefe
parents:
diff changeset
     2
 * Copyright (c) 2019, SAP SE. All rights reserved.
6ce12ce00d3e Factor out block list array from LOM since we may use it elsewhere
stuefe
parents:
diff changeset
     3
 * Copyright (c) 2019, Oracle and/or its affiliates. All rights reserved.
6ce12ce00d3e Factor out block list array from LOM since we may use it elsewhere
stuefe
parents:
diff changeset
     4
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
6ce12ce00d3e Factor out block list array from LOM since we may use it elsewhere
stuefe
parents:
diff changeset
     5
 *
6ce12ce00d3e Factor out block list array from LOM since we may use it elsewhere
stuefe
parents:
diff changeset
     6
 * This code is free software; you can redistribute it and/or modify it
6ce12ce00d3e Factor out block list array from LOM since we may use it elsewhere
stuefe
parents:
diff changeset
     7
 * under the terms of the GNU General Public License version 2 only, as
6ce12ce00d3e Factor out block list array from LOM since we may use it elsewhere
stuefe
parents:
diff changeset
     8
 * published by the Free Software Foundation.
6ce12ce00d3e Factor out block list array from LOM since we may use it elsewhere
stuefe
parents:
diff changeset
     9
 *
6ce12ce00d3e Factor out block list array from LOM since we may use it elsewhere
stuefe
parents:
diff changeset
    10
 * This code is distributed in the hope that it will be useful, but WITHOUT
6ce12ce00d3e Factor out block list array from LOM since we may use it elsewhere
stuefe
parents:
diff changeset
    11
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
6ce12ce00d3e Factor out block list array from LOM since we may use it elsewhere
stuefe
parents:
diff changeset
    12
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
6ce12ce00d3e Factor out block list array from LOM since we may use it elsewhere
stuefe
parents:
diff changeset
    13
 * version 2 for more details (a copy is included in the LICENSE file that
6ce12ce00d3e Factor out block list array from LOM since we may use it elsewhere
stuefe
parents:
diff changeset
    14
 * accompanied this code).
6ce12ce00d3e Factor out block list array from LOM since we may use it elsewhere
stuefe
parents:
diff changeset
    15
 *
6ce12ce00d3e Factor out block list array from LOM since we may use it elsewhere
stuefe
parents:
diff changeset
    16
 * You should have received a copy of the GNU General Public License version
6ce12ce00d3e Factor out block list array from LOM since we may use it elsewhere
stuefe
parents:
diff changeset
    17
 * 2 along with this work; if not, write to the Free Software Foundation,
6ce12ce00d3e Factor out block list array from LOM since we may use it elsewhere
stuefe
parents:
diff changeset
    18
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
6ce12ce00d3e Factor out block list array from LOM since we may use it elsewhere
stuefe
parents:
diff changeset
    19
 *
6ce12ce00d3e Factor out block list array from LOM since we may use it elsewhere
stuefe
parents:
diff changeset
    20
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
6ce12ce00d3e Factor out block list array from LOM since we may use it elsewhere
stuefe
parents:
diff changeset
    21
 * or visit www.oracle.com if you need additional information or have any
6ce12ce00d3e Factor out block list array from LOM since we may use it elsewhere
stuefe
parents:
diff changeset
    22
 * questions.
6ce12ce00d3e Factor out block list array from LOM since we may use it elsewhere
stuefe
parents:
diff changeset
    23
 *
6ce12ce00d3e Factor out block list array from LOM since we may use it elsewhere
stuefe
parents:
diff changeset
    24
 */
6ce12ce00d3e Factor out block list array from LOM since we may use it elsewhere
stuefe
parents:
diff changeset
    25
6ce12ce00d3e Factor out block list array from LOM since we may use it elsewhere
stuefe
parents:
diff changeset
    26
#ifndef SHARE_MEMORY_METASPACE_BLOCKLISTARRAY_HPP
6ce12ce00d3e Factor out block list array from LOM since we may use it elsewhere
stuefe
parents:
diff changeset
    27
#define SHARE_MEMORY_METASPACE_BLOCKLISTARRAY_HPP
6ce12ce00d3e Factor out block list array from LOM since we may use it elsewhere
stuefe
parents:
diff changeset
    28
6ce12ce00d3e Factor out block list array from LOM since we may use it elsewhere
stuefe
parents:
diff changeset
    29
#include "memory/allocation.hpp"
6ce12ce00d3e Factor out block list array from LOM since we may use it elsewhere
stuefe
parents:
diff changeset
    30
#include "utilities/debug.hpp"
6ce12ce00d3e Factor out block list array from LOM since we may use it elsewhere
stuefe
parents:
diff changeset
    31
#include "utilities/globalDefinitions.hpp"
6ce12ce00d3e Factor out block list array from LOM since we may use it elsewhere
stuefe
parents:
diff changeset
    32
6ce12ce00d3e Factor out block list array from LOM since we may use it elsewhere
stuefe
parents:
diff changeset
    33
6ce12ce00d3e Factor out block list array from LOM since we may use it elsewhere
stuefe
parents:
diff changeset
    34
class outputStream;
6ce12ce00d3e Factor out block list array from LOM since we may use it elsewhere
stuefe
parents:
diff changeset
    35
6ce12ce00d3e Factor out block list array from LOM since we may use it elsewhere
stuefe
parents:
diff changeset
    36
namespace metaspace {
6ce12ce00d3e Factor out block list array from LOM since we may use it elsewhere
stuefe
parents:
diff changeset
    37
6ce12ce00d3e Factor out block list array from LOM since we may use it elsewhere
stuefe
parents:
diff changeset
    38
struct block_t {
6ce12ce00d3e Factor out block list array from LOM since we may use it elsewhere
stuefe
parents:
diff changeset
    39
  block_t* next;
6ce12ce00d3e Factor out block list array from LOM since we may use it elsewhere
stuefe
parents:
diff changeset
    40
  size_t size;
6ce12ce00d3e Factor out block list array from LOM since we may use it elsewhere
stuefe
parents:
diff changeset
    41
};
6ce12ce00d3e Factor out block list array from LOM since we may use it elsewhere
stuefe
parents:
diff changeset
    42
6ce12ce00d3e Factor out block list array from LOM since we may use it elsewhere
stuefe
parents:
diff changeset
    43
struct block_stats_t {
6ce12ce00d3e Factor out block list array from LOM since we may use it elsewhere
stuefe
parents:
diff changeset
    44
  size_t word_size;
6ce12ce00d3e Factor out block list array from LOM since we may use it elsewhere
stuefe
parents:
diff changeset
    45
  int num_blocks;
6ce12ce00d3e Factor out block list array from LOM since we may use it elsewhere
stuefe
parents:
diff changeset
    46
};
6ce12ce00d3e Factor out block list array from LOM since we may use it elsewhere
stuefe
parents:
diff changeset
    47
6ce12ce00d3e Factor out block list array from LOM since we may use it elsewhere
stuefe
parents:
diff changeset
    48
// A bitmap keeping track of which list is occupied. Smallest list corresponds to lowest order bit.
6ce12ce00d3e Factor out block list array from LOM since we may use it elsewhere
stuefe
parents:
diff changeset
    49
// 1 means list is not empty, 0 means list is empty.
59257
990b1fed3b47 Improve comments
stuefe
parents: 59238
diff changeset
    50
class BlockListArrayMask {
59238
6ce12ce00d3e Factor out block list array from LOM since we may use it elsewhere
stuefe
parents:
diff changeset
    51
6ce12ce00d3e Factor out block list array from LOM since we may use it elsewhere
stuefe
parents:
diff changeset
    52
  typedef uint32_t mask_type;
6ce12ce00d3e Factor out block list array from LOM since we may use it elsewhere
stuefe
parents:
diff changeset
    53
  mask_type _mask;
6ce12ce00d3e Factor out block list array from LOM since we may use it elsewhere
stuefe
parents:
diff changeset
    54
6ce12ce00d3e Factor out block list array from LOM since we may use it elsewhere
stuefe
parents:
diff changeset
    55
  static mask_type mask_for_pos(int pos) { return 1 << pos; }
6ce12ce00d3e Factor out block list array from LOM since we may use it elsewhere
stuefe
parents:
diff changeset
    56
6ce12ce00d3e Factor out block list array from LOM since we may use it elsewhere
stuefe
parents:
diff changeset
    57
public:
6ce12ce00d3e Factor out block list array from LOM since we may use it elsewhere
stuefe
parents:
diff changeset
    58
59257
990b1fed3b47 Improve comments
stuefe
parents: 59238
diff changeset
    59
  BlockListArrayMask() : _mask(0) {}
59238
6ce12ce00d3e Factor out block list array from LOM since we may use it elsewhere
stuefe
parents:
diff changeset
    60
6ce12ce00d3e Factor out block list array from LOM since we may use it elsewhere
stuefe
parents:
diff changeset
    61
  bool all_zero() const          { return _mask == 0; }
6ce12ce00d3e Factor out block list array from LOM since we may use it elsewhere
stuefe
parents:
diff changeset
    62
6ce12ce00d3e Factor out block list array from LOM since we may use it elsewhere
stuefe
parents:
diff changeset
    63
  bool get_bit(int pos) const    { return (_mask & mask_for_pos(pos)) != 0 ? true : false; }
6ce12ce00d3e Factor out block list array from LOM since we may use it elsewhere
stuefe
parents:
diff changeset
    64
  void set_bit(int pos)          { _mask |= mask_for_pos(pos); }
6ce12ce00d3e Factor out block list array from LOM since we may use it elsewhere
stuefe
parents:
diff changeset
    65
  void clr_bit(int pos)          { _mask &= ~mask_for_pos(pos); }
6ce12ce00d3e Factor out block list array from LOM since we may use it elsewhere
stuefe
parents:
diff changeset
    66
59271
1558266946de Improve BLA and LOM tests
stuefe
parents: 59257
diff changeset
    67
  // Starting at the position following pos, find the 1 bit.
1558266946de Improve BLA and LOM tests
stuefe
parents: 59257
diff changeset
    68
  // Return its position, or -1 if not found.
59238
6ce12ce00d3e Factor out block list array from LOM since we may use it elsewhere
stuefe
parents:
diff changeset
    69
  inline int find_next_set_bit(int pos) const;
6ce12ce00d3e Factor out block list array from LOM since we may use it elsewhere
stuefe
parents:
diff changeset
    70
6ce12ce00d3e Factor out block list array from LOM since we may use it elsewhere
stuefe
parents:
diff changeset
    71
  static int size() { return sizeof(mask_type) * 8; }
6ce12ce00d3e Factor out block list array from LOM since we may use it elsewhere
stuefe
parents:
diff changeset
    72
6ce12ce00d3e Factor out block list array from LOM since we may use it elsewhere
stuefe
parents:
diff changeset
    73
};
6ce12ce00d3e Factor out block list array from LOM since we may use it elsewhere
stuefe
parents:
diff changeset
    74
6ce12ce00d3e Factor out block list array from LOM since we may use it elsewhere
stuefe
parents:
diff changeset
    75
template <
6ce12ce00d3e Factor out block list array from LOM since we may use it elsewhere
stuefe
parents:
diff changeset
    76
  size_t min_word_size,
6ce12ce00d3e Factor out block list array from LOM since we may use it elsewhere
stuefe
parents:
diff changeset
    77
  size_t spread,
6ce12ce00d3e Factor out block list array from LOM since we may use it elsewhere
stuefe
parents:
diff changeset
    78
  int num_bins
6ce12ce00d3e Factor out block list array from LOM since we may use it elsewhere
stuefe
parents:
diff changeset
    79
>
6ce12ce00d3e Factor out block list array from LOM since we may use it elsewhere
stuefe
parents:
diff changeset
    80
class BlockListArray {
6ce12ce00d3e Factor out block list array from LOM since we may use it elsewhere
stuefe
parents:
diff changeset
    81
6ce12ce00d3e Factor out block list array from LOM since we may use it elsewhere
stuefe
parents:
diff changeset
    82
  STATIC_ASSERT(sizeof(block_t) <= (min_word_size * BytesPerWord));
6ce12ce00d3e Factor out block list array from LOM since we may use it elsewhere
stuefe
parents:
diff changeset
    83
6ce12ce00d3e Factor out block list array from LOM since we may use it elsewhere
stuefe
parents:
diff changeset
    84
  block_t* _bins[num_bins];
6ce12ce00d3e Factor out block list array from LOM since we may use it elsewhere
stuefe
parents:
diff changeset
    85
59257
990b1fed3b47 Improve comments
stuefe
parents: 59238
diff changeset
    86
  BlockListArrayMask _map;
59238
6ce12ce00d3e Factor out block list array from LOM since we may use it elsewhere
stuefe
parents:
diff changeset
    87
6ce12ce00d3e Factor out block list array from LOM since we may use it elsewhere
stuefe
parents:
diff changeset
    88
  // e.g. spread = 4
6ce12ce00d3e Factor out block list array from LOM since we may use it elsewhere
stuefe
parents:
diff changeset
    89
  //
6ce12ce00d3e Factor out block list array from LOM since we may use it elsewhere
stuefe
parents:
diff changeset
    90
  // sz    bno (put)  bno (get)
6ce12ce00d3e Factor out block list array from LOM since we may use it elsewhere
stuefe
parents:
diff changeset
    91
  //         (guarant)
6ce12ce00d3e Factor out block list array from LOM since we may use it elsewhere
stuefe
parents:
diff changeset
    92
  // 0     00         00
6ce12ce00d3e Factor out block list array from LOM since we may use it elsewhere
stuefe
parents:
diff changeset
    93
  // 1     00         01
6ce12ce00d3e Factor out block list array from LOM since we may use it elsewhere
stuefe
parents:
diff changeset
    94
  // 2     00         01
6ce12ce00d3e Factor out block list array from LOM since we may use it elsewhere
stuefe
parents:
diff changeset
    95
  // 3     00         01
6ce12ce00d3e Factor out block list array from LOM since we may use it elsewhere
stuefe
parents:
diff changeset
    96
  // 4     01         01
6ce12ce00d3e Factor out block list array from LOM since we may use it elsewhere
stuefe
parents:
diff changeset
    97
  // 5     01         02
6ce12ce00d3e Factor out block list array from LOM since we may use it elsewhere
stuefe
parents:
diff changeset
    98
  // 6     01         02
6ce12ce00d3e Factor out block list array from LOM since we may use it elsewhere
stuefe
parents:
diff changeset
    99
  // 7     01         02
6ce12ce00d3e Factor out block list array from LOM since we may use it elsewhere
stuefe
parents:
diff changeset
   100
  // 8     02         02
6ce12ce00d3e Factor out block list array from LOM since we may use it elsewhere
stuefe
parents:
diff changeset
   101
  // 9     02         03
6ce12ce00d3e Factor out block list array from LOM since we may use it elsewhere
stuefe
parents:
diff changeset
   102
  // 10    02         03
6ce12ce00d3e Factor out block list array from LOM since we may use it elsewhere
stuefe
parents:
diff changeset
   103
  // 11    02         03
6ce12ce00d3e Factor out block list array from LOM since we may use it elsewhere
stuefe
parents:
diff changeset
   104
  //
6ce12ce00d3e Factor out block list array from LOM since we may use it elsewhere
stuefe
parents:
diff changeset
   105
  // put -> no = wordsize / spread
6ce12ce00d3e Factor out block list array from LOM since we may use it elsewhere
stuefe
parents:
diff changeset
   106
  //
6ce12ce00d3e Factor out block list array from LOM since we may use it elsewhere
stuefe
parents:
diff changeset
   107
  // get -> no = (req_wordsize + spread - 1) / spread
6ce12ce00d3e Factor out block list array from LOM since we may use it elsewhere
stuefe
parents:
diff changeset
   108
6ce12ce00d3e Factor out block list array from LOM since we may use it elsewhere
stuefe
parents:
diff changeset
   109
  // The bin number for a given word size.
6ce12ce00d3e Factor out block list array from LOM since we may use it elsewhere
stuefe
parents:
diff changeset
   110
  static int bin_for_size(size_t word_size) {
6ce12ce00d3e Factor out block list array from LOM since we may use it elsewhere
stuefe
parents:
diff changeset
   111
    assert(word_size >= min_word_size && word_size < maximal_word_size(),
6ce12ce00d3e Factor out block list array from LOM since we may use it elsewhere
stuefe
parents:
diff changeset
   112
           "Word size oob (" SIZE_FORMAT ")", word_size);
6ce12ce00d3e Factor out block list array from LOM since we may use it elsewhere
stuefe
parents:
diff changeset
   113
    return (word_size - min_word_size) / spread;
6ce12ce00d3e Factor out block list array from LOM since we may use it elsewhere
stuefe
parents:
diff changeset
   114
  }
6ce12ce00d3e Factor out block list array from LOM since we may use it elsewhere
stuefe
parents:
diff changeset
   115
6ce12ce00d3e Factor out block list array from LOM since we may use it elsewhere
stuefe
parents:
diff changeset
   116
  // [minimal, maximal) size of blocks which are held in a bin.
6ce12ce00d3e Factor out block list array from LOM since we may use it elsewhere
stuefe
parents:
diff changeset
   117
  // Note that when taking a block out of the bin, only the minimum block size
6ce12ce00d3e Factor out block list array from LOM since we may use it elsewhere
stuefe
parents:
diff changeset
   118
  // is guaranteed.
6ce12ce00d3e Factor out block list array from LOM since we may use it elsewhere
stuefe
parents:
diff changeset
   119
  static size_t minimal_word_size_in_bin(int bno) {
6ce12ce00d3e Factor out block list array from LOM since we may use it elsewhere
stuefe
parents:
diff changeset
   120
    return min_word_size + (bno * spread);
6ce12ce00d3e Factor out block list array from LOM since we may use it elsewhere
stuefe
parents:
diff changeset
   121
  }
6ce12ce00d3e Factor out block list array from LOM since we may use it elsewhere
stuefe
parents:
diff changeset
   122
  static size_t maximal_word_size_in_bin(int bno) {
6ce12ce00d3e Factor out block list array from LOM since we may use it elsewhere
stuefe
parents:
diff changeset
   123
    return minimal_word_size_in_bin(bno) + spread;
6ce12ce00d3e Factor out block list array from LOM since we may use it elsewhere
stuefe
parents:
diff changeset
   124
  }
6ce12ce00d3e Factor out block list array from LOM since we may use it elsewhere
stuefe
parents:
diff changeset
   125
6ce12ce00d3e Factor out block list array from LOM since we may use it elsewhere
stuefe
parents:
diff changeset
   126
public:
6ce12ce00d3e Factor out block list array from LOM since we may use it elsewhere
stuefe
parents:
diff changeset
   127
6ce12ce00d3e Factor out block list array from LOM since we may use it elsewhere
stuefe
parents:
diff changeset
   128
  BlockListArray() : _map() {
59257
990b1fed3b47 Improve comments
stuefe
parents: 59238
diff changeset
   129
    assert(BlockListArrayMask::size() >= num_bins, "Map too small.");
59238
6ce12ce00d3e Factor out block list array from LOM since we may use it elsewhere
stuefe
parents:
diff changeset
   130
    ::memset(_bins, 0, sizeof(_bins));
6ce12ce00d3e Factor out block list array from LOM since we may use it elsewhere
stuefe
parents:
diff changeset
   131
  }
6ce12ce00d3e Factor out block list array from LOM since we may use it elsewhere
stuefe
parents:
diff changeset
   132
6ce12ce00d3e Factor out block list array from LOM since we may use it elsewhere
stuefe
parents:
diff changeset
   133
  // [min, max) word size
6ce12ce00d3e Factor out block list array from LOM since we may use it elsewhere
stuefe
parents:
diff changeset
   134
  static size_t minimal_word_size() { return min_word_size; }
6ce12ce00d3e Factor out block list array from LOM since we may use it elsewhere
stuefe
parents:
diff changeset
   135
  static size_t maximal_word_size() { return min_word_size + (spread * num_bins); }
6ce12ce00d3e Factor out block list array from LOM since we may use it elsewhere
stuefe
parents:
diff changeset
   136
6ce12ce00d3e Factor out block list array from LOM since we may use it elsewhere
stuefe
parents:
diff changeset
   137
  inline void put(MetaWord* p, size_t word_size);
6ce12ce00d3e Factor out block list array from LOM since we may use it elsewhere
stuefe
parents:
diff changeset
   138
6ce12ce00d3e Factor out block list array from LOM since we may use it elsewhere
stuefe
parents:
diff changeset
   139
  inline block_t* get(size_t word_size);
6ce12ce00d3e Factor out block list array from LOM since we may use it elsewhere
stuefe
parents:
diff changeset
   140
6ce12ce00d3e Factor out block list array from LOM since we may use it elsewhere
stuefe
parents:
diff changeset
   141
#ifdef ASSERT
6ce12ce00d3e Factor out block list array from LOM since we may use it elsewhere
stuefe
parents:
diff changeset
   142
  void verify() const;
6ce12ce00d3e Factor out block list array from LOM since we may use it elsewhere
stuefe
parents:
diff changeset
   143
#endif
6ce12ce00d3e Factor out block list array from LOM since we may use it elsewhere
stuefe
parents:
diff changeset
   144
6ce12ce00d3e Factor out block list array from LOM since we may use it elsewhere
stuefe
parents:
diff changeset
   145
  void statistics(block_stats_t* stats) const;
6ce12ce00d3e Factor out block list array from LOM since we may use it elsewhere
stuefe
parents:
diff changeset
   146
6ce12ce00d3e Factor out block list array from LOM since we may use it elsewhere
stuefe
parents:
diff changeset
   147
  void print(outputStream* st) const;
6ce12ce00d3e Factor out block list array from LOM since we may use it elsewhere
stuefe
parents:
diff changeset
   148
59271
1558266946de Improve BLA and LOM tests
stuefe
parents: 59257
diff changeset
   149
  // Returns true if the array contains no blocks.
1558266946de Improve BLA and LOM tests
stuefe
parents: 59257
diff changeset
   150
  bool is_empty() const { return _map.all_zero(); }
1558266946de Improve BLA and LOM tests
stuefe
parents: 59257
diff changeset
   151
59238
6ce12ce00d3e Factor out block list array from LOM since we may use it elsewhere
stuefe
parents:
diff changeset
   152
};
6ce12ce00d3e Factor out block list array from LOM since we may use it elsewhere
stuefe
parents:
diff changeset
   153
6ce12ce00d3e Factor out block list array from LOM since we may use it elsewhere
stuefe
parents:
diff changeset
   154
6ce12ce00d3e Factor out block list array from LOM since we may use it elsewhere
stuefe
parents:
diff changeset
   155
} // namespace metaspace
6ce12ce00d3e Factor out block list array from LOM since we may use it elsewhere
stuefe
parents:
diff changeset
   156
6ce12ce00d3e Factor out block list array from LOM since we may use it elsewhere
stuefe
parents:
diff changeset
   157
#endif // SHARE_MEMORY_METASPACE_BLOCKLISTARRAY_HPP