src/hotspot/share/jfr/recorder/service/jfrMemorySizer.cpp
author egahlin
Tue, 15 May 2018 20:24:34 +0200
changeset 50113 caf115bb98ad
permissions -rw-r--r--
8199712: Flight Recorder Reviewed-by: coleenp, ihse, erikj, dsamersoff, mseledtsov, egahlin, mgronlun Contributed-by: erik.gahlin@oracle.com, markus.gronlund@oracle.com
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
     1
/*
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
     2
 * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved.
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
     4
 *
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
     7
 * published by the Free Software Foundation.
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
     8
 *
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    13
 * accompanied this code).
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    14
 *
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    18
 *
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    20
 * or visit www.oracle.com if you need additional information or have any
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    21
 * questions.
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    22
 *
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    23
 */
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    24
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    25
#include "precompiled.hpp"
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    26
#include "jfr/recorder/service/jfrMemorySizer.hpp"
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    27
#include "logging/log.hpp"
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    28
#include "runtime/os.hpp"
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    29
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    30
const julong MAX_ADJUSTED_GLOBAL_BUFFER_SIZE = 1 * M;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    31
const julong MIN_ADJUSTED_GLOBAL_BUFFER_SIZE_CUTOFF = 512 * K;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    32
const julong MIN_GLOBAL_BUFFER_SIZE = 64 * K;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    33
// implies at least 2 * MIN_GLOBAL_BUFFER SIZE
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    34
const julong MIN_BUFFER_COUNT = 2;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    35
// MAX global buffer count open ended
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    36
const julong DEFAULT_BUFFER_COUNT = 20;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    37
// MAX thread local buffer size == size of a single global buffer (runtime determined)
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    38
// DEFAULT thread local buffer size = 2 * os page size (runtime determined)
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    39
const julong MIN_THREAD_BUFFER_SIZE = 4 * K;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    40
const julong MIN_MEMORY_SIZE = 1 * M;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    41
const julong DEFAULT_MEMORY_SIZE = 10 * M;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    42
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    43
//
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    44
// In pages:
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    45
//
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    46
// units = total_pages / per_unit_pages
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    47
//
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    48
static julong div_pages(julong& total_pages, julong& per_unit_pages) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    49
  assert(total_pages > 0, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    50
  assert(per_unit_pages > 0, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    51
  assert(total_pages >= per_unit_pages, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    52
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    53
  const julong units = total_pages / per_unit_pages;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    54
  const julong rem = total_pages % per_unit_pages;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    55
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    56
  assert(units > 0, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    57
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    58
  if (rem > 0) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    59
    total_pages -= rem % units;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    60
    per_unit_pages += rem / units;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    61
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    62
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    63
  assert(per_unit_pages > 0, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    64
  assert(total_pages % units == 0, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    65
  assert(units * per_unit_pages == total_pages, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    66
  assert(units == total_pages / per_unit_pages, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    67
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    68
  return units;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    69
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    70
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    71
static void page_size_align_up(julong& value) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    72
  static const julong alignment = os::vm_page_size() - 1;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    73
  value = (value + alignment) & ~alignment;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    74
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    75
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    76
//
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    77
// In bytes:
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    78
// units = total_bytes / per_unit_bytes
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    79
//
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    80
static julong div_total_by_per_unit(julong& total_bytes, julong& per_unit_bytes) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    81
  assert(total_bytes > 0, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    82
  assert(per_unit_bytes > 0, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    83
  assert(total_bytes >= per_unit_bytes, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    84
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    85
  page_size_align_up(total_bytes);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    86
  assert(total_bytes % os::vm_page_size() == 0, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    87
  julong total_pages = total_bytes / os::vm_page_size();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    88
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    89
  page_size_align_up(per_unit_bytes);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    90
  assert(per_unit_bytes % os::vm_page_size() == 0, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    91
  julong per_unit_pages = per_unit_bytes / os::vm_page_size();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    92
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    93
  const julong units = div_pages(total_pages, per_unit_pages);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    94
  assert(units > 0, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    95
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    96
  total_bytes = total_pages * os::vm_page_size();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    97
  per_unit_bytes = per_unit_pages * os::vm_page_size();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    98
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    99
  assert(per_unit_bytes > 0, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   100
  assert(total_bytes / per_unit_bytes == units, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   101
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   102
  return units;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   103
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   104
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   105
//
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   106
// per_unit_bytes = total_bytes / units
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   107
//
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   108
static julong div_total_by_units(julong& total_bytes, julong& units) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   109
  page_size_align_up(total_bytes);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   110
  assert(total_bytes % os::vm_page_size() == 0, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   111
  julong total_pages = total_bytes / os::vm_page_size();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   112
  assert(units > 0, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   114
  julong per_unit_pages = total_pages <= units ? 1 : total_pages / units;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   115
  units = div_pages(total_pages, per_unit_pages);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   116
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   117
  julong per_unit_bytes = per_unit_pages * os::vm_page_size();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   118
  assert(per_unit_bytes % os::vm_page_size() == 0, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   119
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   120
  total_bytes = total_pages * os::vm_page_size();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   121
  assert(total_bytes % os::vm_page_size() == 0, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   122
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   123
  assert(total_bytes % units == 0, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   124
  assert(total_bytes / units == per_unit_bytes, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   125
  assert(units * per_unit_bytes == total_bytes, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   126
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   127
  return per_unit_bytes;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   128
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   129
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   130
//
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   131
// total_bytes = per_unit_bytes * units;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   132
//
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   133
static julong multiply(julong& per_unit_bytes, julong& units) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   134
  page_size_align_up(per_unit_bytes);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   135
  assert(per_unit_bytes % os::vm_page_size() == 0, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   136
  assert(units > 0, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   137
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   138
  julong total_bytes = per_unit_bytes * units;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   139
  assert(total_bytes % os::vm_page_size() == 0, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   140
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   141
  assert(total_bytes % units == 0, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   142
  assert(total_bytes / units == per_unit_bytes, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   143
  assert(units * per_unit_bytes == total_bytes, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   144
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   145
  return total_bytes;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   146
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   147
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   148
// Total_bytes is explicitly set.
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   149
//
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   150
// Deduce other parameters by delegating to a sizing policy
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   151
template <typename SizingPolicy>
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   152
static julong adjust(JfrMemoryOptions* options) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   153
  page_size_align_up(options->memory_size);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   154
  assert(options->memory_size % os::vm_page_size() == 0, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   155
  julong total_pages = options->memory_size / os::vm_page_size();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   156
  assert(options->buffer_count > 0, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   157
  julong per_unit_pages = total_pages / options->buffer_count;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   158
  page_size_align_up(options->thread_buffer_size);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   159
  assert(options->thread_buffer_size % os::vm_page_size() == 0, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   160
  julong thread_buffer_pages = options->thread_buffer_size / os::vm_page_size();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   161
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   162
  SizingPolicy::adjust(total_pages, per_unit_pages, options->buffer_count, thread_buffer_pages, options->thread_buffer_size_configured);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   163
  assert(options->buffer_count * per_unit_pages == total_pages, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   164
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   165
  const julong per_unit_bytes = per_unit_pages * os::vm_page_size();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   166
  options->memory_size = total_pages * os::vm_page_size();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   167
  options->thread_buffer_size = thread_buffer_pages * os::vm_page_size();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   168
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   169
  assert(options->memory_size % options->buffer_count == 0, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   170
  assert(options->memory_size / options->buffer_count == per_unit_bytes, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   171
  assert(options->buffer_count * per_unit_bytes == options->memory_size, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   172
  assert(per_unit_bytes >= options->thread_buffer_size, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   173
  return per_unit_bytes;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   174
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   175
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   176
static void align_buffer_size(julong& buffer_size_in_pages, julong max_size_pages, julong min_size_pages, bool sizeup = false) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   177
  buffer_size_in_pages = MIN2(buffer_size_in_pages, max_size_pages);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   178
  buffer_size_in_pages = MAX2(buffer_size_in_pages, min_size_pages);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   179
  size_t multiples = 0;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   180
  if (buffer_size_in_pages < max_size_pages) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   181
    while (buffer_size_in_pages >=
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   182
      (min_size_pages << (multiples + (sizeup ? 0 : 1)))) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   183
      ++multiples;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   184
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   185
    buffer_size_in_pages = min_size_pages << multiples;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   186
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   187
  assert(buffer_size_in_pages >= min_size_pages && buffer_size_in_pages <= max_size_pages, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   188
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   189
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   190
static void adjust_buffer_size_to_total_memory_size(julong& total_pages, julong& buffer_size_pages) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   191
  static const julong max_buffer_size_pages = MAX_ADJUSTED_GLOBAL_BUFFER_SIZE / os::vm_page_size();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   192
  // If memory size is less than DEFAULT_MEMORY_SIZE,
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   193
  // the adjustment algorithm can decrease the size of the global buffer
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   194
  // all the way down to the MIN_GLOBAL_BUFFER_SIZE (taking embedded use case in account).
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   195
  // If memory size is larger than DEFAULT_MEMORY_SIZE, the lowest size of
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   196
  // a global buffer will be the size of MIN_ADJUSTED_GLOBAL_BUFFER_SIZE_CUTOFF
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   197
  static const julong min_buffer_size_pages =
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   198
    total_pages * os::vm_page_size() < DEFAULT_MEMORY_SIZE ?
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   199
      MIN_GLOBAL_BUFFER_SIZE / os::vm_page_size() :
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   200
      MIN_ADJUSTED_GLOBAL_BUFFER_SIZE_CUTOFF / os::vm_page_size();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   201
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   202
  align_buffer_size(buffer_size_pages, max_buffer_size_pages, min_buffer_size_pages);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   203
  assert(buffer_size_pages % min_buffer_size_pages == 0, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   204
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   205
  julong remainder = total_pages % buffer_size_pages;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   206
  while (remainder >= (buffer_size_pages >> 1)) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   207
    if (buffer_size_pages <= min_buffer_size_pages) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   208
      break;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   209
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   210
    buffer_size_pages >>= 1;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   211
    remainder = total_pages % buffer_size_pages;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   212
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   213
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   214
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   215
// Sizing policy class
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   216
class ScaleOutAdjuster : public AllStatic {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   217
 public:
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   218
  static void adjust(julong& total_pages,
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   219
                     julong& buffer_size_pages,
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   220
                     julong& buffer_count,
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   221
                     julong& thread_buffer_size_pages,
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   222
                     bool is_thread_buffer_size_set) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   223
    assert(buffer_count > 0, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   224
    adjust_buffer_size_to_total_memory_size(total_pages, buffer_size_pages);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   225
    assert(buffer_size_pages * os::vm_page_size() >= MIN_GLOBAL_BUFFER_SIZE, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   226
    assert((buffer_size_pages * os::vm_page_size()) % MIN_GLOBAL_BUFFER_SIZE == 0, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   227
    if (is_thread_buffer_size_set) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   228
      if (thread_buffer_size_pages > buffer_size_pages) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   229
        buffer_size_pages = thread_buffer_size_pages;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   230
      }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   231
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   232
    // and with this information, calculate what the new buffer count will be
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   233
    buffer_count = div_pages(total_pages, buffer_size_pages);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   234
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   235
};
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   236
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   237
static void memory_and_thread_buffer_size(JfrMemoryOptions* options) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   238
  assert(options->memory_size_configured, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   239
  assert(!options->buffer_count_configured, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   240
  assert(!options->global_buffer_size_configured, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   241
  // here the only thing specified is the overall total memory size
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   242
  // we can and will apply some sizing heuristics to derive both
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   243
  // the size of an individual global buffer and by implication the number of global
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   244
  // buffers to use. Starting values for buffer count and global_buffer_size
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   245
  // will be the defaults.
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   246
  options->global_buffer_size = adjust<ScaleOutAdjuster>(options);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   247
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   248
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   249
static void memory_size_and_buffer_count(JfrMemoryOptions* options) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   250
  assert(options->memory_size_configured, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   251
  assert(!options->global_buffer_size_configured, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   252
  assert(!options->thread_buffer_size_configured, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   253
  assert(options->buffer_count_configured, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   254
  options->global_buffer_size = div_total_by_units(options->memory_size, options->buffer_count);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   255
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   256
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   257
static void memory_size_and_global_buffer_size(JfrMemoryOptions* options) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   258
  assert(options->memory_size_configured, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   259
  assert(options->global_buffer_size_configured, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   260
  assert(!options->buffer_count_configured, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   261
  page_size_align_up(options->thread_buffer_size);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   262
  options->buffer_count = div_total_by_per_unit(options->memory_size, options->global_buffer_size);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   263
  if (options->thread_buffer_size > options->global_buffer_size) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   264
    options->global_buffer_size = options->thread_buffer_size;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   265
    options->buffer_count = div_total_by_per_unit(options->memory_size, options->global_buffer_size);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   266
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   267
  assert(options->global_buffer_size >= options->thread_buffer_size, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   268
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   269
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   270
static bool is_ambiguous(const JfrMemoryOptions* options) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   271
  assert(options->memory_size_configured, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   272
  assert(options->global_buffer_size_configured, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   273
  assert(options->buffer_count_configured, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   274
  assert(options->thread_buffer_size <= options->global_buffer_size, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   275
  // This can cause an ambiguous situation because all three parameters are explicitly set.
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   276
  return options->global_buffer_size * options->buffer_count != options->memory_size;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   277
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   278
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   279
static void all_options_set(JfrMemoryOptions* options) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   280
  options->buffer_count = div_total_by_per_unit(options->memory_size, options->global_buffer_size);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   281
  page_size_align_up(options->thread_buffer_size);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   282
  if (options->thread_buffer_size > options->global_buffer_size) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   283
    options->global_buffer_size = options->thread_buffer_size;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   284
    options->buffer_count = div_total_by_per_unit(options->memory_size, options->global_buffer_size);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   285
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   286
  assert(options->global_buffer_size >= options->thread_buffer_size, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   287
  assert(options->memory_size / options->global_buffer_size == options->buffer_count, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   288
  assert(options->memory_size % options->global_buffer_size == 0, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   289
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   290
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   291
static void global_buffer_size(JfrMemoryOptions* options) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   292
  assert(!options->memory_size_configured, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   293
  page_size_align_up(options->thread_buffer_size);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   294
  if (options->thread_buffer_size > options->global_buffer_size) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   295
    options->global_buffer_size = options->thread_buffer_size;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   296
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   297
  options->memory_size = multiply(options->global_buffer_size, options->buffer_count);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   298
  assert(options->global_buffer_size >= options->thread_buffer_size, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   299
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   300
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   301
static void thread_buffer_size(JfrMemoryOptions* options) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   302
  assert(!options->global_buffer_size_configured, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   303
  assert(options->thread_buffer_size_configured, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   304
  page_size_align_up(options->thread_buffer_size);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   305
  options->global_buffer_size = div_total_by_units(options->memory_size, options->buffer_count);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   306
  if (options->thread_buffer_size > options->global_buffer_size) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   307
    options->global_buffer_size = options->thread_buffer_size;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   308
    options->buffer_count = div_total_by_per_unit(options->memory_size, options->global_buffer_size);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   309
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   310
  assert(options->global_buffer_size >= options->thread_buffer_size, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   311
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   312
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   313
static void default_size(const JfrMemoryOptions* options) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   314
  // no memory options explicitly set
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   315
  // default values already statically adjusted
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   316
  assert(!options->thread_buffer_size_configured, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   317
  assert(!options->memory_size_configured, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   318
  assert(!options->buffer_count_configured, "invarinat");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   319
  assert(!options->global_buffer_size_configured, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   320
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   321
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   322
#ifdef ASSERT
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   323
static void assert_post_condition(const JfrMemoryOptions* options) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   324
  assert(options->memory_size % os::vm_page_size() == 0, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   325
  assert(options->global_buffer_size % os::vm_page_size() == 0, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   326
  assert(options->thread_buffer_size % os::vm_page_size() == 0, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   327
  assert(options->buffer_count > 0, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   328
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   329
#endif
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   330
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   331
// MEMORY SIZING ALGORITHM
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   332
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   333
bool JfrMemorySizer::adjust_options(JfrMemoryOptions* options) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   334
  assert(options != NULL, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   335
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   336
  enum MemoryOptions {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   337
    MEMORY_SIZE = 1,
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   338
    GLOBAL_BUFFER_SIZE = 2,
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   339
    GLOBAL_BUFFER_COUNT = 4,
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   340
    THREAD_BUFFER_SIZE = 8
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   341
  };
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   342
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   343
  // LEGEND
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   344
  //
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   345
  // M = "memorysize" option
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   346
  // G = "globalbuffersize" option
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   347
  // C = "numglobalbuffers" option
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   348
  // T = "threadbuffersize" option
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   349
  //
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   350
  // The memory options comprise an n-set (a 4-set) = { M, G, C, T }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   351
  //
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   352
  // Number of r-subsets = 5 (0, 1, 2, 3, 4) (including null set)
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   353
  //
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   354
  // Unordered selection:
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   355
  //
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   356
  // C(4, 0) = {} = NULL set = 1
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   357
  // C(4, 1) = { (M), (G), (C), (T) } = 4
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   358
  // C(4, 2) = { (M, G), (M, C), (M, T), (G, C), (G, T), (C, T) } = 6
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   359
  // C(4, 3) = { (M, G, C), (M, G, T), (M, C, T), (G, C, T) } = 4
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   360
  // C(4, 4) = { (M, G, C, T) } = 1
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   361
  //
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   362
  // in shorter terms: P({ M, G, C, T}) = 16
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   363
  //
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   364
#define MG   (MEMORY_SIZE | GLOBAL_BUFFER_SIZE)
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   365
#define MC   (MEMORY_SIZE | GLOBAL_BUFFER_COUNT)
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   366
#define MT   (MEMORY_SIZE | THREAD_BUFFER_SIZE)
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   367
#define MGC  (MG | GLOBAL_BUFFER_COUNT)
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   368
#define MGT  (MG | THREAD_BUFFER_SIZE)
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   369
#define MCT  (MC | THREAD_BUFFER_SIZE)
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   370
#define MGCT (MGC | THREAD_BUFFER_SIZE)
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   371
#define GC   (GLOBAL_BUFFER_SIZE | GLOBAL_BUFFER_COUNT)
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   372
#define GT   (GLOBAL_BUFFER_SIZE | THREAD_BUFFER_SIZE)
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   373
#define GCT  (GC | THREAD_BUFFER_SIZE)
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   374
#define CT   (GLOBAL_BUFFER_COUNT | THREAD_BUFFER_SIZE)
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   375
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   376
  int set_of_options = 0;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   377
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   378
  if (options->memory_size_configured) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   379
    set_of_options |= MEMORY_SIZE;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   380
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   381
  if (options->global_buffer_size_configured) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   382
    set_of_options |= GLOBAL_BUFFER_SIZE;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   383
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   384
  if (options->buffer_count_configured) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   385
    set_of_options |= GLOBAL_BUFFER_COUNT;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   386
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   387
  if (options->thread_buffer_size_configured) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   388
    set_of_options |= THREAD_BUFFER_SIZE;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   389
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   390
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   391
  switch (set_of_options) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   392
    case MT:
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   393
    case MEMORY_SIZE:
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   394
      memory_and_thread_buffer_size(options);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   395
      break;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   396
    case MC:
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   397
      memory_size_and_buffer_count(options);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   398
      break;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   399
    case MGT:
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   400
      assert(options->thread_buffer_size_configured, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   401
    case MG:
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   402
      memory_size_and_global_buffer_size(options);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   403
      break;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   404
    case MGC:
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   405
    case MGCT:
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   406
      if (is_ambiguous(options)) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   407
        // Let the user resolve the ambiguity by bailing.
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   408
        return false;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   409
      }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   410
      all_options_set(options);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   411
      break;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   412
    case GCT:
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   413
      assert(options->buffer_count_configured, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   414
      assert(options->thread_buffer_size_configured, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   415
    case GC:
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   416
      assert(options->global_buffer_size_configured, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   417
    case GT:
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   418
    case GLOBAL_BUFFER_COUNT:
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   419
    case GLOBAL_BUFFER_SIZE:
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   420
      global_buffer_size(options);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   421
      break;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   422
    case MCT:
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   423
      assert(options->memory_size_configured, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   424
    case CT:
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   425
      assert(options->buffer_count_configured, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   426
    case THREAD_BUFFER_SIZE:
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   427
      thread_buffer_size(options);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   428
      break;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   429
    default:
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   430
      default_size(options);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   431
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   432
  DEBUG_ONLY(assert_post_condition(options);)
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   433
  return true;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   434
}