src/hotspot/share/jfr/recorder/service/jfrOptionSet.cpp
author mgronlun
Mon, 25 Nov 2019 18:38:01 +0100
changeset 59259 127ca611f19b
parent 54603 cb8e16d6ff1e
permissions -rw-r--r--
8233197: Invert JvmtiExport::post_vm_initialized() and Jfr:on_vm_start() start-up order for correct option parsing Reviewed-by: sspitsyn, egahlin
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
     1
/*
54603
cb8e16d6ff1e 8219566: JFR did not collect call stacks when MaxJavaStackTraceDepth is set to zero
ysuenaga
parents: 52669
diff changeset
     2
 * Copyright (c) 2012, 2019, Oracle and/or its affiliates. All rights reserved.
50113
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/dcmd/jfrDcmds.hpp"
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    27
#include "jfr/recorder/service/jfrMemorySizer.hpp"
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    28
#include "jfr/recorder/service/jfrOptionSet.hpp"
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    29
#include "jfr/utilities/jfrAllocation.hpp"
54603
cb8e16d6ff1e 8219566: JFR did not collect call stacks when MaxJavaStackTraceDepth is set to zero
ysuenaga
parents: 52669
diff changeset
    30
#include "jfr/utilities/jfrTypes.hpp"
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    31
#include "logging/log.hpp"
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    32
#include "memory/allocation.inline.hpp"
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    33
#include "memory/resourceArea.hpp"
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    34
#include "runtime/java.hpp"
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    35
#include "runtime/thread.inline.hpp"
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    36
#include "services/diagnosticArgument.hpp"
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    37
#include "services/diagnosticFramework.hpp"
50664
857ce291c70c 8204571: Add support for launching multiple startup recordings
mgronlun
parents: 50113
diff changeset
    38
#include "utilities/growableArray.hpp"
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    39
#include "utilities/ostream.hpp"
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    40
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    41
struct ObsoleteOption {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    42
  const char* name;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    43
  const char* message;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    44
};
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    45
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    46
static const ObsoleteOption OBSOLETE_OPTIONS[] = {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    47
  {"checkpointbuffersize", ""},
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    48
  {"maxsize",              "Use -XX:StartFlightRecording=maxsize=... instead."},
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    49
  {"maxage",               "Use -XX:StartFlightRecording=maxage=... instead."},
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    50
  {"settings",             "Use -XX:StartFlightRecording=settings=... instead."},
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    51
  {"defaultrecording",     "Use -XX:StartFlightRecording=disk=false to create an in-memory recording."},
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    52
  {"disk",                 "Use -XX:StartFlightRecording=disk=... instead."},
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    53
  {"dumponexit",           "Use -XX:StartFlightRecording=dumponexit=... instead."},
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    54
  {"dumponexitpath",       "Use -XX:StartFlightRecording=filename=... instead."},
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    55
  {"loglevel",             "Use -Xlog:jfr=... instead."}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    56
};
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    57
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    58
jlong JfrOptionSet::max_chunk_size() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    59
  return _max_chunk_size;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    60
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    61
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    62
void JfrOptionSet::set_max_chunk_size(jlong value) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    63
  _max_chunk_size = value;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    64
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    65
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    66
jlong JfrOptionSet::global_buffer_size() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    67
  return _global_buffer_size;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    68
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    69
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    70
void JfrOptionSet::set_global_buffer_size(jlong value) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    71
  _global_buffer_size = value;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    72
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    73
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    74
jlong JfrOptionSet::thread_buffer_size() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    75
  return _thread_buffer_size;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    76
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    77
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    78
void JfrOptionSet::set_thread_buffer_size(jlong value) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    79
  _thread_buffer_size = value;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    80
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    81
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    82
jlong JfrOptionSet::memory_size() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    83
  return _memory_size;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    84
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    85
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    86
void JfrOptionSet::set_memory_size(jlong value) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    87
  _memory_size = value;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    88
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    89
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    90
jlong JfrOptionSet::num_global_buffers() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    91
  return _num_global_buffers;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    92
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    93
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    94
void JfrOptionSet::set_num_global_buffers(jlong value) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    95
  _num_global_buffers = value;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    96
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    97
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    98
jint JfrOptionSet::old_object_queue_size() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    99
  return (jint)_old_object_queue_size;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   100
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   101
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   102
void JfrOptionSet::set_old_object_queue_size(jlong value) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   103
  _old_object_queue_size = value;
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
u4 JfrOptionSet::stackdepth() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   107
  return _stack_depth;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   108
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   109
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   110
void JfrOptionSet::set_stackdepth(u4 depth) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   111
  if (depth < MIN_STACK_DEPTH) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   112
    _stack_depth = MIN_STACK_DEPTH;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   113
  } else if (depth > MAX_STACK_DEPTH) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   114
    _stack_depth = MAX_STACK_DEPTH;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   115
  } else {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   116
    _stack_depth = depth;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   117
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   118
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   119
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   120
bool JfrOptionSet::sample_threads() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   121
  return _sample_threads == JNI_TRUE;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   122
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   123
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   124
void JfrOptionSet::set_sample_threads(jboolean sample) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   125
  _sample_threads = sample;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   126
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   127
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   128
bool JfrOptionSet::can_retransform() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   129
  return _retransform == JNI_TRUE;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   130
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   131
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   132
void JfrOptionSet::set_retransform(jboolean value) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   133
  _retransform = value;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   134
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   135
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   136
bool JfrOptionSet::sample_protection() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   137
  return _sample_protection == JNI_TRUE;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   138
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   139
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   140
#ifdef ASSERT
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   141
void JfrOptionSet::set_sample_protection(jboolean protection) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   142
  _sample_protection = protection;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   143
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   144
#endif
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   145
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   146
bool JfrOptionSet::compressed_integers() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   147
  // Set this to false for debugging purposes.
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   148
  return true;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   149
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   150
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   151
bool JfrOptionSet::allow_retransforms() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   152
#if INCLUDE_JVMTI
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   153
  return true;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   154
#else
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   155
  return false;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   156
#endif
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   157
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   158
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   159
bool JfrOptionSet::allow_event_retransforms() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   160
  return allow_retransforms() && (DumpSharedSpaces || can_retransform());
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   161
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   162
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   163
// default options for the dcmd parser
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   164
const char* const default_repository = NULL;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   165
const char* const default_global_buffer_size = "512k";
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   166
const char* const default_num_global_buffers = "20";
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   167
const char* const default_memory_size = "10m";
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   168
const char* const default_thread_buffer_size = "8k";
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   169
const char* const default_max_chunk_size = "12m";
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   170
const char* const default_sample_threads = "true";
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   171
const char* const default_stack_depth = "64";
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   172
const char* const default_retransform = "true";
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   173
const char* const default_old_object_queue_size = "256";
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   174
DEBUG_ONLY(const char* const default_sample_protection = "false";)
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   175
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   176
// statics
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   177
static DCmdArgument<char*> _dcmd_repository(
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   178
  "repository",
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   179
  "Flight recorder disk repository location",
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   180
  "STRING",
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   181
  false,
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   182
  default_repository);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   183
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   184
static DCmdArgument<MemorySizeArgument> _dcmd_threadbuffersize(
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   185
  "threadbuffersize",
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   186
  "Thread buffer size",
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   187
  "MEMORY SIZE",
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   188
  false,
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   189
  default_thread_buffer_size);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   190
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   191
static DCmdArgument<MemorySizeArgument> _dcmd_memorysize(
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   192
  "memorysize",
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   193
  "Size of memory to be used by Flight Recorder",
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   194
  "MEMORY SIZE",
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   195
  false,
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   196
  default_memory_size);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   197
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   198
static DCmdArgument<MemorySizeArgument> _dcmd_globalbuffersize(
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   199
  "globalbuffersize",
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   200
  "Global buffer size",
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   201
  "MEMORY SIZE",
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   202
  false,
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   203
  default_global_buffer_size);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   204
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   205
static DCmdArgument<jlong> _dcmd_numglobalbuffers(
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   206
  "numglobalbuffers",
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   207
  "Number of global buffers",
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   208
  "JULONG",
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   209
  false,
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   210
  default_num_global_buffers);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   211
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   212
static DCmdArgument<MemorySizeArgument> _dcmd_maxchunksize(
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   213
  "maxchunksize",
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   214
  "Maximum size of a single repository disk chunk",
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   215
  "MEMORY SIZE",
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   216
  false,
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   217
  default_max_chunk_size);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   218
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   219
static DCmdArgument<jlong> _dcmd_old_object_queue_size (
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   220
  "old-object-queue-size",
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   221
  "Maximum number of old objects to track",
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   222
  "JINT",
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   223
  false,
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   224
  default_old_object_queue_size);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   225
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   226
static DCmdArgument<bool> _dcmd_sample_threads(
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   227
  "samplethreads",
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   228
  "Thread sampling enable / disable (only sampling when event enabled and sampling enabled)",
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   229
  "BOOLEAN",
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   230
  false,
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   231
  default_sample_threads);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   232
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   233
#ifdef ASSERT
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   234
static DCmdArgument<bool> _dcmd_sample_protection(
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   235
  "sampleprotection",
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   236
  "Safeguard for stackwalking while sampling threads (false by default)",
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   237
  "BOOLEAN",
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   238
  false,
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   239
  default_sample_protection);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   240
#endif
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   241
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   242
static DCmdArgument<jlong> _dcmd_stackdepth(
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   243
  "stackdepth",
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   244
  "Stack depth for stacktraces (minimum 1, maximum 2048)",
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   245
  "JULONG",
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   246
  false,
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   247
  default_stack_depth);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   248
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   249
static DCmdArgument<bool> _dcmd_retransform(
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   250
  "retransform",
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   251
  "If event classes should be instrumented using JVMTI (by default true)",
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   252
  "BOOLEAN",
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   253
  true,
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   254
  default_retransform);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   255
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   256
static DCmdParser _parser;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   257
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   258
static void register_parser_options() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   259
  _parser.add_dcmd_option(&_dcmd_repository);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   260
  _parser.add_dcmd_option(&_dcmd_threadbuffersize);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   261
  _parser.add_dcmd_option(&_dcmd_memorysize);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   262
  _parser.add_dcmd_option(&_dcmd_globalbuffersize);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   263
  _parser.add_dcmd_option(&_dcmd_numglobalbuffers);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   264
  _parser.add_dcmd_option(&_dcmd_maxchunksize);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   265
  _parser.add_dcmd_option(&_dcmd_stackdepth);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   266
  _parser.add_dcmd_option(&_dcmd_sample_threads);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   267
  _parser.add_dcmd_option(&_dcmd_retransform);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   268
  _parser.add_dcmd_option(&_dcmd_old_object_queue_size);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   269
  DEBUG_ONLY(_parser.add_dcmd_option(&_dcmd_sample_protection);)
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   270
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   271
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   272
static bool parse_flight_recorder_options_internal(TRAPS) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   273
  if (FlightRecorderOptions == NULL) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   274
    return true;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   275
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   276
  const size_t length = strlen((const char*)FlightRecorderOptions);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   277
  CmdLine cmdline((const char*)FlightRecorderOptions, length, true);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   278
  _parser.parse(&cmdline, ',', THREAD);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   279
  if (HAS_PENDING_EXCEPTION) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   280
    for (int index = 0; index < 9; index++) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   281
      ObsoleteOption option = OBSOLETE_OPTIONS[index];
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   282
      const char* p = strstr((const char*)FlightRecorderOptions, option.name);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   283
      const size_t option_length = strlen(option.name);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   284
      if (p != NULL && p[option_length] == '=') {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   285
        log_error(arguments) ("-XX:FlightRecorderOptions=%s=... has been removed. %s", option.name, option.message);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   286
        return false;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   287
      }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   288
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   289
    ResourceMark rm(THREAD);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   290
    oop message = java_lang_Throwable::message(PENDING_EXCEPTION);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   291
    if (message != NULL) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   292
      const char* msg = java_lang_String::as_utf8_string(message);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   293
      log_error(arguments) ("%s", msg);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   294
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   295
    CLEAR_PENDING_EXCEPTION;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   296
    return false;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   297
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   298
  return true;
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
jlong JfrOptionSet::_max_chunk_size = 0;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   302
jlong JfrOptionSet::_global_buffer_size = 0;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   303
jlong JfrOptionSet::_thread_buffer_size = 0;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   304
jlong JfrOptionSet::_memory_size = 0;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   305
jlong JfrOptionSet::_num_global_buffers = 0;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   306
jlong JfrOptionSet::_old_object_queue_size = 0;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   307
u4 JfrOptionSet::_stack_depth = STACK_DEPTH_DEFAULT;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   308
jboolean JfrOptionSet::_sample_threads = JNI_TRUE;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   309
jboolean JfrOptionSet::_retransform = JNI_TRUE;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   310
#ifdef ASSERT
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   311
jboolean JfrOptionSet::_sample_protection = JNI_FALSE;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   312
#else
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   313
jboolean JfrOptionSet::_sample_protection = JNI_TRUE;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   314
#endif
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   315
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   316
bool JfrOptionSet::initialize(Thread* thread) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   317
  register_parser_options();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   318
  if (!parse_flight_recorder_options_internal(thread)) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   319
    return false;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   320
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   321
  if (_dcmd_retransform.is_set()) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   322
    set_retransform(_dcmd_retransform.value());
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   323
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   324
  set_old_object_queue_size(_dcmd_old_object_queue_size.value());
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   325
  return adjust_memory_options();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   326
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   327
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   328
bool JfrOptionSet::configure(TRAPS) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   329
  if (FlightRecorderOptions == NULL) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   330
    return true;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   331
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   332
  ResourceMark rm(THREAD);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   333
  bufferedStream st;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   334
  // delegate to DCmd execution
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   335
  JfrConfigureFlightRecorderDCmd configure(&st, false);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   336
  configure._repository_path.set_is_set(_dcmd_repository.is_set());
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   337
  char* repo = _dcmd_repository.value();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   338
  if (repo != NULL) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   339
    const size_t len = strlen(repo);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   340
    char* repo_copy = JfrCHeapObj::new_array<char>(len + 1);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   341
    if (NULL == repo_copy) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   342
      return false;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   343
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   344
    strncpy(repo_copy, repo, len + 1);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   345
    configure._repository_path.set_value(repo_copy);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   346
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   347
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   348
  configure._stack_depth.set_is_set(_dcmd_stackdepth.is_set());
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   349
  configure._stack_depth.set_value(_dcmd_stackdepth.value());
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   350
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   351
  configure._thread_buffer_size.set_is_set(_dcmd_threadbuffersize.is_set());
52669
e21361bccfa1 8213015: Inconsistent settings between JFR.configure and -XX:FlightRecorderOptions
ysuenaga
parents: 50877
diff changeset
   352
  configure._thread_buffer_size.set_value(_dcmd_threadbuffersize.value());
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   353
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   354
  configure._global_buffer_count.set_is_set(_dcmd_numglobalbuffers.is_set());
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   355
  configure._global_buffer_count.set_value(_dcmd_numglobalbuffers.value());
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   356
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   357
  configure._global_buffer_size.set_is_set(_dcmd_globalbuffersize.is_set());
52669
e21361bccfa1 8213015: Inconsistent settings between JFR.configure and -XX:FlightRecorderOptions
ysuenaga
parents: 50877
diff changeset
   358
  configure._global_buffer_size.set_value(_dcmd_globalbuffersize.value());
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   359
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   360
  configure._max_chunk_size.set_is_set(_dcmd_maxchunksize.is_set());
52669
e21361bccfa1 8213015: Inconsistent settings between JFR.configure and -XX:FlightRecorderOptions
ysuenaga
parents: 50877
diff changeset
   361
  configure._max_chunk_size.set_value(_dcmd_maxchunksize.value());
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   362
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   363
  configure._memory_size.set_is_set(_dcmd_memorysize.is_set());
52669
e21361bccfa1 8213015: Inconsistent settings between JFR.configure and -XX:FlightRecorderOptions
ysuenaga
parents: 50877
diff changeset
   364
  configure._memory_size.set_value(_dcmd_memorysize.value());
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   365
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   366
  configure._sample_threads.set_is_set(_dcmd_sample_threads.is_set());
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   367
  configure._sample_threads.set_value(_dcmd_sample_threads.value());
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   368
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   369
  configure.execute(DCmd_Source_Internal, THREAD);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   370
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   371
  if (HAS_PENDING_EXCEPTION) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   372
    java_lang_Throwable::print(PENDING_EXCEPTION, tty);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   373
    CLEAR_PENDING_EXCEPTION;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   374
    return false;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   375
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   376
  return true;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   377
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   378
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   379
template <typename Argument>
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   380
static julong divide_with_user_unit(Argument& memory_argument, julong value) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   381
  if (memory_argument.value()._size != memory_argument.value()._val) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   382
    switch (memory_argument.value()._multiplier) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   383
    case 'k': case 'K':
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   384
      return value / K;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   385
    case 'm': case 'M':
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   386
      return value / M;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   387
    case 'g': case 'G':
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   388
      return value / G;
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
  return value;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   392
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   393
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   394
template <typename Argument>
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   395
static void log_lower_than_min_value(Argument& memory_argument, julong min_value) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   396
  if (memory_argument.value()._size != memory_argument.value()._val) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   397
    // has multiplier
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   398
    log_error(arguments) (
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   399
      "This value is lower than the minimum size required " JULONG_FORMAT "%c",
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   400
      divide_with_user_unit(memory_argument, min_value),
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   401
      memory_argument.value()._multiplier);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   402
    return;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   403
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   404
  log_error(arguments) (
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   405
    "This value is lower than the minimum size required " JULONG_FORMAT,
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   406
    divide_with_user_unit(memory_argument, min_value));
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   407
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   408
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   409
template <typename Argument>
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   410
static void log_set_value(Argument& memory_argument) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   411
  if (memory_argument.value()._size != memory_argument.value()._val) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   412
    // has multiplier
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   413
    log_error(arguments) (
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   414
      "Value specified for option \"%s\" is " JULONG_FORMAT "%c",
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   415
      memory_argument.name(),
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   416
      memory_argument.value()._val,
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   417
      memory_argument.value()._multiplier);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   418
    return;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   419
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   420
  log_error(arguments) (
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   421
    "Value specified for option \"%s\" is " JULONG_FORMAT,
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   422
    memory_argument.name(), memory_argument.value()._val);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   423
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   424
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   425
template <typename MemoryArg>
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   426
static void log_adjustments(MemoryArg& original_memory_size, julong new_memory_size, const char* msg) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   427
  log_trace(arguments) (
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   428
    "%s size (original) " JULONG_FORMAT " B (user defined: %s)",
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   429
    msg,
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   430
    original_memory_size.value()._size,
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   431
    original_memory_size.is_set() ? "true" : "false");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   432
  log_trace(arguments) (
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   433
    "%s size (adjusted) " JULONG_FORMAT " B (modified: %s)",
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   434
    msg,
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   435
    new_memory_size,
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   436
    original_memory_size.value()._size != new_memory_size ? "true" : "false");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   437
  log_trace(arguments) (
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   438
    "%s size (adjustment) %s" JULONG_FORMAT " B",
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   439
    msg,
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   440
    new_memory_size < original_memory_size.value()._size ? "-" : "+",
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   441
    new_memory_size < original_memory_size.value()._size ?
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   442
    original_memory_size.value()._size - new_memory_size :
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   443
    new_memory_size - original_memory_size.value()._size);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   444
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   445
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   446
// All "triangular" options are explicitly set
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   447
// check that they are congruent and not causing
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   448
// an ambiguous situtation
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   449
template <typename MemoryArg, typename NumberArg>
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   450
static bool check_for_ambiguity(MemoryArg& memory_size, MemoryArg& global_buffer_size, NumberArg& num_global_buffers) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   451
  assert(memory_size.is_set(), "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   452
  assert(global_buffer_size.is_set(), "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   453
  assert(num_global_buffers.is_set(), "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   454
  const julong calc_size = global_buffer_size.value()._size * (julong)num_global_buffers.value();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   455
  if (calc_size != memory_size.value()._size) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   456
    // ambiguous
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   457
    log_set_value(global_buffer_size);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   458
    log_error(arguments) (
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   459
      "Value specified for option \"%s\" is " JLONG_FORMAT,
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   460
      num_global_buffers.name(), num_global_buffers.value());
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   461
    log_set_value(memory_size);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   462
    log_error(arguments) (
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   463
      "These values are causing an ambiguity when trying to determine how much memory to use");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   464
    log_error(arguments) ("\"%s\" * \"%s\" do not equal \"%s\"",
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   465
      global_buffer_size.name(),
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   466
      num_global_buffers.name(),
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   467
      memory_size.name());
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   468
    log_error(arguments) (
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   469
      "Try to remove one of the involved options or make sure they are unambigous");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   470
    return false;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   471
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   472
  return true;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   473
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   474
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   475
template <typename Argument>
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   476
static bool ensure_minimum_count(Argument& buffer_count_argument, jlong min_count) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   477
  if (buffer_count_argument.value() < min_count) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   478
    log_error(arguments) (
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   479
      "Value specified for option \"%s\" is " JLONG_FORMAT,
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   480
      buffer_count_argument.name(), buffer_count_argument.value());
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   481
    log_error(arguments) (
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   482
      "This value is lower than the minimum required number " JLONG_FORMAT,
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   483
      min_count);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   484
    return false;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   485
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   486
  return true;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   487
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   488
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   489
// global buffer size and num global buffers specified
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   490
// ensure that particular combination to be ihigher than minimum memory size
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   491
template <typename MemoryArg, typename NumberArg>
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   492
static bool ensure_calculated_gteq(MemoryArg& global_buffer_size, NumberArg& num_global_buffers, julong min_value) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   493
  assert(global_buffer_size.is_set(), "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   494
  assert(num_global_buffers.is_set(), "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   495
  const julong calc_size = global_buffer_size.value()._size * (julong)num_global_buffers.value();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   496
  if (calc_size < min_value) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   497
    log_set_value(global_buffer_size);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   498
    log_error(arguments) (
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   499
      "Value specified for option \"%s\" is " JLONG_FORMAT,
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   500
      num_global_buffers.name(), num_global_buffers.value());
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   501
    log_error(arguments) ("\"%s\" * \"%s\" (" JULONG_FORMAT
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   502
      ") is lower than minimum memory size required " JULONG_FORMAT,
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   503
      global_buffer_size.name(),
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   504
      num_global_buffers.name(),
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   505
      calc_size,
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   506
      min_value);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   507
    return false;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   508
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   509
  return true;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   510
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   511
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   512
template <typename Argument>
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   513
static bool ensure_first_gteq_second(Argument& first_argument, Argument& second_argument) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   514
  if (second_argument.value()._size > first_argument.value()._size) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   515
    log_set_value(first_argument);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   516
    log_set_value(second_argument);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   517
    log_error(arguments) (
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   518
      "The value for option \"%s\" should not be larger than the value specified for option \"%s\"",
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   519
      second_argument.name(), first_argument.name());
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   520
    return false;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   521
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   522
  return true;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   523
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   524
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   525
static bool valid_memory_relations(const JfrMemoryOptions& options) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   526
  if (options.global_buffer_size_configured) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   527
    if (options.memory_size_configured) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   528
      if (!ensure_first_gteq_second(_dcmd_memorysize, _dcmd_globalbuffersize)) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   529
        return false;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   530
      }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   531
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   532
    if (options.thread_buffer_size_configured) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   533
      if (!ensure_first_gteq_second(_dcmd_globalbuffersize, _dcmd_threadbuffersize)) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   534
        return false;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   535
      }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   536
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   537
    if (options.buffer_count_configured) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   538
      if (!ensure_calculated_gteq(_dcmd_globalbuffersize, _dcmd_numglobalbuffers, MIN_MEMORY_SIZE)) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   539
        return false;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   540
      }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   541
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   542
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   543
  return true;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   544
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   545
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   546
static void post_process_adjusted_memory_options(const JfrMemoryOptions& options) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   547
  assert(options.memory_size >= MIN_MEMORY_SIZE, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   548
  assert(options.global_buffer_size >= MIN_GLOBAL_BUFFER_SIZE, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   549
  assert(options.buffer_count >= MIN_BUFFER_COUNT, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   550
  assert(options.thread_buffer_size >= MIN_THREAD_BUFFER_SIZE, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   551
  log_adjustments(_dcmd_memorysize, options.memory_size, "Memory");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   552
  log_adjustments(_dcmd_globalbuffersize, options.global_buffer_size, "Global buffer");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   553
  log_adjustments(_dcmd_threadbuffersize, options.thread_buffer_size, "Thread local buffer");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   554
  log_trace(arguments) ("Number of global buffers (original) " JLONG_FORMAT " (user defined: %s)",
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   555
    _dcmd_numglobalbuffers.value(),
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   556
    _dcmd_numglobalbuffers.is_set() ? "true" : "false");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   557
  log_trace(arguments) ( "Number of global buffers (adjusted) " JULONG_FORMAT " (modified: %s)",
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   558
    options.buffer_count,
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   559
    _dcmd_numglobalbuffers.value() != (jlong)options.buffer_count ? "true" : "false");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   560
  log_trace(arguments) ("Number of global buffers (adjustment) %s" JLONG_FORMAT,
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   561
    (jlong)options.buffer_count < _dcmd_numglobalbuffers.value() ? "" : "+",
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   562
    (jlong)options.buffer_count - _dcmd_numglobalbuffers.value());
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   563
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   564
  MemorySizeArgument adjusted_memory_size;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   565
  adjusted_memory_size._val = divide_with_user_unit(_dcmd_memorysize, options.memory_size);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   566
  adjusted_memory_size._multiplier = _dcmd_memorysize.value()._multiplier;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   567
  adjusted_memory_size._size = options.memory_size;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   568
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   569
  MemorySizeArgument adjusted_global_buffer_size;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   570
  adjusted_global_buffer_size._val = divide_with_user_unit(_dcmd_globalbuffersize, options.global_buffer_size);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   571
  adjusted_global_buffer_size._multiplier = _dcmd_globalbuffersize.value()._multiplier;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   572
  adjusted_global_buffer_size._size = options.global_buffer_size;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   573
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   574
  MemorySizeArgument adjusted_thread_buffer_size;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   575
  adjusted_thread_buffer_size._val = divide_with_user_unit(_dcmd_threadbuffersize, options.thread_buffer_size);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   576
  adjusted_thread_buffer_size._multiplier = _dcmd_threadbuffersize.value()._multiplier;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   577
  adjusted_thread_buffer_size._size = options.thread_buffer_size;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   578
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   579
  // store back to dcmd
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   580
  _dcmd_memorysize.set_value(adjusted_memory_size);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   581
  _dcmd_memorysize.set_is_set(true);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   582
  _dcmd_globalbuffersize.set_value(adjusted_global_buffer_size);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   583
  _dcmd_globalbuffersize.set_is_set(true);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   584
  _dcmd_numglobalbuffers.set_value((jlong)options.buffer_count);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   585
  _dcmd_numglobalbuffers.set_is_set(true);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   586
  _dcmd_threadbuffersize.set_value(adjusted_thread_buffer_size);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   587
  _dcmd_threadbuffersize.set_is_set(true);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   588
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   589
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   590
static void initialize_memory_options_from_dcmd(JfrMemoryOptions& options) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   591
  options.memory_size = _dcmd_memorysize.value()._size;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   592
  options.global_buffer_size = MAX2<julong>(_dcmd_globalbuffersize.value()._size, (julong)os::vm_page_size());
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   593
  options.buffer_count = (julong)_dcmd_numglobalbuffers.value();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   594
  options.thread_buffer_size = MAX2<julong>(_dcmd_threadbuffersize.value()._size, (julong)os::vm_page_size());
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   595
  // determine which options have been explicitly set
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   596
  options.memory_size_configured = _dcmd_memorysize.is_set();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   597
  options.global_buffer_size_configured = _dcmd_globalbuffersize.is_set();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   598
  options.buffer_count_configured = _dcmd_numglobalbuffers.is_set();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   599
  options.thread_buffer_size_configured = _dcmd_threadbuffersize.is_set();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   600
  assert(options.memory_size >= MIN_MEMORY_SIZE, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   601
  assert(options.global_buffer_size >= MIN_GLOBAL_BUFFER_SIZE, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   602
  assert(options.buffer_count >= MIN_BUFFER_COUNT, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   603
  assert(options.thread_buffer_size >= MIN_THREAD_BUFFER_SIZE, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   604
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   605
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   606
template <typename Argument>
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   607
static bool ensure_gteq(Argument& memory_argument, const jlong value) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   608
  if ((jlong)memory_argument.value()._size < value) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   609
    log_set_value(memory_argument);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   610
    log_lower_than_min_value(memory_argument, value);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   611
    return false;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   612
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   613
  return true;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   614
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   615
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   616
static bool ensure_valid_minimum_sizes() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   617
  // ensure valid minimum memory sizes
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   618
  if (_dcmd_memorysize.is_set()) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   619
    if (!ensure_gteq(_dcmd_memorysize, MIN_MEMORY_SIZE)) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   620
      return false;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   621
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   622
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   623
  if (_dcmd_globalbuffersize.is_set()) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   624
    if (!ensure_gteq(_dcmd_globalbuffersize, MIN_GLOBAL_BUFFER_SIZE)) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   625
      return false;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   626
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   627
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   628
  if (_dcmd_numglobalbuffers.is_set()) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   629
    if (!ensure_minimum_count(_dcmd_numglobalbuffers, MIN_BUFFER_COUNT)) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   630
      return false;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   631
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   632
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   633
  if (_dcmd_threadbuffersize.is_set()) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   634
    if (!ensure_gteq(_dcmd_threadbuffersize, MIN_THREAD_BUFFER_SIZE)) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   635
      return false;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   636
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   637
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   638
  return true;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   639
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   640
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   641
/**
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   642
 * Starting with the initial set of memory values from the user,
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   643
 * sanitize, enforce min/max rules and adjust to a set of consistent options.
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   644
 *
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   645
 * Adjusted memory sizes will be page aligned.
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   646
 */
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   647
bool JfrOptionSet::adjust_memory_options() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   648
  if (!ensure_valid_minimum_sizes()) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   649
    return false;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   650
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   651
  JfrMemoryOptions options;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   652
  initialize_memory_options_from_dcmd(options);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   653
  if (!valid_memory_relations(options)) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   654
    return false;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   655
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   656
  if (!JfrMemorySizer::adjust_options(&options)) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   657
    if (!check_for_ambiguity(_dcmd_memorysize, _dcmd_globalbuffersize, _dcmd_numglobalbuffers)) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   658
      return false;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   659
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   660
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   661
  post_process_adjusted_memory_options(options);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   662
  return true;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   663
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   664
50873
ce53844224b6 8205906: jdk.jfr.jcmd.TestJcmdDumpLimited fails due to erronous processing of -XX:FlightRecorderOptions
mgronlun
parents: 50851
diff changeset
   665
bool JfrOptionSet::parse_flight_recorder_option(const JavaVMOption** option, char* delimiter) {
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   666
  assert(option != NULL, "invariant");
50873
ce53844224b6 8205906: jdk.jfr.jcmd.TestJcmdDumpLimited fails due to erronous processing of -XX:FlightRecorderOptions
mgronlun
parents: 50851
diff changeset
   667
  assert(delimiter != NULL, "invariant");
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   668
  assert((*option)->optionString != NULL, "invariant");
50877
700fffd3c871 8205996: JDK-8205906 broke the build on Mac
mgronlun
parents: 50873
diff changeset
   669
  assert(strncmp((*option)->optionString, "-XX:FlightRecorderOptions", 25) == 0, "invariant");
50873
ce53844224b6 8205906: jdk.jfr.jcmd.TestJcmdDumpLimited fails due to erronous processing of -XX:FlightRecorderOptions
mgronlun
parents: 50851
diff changeset
   670
  if (*delimiter == '\0') {
ce53844224b6 8205906: jdk.jfr.jcmd.TestJcmdDumpLimited fails due to erronous processing of -XX:FlightRecorderOptions
mgronlun
parents: 50851
diff changeset
   671
    // -XX:FlightRecorderOptions without any delimiter and values
ce53844224b6 8205906: jdk.jfr.jcmd.TestJcmdDumpLimited fails due to erronous processing of -XX:FlightRecorderOptions
mgronlun
parents: 50851
diff changeset
   672
  } else {
ce53844224b6 8205906: jdk.jfr.jcmd.TestJcmdDumpLimited fails due to erronous processing of -XX:FlightRecorderOptions
mgronlun
parents: 50851
diff changeset
   673
    // -XX:FlightRecorderOptions[=|:]
ce53844224b6 8205906: jdk.jfr.jcmd.TestJcmdDumpLimited fails due to erronous processing of -XX:FlightRecorderOptions
mgronlun
parents: 50851
diff changeset
   674
    // set delimiter to '='
ce53844224b6 8205906: jdk.jfr.jcmd.TestJcmdDumpLimited fails due to erronous processing of -XX:FlightRecorderOptions
mgronlun
parents: 50851
diff changeset
   675
    *delimiter = '=';
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   676
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   677
  return false;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   678
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   679
59259
127ca611f19b 8233197: Invert JvmtiExport::post_vm_initialized() and Jfr:on_vm_start() start-up order for correct option parsing
mgronlun
parents: 54603
diff changeset
   680
static GrowableArray<const char*>* start_flight_recording_options_array = NULL;
50873
ce53844224b6 8205906: jdk.jfr.jcmd.TestJcmdDumpLimited fails due to erronous processing of -XX:FlightRecorderOptions
mgronlun
parents: 50851
diff changeset
   681
ce53844224b6 8205906: jdk.jfr.jcmd.TestJcmdDumpLimited fails due to erronous processing of -XX:FlightRecorderOptions
mgronlun
parents: 50851
diff changeset
   682
bool JfrOptionSet::parse_start_flight_recording_option(const JavaVMOption** option, char* delimiter) {
ce53844224b6 8205906: jdk.jfr.jcmd.TestJcmdDumpLimited fails due to erronous processing of -XX:FlightRecorderOptions
mgronlun
parents: 50851
diff changeset
   683
  assert(option != NULL, "invariant");
ce53844224b6 8205906: jdk.jfr.jcmd.TestJcmdDumpLimited fails due to erronous processing of -XX:FlightRecorderOptions
mgronlun
parents: 50851
diff changeset
   684
  assert(delimiter != NULL, "invariant");
ce53844224b6 8205906: jdk.jfr.jcmd.TestJcmdDumpLimited fails due to erronous processing of -XX:FlightRecorderOptions
mgronlun
parents: 50851
diff changeset
   685
  assert((*option)->optionString != NULL, "invariant");
50877
700fffd3c871 8205996: JDK-8205906 broke the build on Mac
mgronlun
parents: 50873
diff changeset
   686
  assert(strncmp((*option)->optionString, "-XX:StartFlightRecording", 24) == 0, "invariant");
50873
ce53844224b6 8205906: jdk.jfr.jcmd.TestJcmdDumpLimited fails due to erronous processing of -XX:FlightRecorderOptions
mgronlun
parents: 50851
diff changeset
   687
  const char* value = NULL;
ce53844224b6 8205906: jdk.jfr.jcmd.TestJcmdDumpLimited fails due to erronous processing of -XX:FlightRecorderOptions
mgronlun
parents: 50851
diff changeset
   688
  if (*delimiter == '\0') {
ce53844224b6 8205906: jdk.jfr.jcmd.TestJcmdDumpLimited fails due to erronous processing of -XX:FlightRecorderOptions
mgronlun
parents: 50851
diff changeset
   689
    // -XX:StartFlightRecording without any delimiter and values
ce53844224b6 8205906: jdk.jfr.jcmd.TestJcmdDumpLimited fails due to erronous processing of -XX:FlightRecorderOptions
mgronlun
parents: 50851
diff changeset
   690
    // Add dummy value "dumponexit=false" so -XX:StartFlightRecording can be used without explicit values.
ce53844224b6 8205906: jdk.jfr.jcmd.TestJcmdDumpLimited fails due to erronous processing of -XX:FlightRecorderOptions
mgronlun
parents: 50851
diff changeset
   691
    // The existing option->optionString points to stack memory so no need to deallocate.
ce53844224b6 8205906: jdk.jfr.jcmd.TestJcmdDumpLimited fails due to erronous processing of -XX:FlightRecorderOptions
mgronlun
parents: 50851
diff changeset
   692
    const_cast<JavaVMOption*>(*option)->optionString = (char*)"-XX:StartFlightRecording=dumponexit=false";
50877
700fffd3c871 8205996: JDK-8205906 broke the build on Mac
mgronlun
parents: 50873
diff changeset
   693
    value = (*option)->optionString + 25;
50873
ce53844224b6 8205906: jdk.jfr.jcmd.TestJcmdDumpLimited fails due to erronous processing of -XX:FlightRecorderOptions
mgronlun
parents: 50851
diff changeset
   694
  } else {
ce53844224b6 8205906: jdk.jfr.jcmd.TestJcmdDumpLimited fails due to erronous processing of -XX:FlightRecorderOptions
mgronlun
parents: 50851
diff changeset
   695
    // -XX:StartFlightRecording[=|:]
ce53844224b6 8205906: jdk.jfr.jcmd.TestJcmdDumpLimited fails due to erronous processing of -XX:FlightRecorderOptions
mgronlun
parents: 50851
diff changeset
   696
    // set delimiter to '='
ce53844224b6 8205906: jdk.jfr.jcmd.TestJcmdDumpLimited fails due to erronous processing of -XX:FlightRecorderOptions
mgronlun
parents: 50851
diff changeset
   697
    *delimiter = '=';
ce53844224b6 8205906: jdk.jfr.jcmd.TestJcmdDumpLimited fails due to erronous processing of -XX:FlightRecorderOptions
mgronlun
parents: 50851
diff changeset
   698
    value = delimiter + 1;
ce53844224b6 8205906: jdk.jfr.jcmd.TestJcmdDumpLimited fails due to erronous processing of -XX:FlightRecorderOptions
mgronlun
parents: 50851
diff changeset
   699
  }
ce53844224b6 8205906: jdk.jfr.jcmd.TestJcmdDumpLimited fails due to erronous processing of -XX:FlightRecorderOptions
mgronlun
parents: 50851
diff changeset
   700
  assert(value != NULL, "invariant");
ce53844224b6 8205906: jdk.jfr.jcmd.TestJcmdDumpLimited fails due to erronous processing of -XX:FlightRecorderOptions
mgronlun
parents: 50851
diff changeset
   701
  const size_t value_length = strlen(value);
ce53844224b6 8205906: jdk.jfr.jcmd.TestJcmdDumpLimited fails due to erronous processing of -XX:FlightRecorderOptions
mgronlun
parents: 50851
diff changeset
   702
59259
127ca611f19b 8233197: Invert JvmtiExport::post_vm_initialized() and Jfr:on_vm_start() start-up order for correct option parsing
mgronlun
parents: 54603
diff changeset
   703
  if (start_flight_recording_options_array == NULL) {
127ca611f19b 8233197: Invert JvmtiExport::post_vm_initialized() and Jfr:on_vm_start() start-up order for correct option parsing
mgronlun
parents: 54603
diff changeset
   704
    start_flight_recording_options_array = new (ResourceObj::C_HEAP, mtTracing) GrowableArray<const char*>(8, true, mtTracing);
50873
ce53844224b6 8205906: jdk.jfr.jcmd.TestJcmdDumpLimited fails due to erronous processing of -XX:FlightRecorderOptions
mgronlun
parents: 50851
diff changeset
   705
  }
59259
127ca611f19b 8233197: Invert JvmtiExport::post_vm_initialized() and Jfr:on_vm_start() start-up order for correct option parsing
mgronlun
parents: 54603
diff changeset
   706
  assert(start_flight_recording_options_array != NULL, "invariant");
50873
ce53844224b6 8205906: jdk.jfr.jcmd.TestJcmdDumpLimited fails due to erronous processing of -XX:FlightRecorderOptions
mgronlun
parents: 50851
diff changeset
   707
  char* const startup_value = NEW_C_HEAP_ARRAY(char, value_length + 1, mtTracing);
ce53844224b6 8205906: jdk.jfr.jcmd.TestJcmdDumpLimited fails due to erronous processing of -XX:FlightRecorderOptions
mgronlun
parents: 50851
diff changeset
   708
  strncpy(startup_value, value, value_length + 1);
ce53844224b6 8205906: jdk.jfr.jcmd.TestJcmdDumpLimited fails due to erronous processing of -XX:FlightRecorderOptions
mgronlun
parents: 50851
diff changeset
   709
  assert(strncmp(startup_value, value, value_length) == 0, "invariant");
59259
127ca611f19b 8233197: Invert JvmtiExport::post_vm_initialized() and Jfr:on_vm_start() start-up order for correct option parsing
mgronlun
parents: 54603
diff changeset
   710
  start_flight_recording_options_array->append(startup_value);
50873
ce53844224b6 8205906: jdk.jfr.jcmd.TestJcmdDumpLimited fails due to erronous processing of -XX:FlightRecorderOptions
mgronlun
parents: 50851
diff changeset
   711
  return false;
ce53844224b6 8205906: jdk.jfr.jcmd.TestJcmdDumpLimited fails due to erronous processing of -XX:FlightRecorderOptions
mgronlun
parents: 50851
diff changeset
   712
}
ce53844224b6 8205906: jdk.jfr.jcmd.TestJcmdDumpLimited fails due to erronous processing of -XX:FlightRecorderOptions
mgronlun
parents: 50851
diff changeset
   713
59259
127ca611f19b 8233197: Invert JvmtiExport::post_vm_initialized() and Jfr:on_vm_start() start-up order for correct option parsing
mgronlun
parents: 54603
diff changeset
   714
const GrowableArray<const char*>* JfrOptionSet::start_flight_recording_options() {
127ca611f19b 8233197: Invert JvmtiExport::post_vm_initialized() and Jfr:on_vm_start() start-up order for correct option parsing
mgronlun
parents: 54603
diff changeset
   715
  return start_flight_recording_options_array;
50873
ce53844224b6 8205906: jdk.jfr.jcmd.TestJcmdDumpLimited fails due to erronous processing of -XX:FlightRecorderOptions
mgronlun
parents: 50851
diff changeset
   716
}
ce53844224b6 8205906: jdk.jfr.jcmd.TestJcmdDumpLimited fails due to erronous processing of -XX:FlightRecorderOptions
mgronlun
parents: 50851
diff changeset
   717
59259
127ca611f19b 8233197: Invert JvmtiExport::post_vm_initialized() and Jfr:on_vm_start() start-up order for correct option parsing
mgronlun
parents: 54603
diff changeset
   718
void JfrOptionSet::release_start_flight_recording_options() {
127ca611f19b 8233197: Invert JvmtiExport::post_vm_initialized() and Jfr:on_vm_start() start-up order for correct option parsing
mgronlun
parents: 54603
diff changeset
   719
  if (start_flight_recording_options_array != NULL) {
127ca611f19b 8233197: Invert JvmtiExport::post_vm_initialized() and Jfr:on_vm_start() start-up order for correct option parsing
mgronlun
parents: 54603
diff changeset
   720
    const int length = start_flight_recording_options_array->length();
50873
ce53844224b6 8205906: jdk.jfr.jcmd.TestJcmdDumpLimited fails due to erronous processing of -XX:FlightRecorderOptions
mgronlun
parents: 50851
diff changeset
   721
    for (int i = 0; i < length; ++i) {
59259
127ca611f19b 8233197: Invert JvmtiExport::post_vm_initialized() and Jfr:on_vm_start() start-up order for correct option parsing
mgronlun
parents: 54603
diff changeset
   722
      FREE_C_HEAP_ARRAY(char, start_flight_recording_options_array->at(i));
50873
ce53844224b6 8205906: jdk.jfr.jcmd.TestJcmdDumpLimited fails due to erronous processing of -XX:FlightRecorderOptions
mgronlun
parents: 50851
diff changeset
   723
    }
59259
127ca611f19b 8233197: Invert JvmtiExport::post_vm_initialized() and Jfr:on_vm_start() start-up order for correct option parsing
mgronlun
parents: 54603
diff changeset
   724
    delete start_flight_recording_options_array;
127ca611f19b 8233197: Invert JvmtiExport::post_vm_initialized() and Jfr:on_vm_start() start-up order for correct option parsing
mgronlun
parents: 54603
diff changeset
   725
    start_flight_recording_options_array = NULL;
50873
ce53844224b6 8205906: jdk.jfr.jcmd.TestJcmdDumpLimited fails due to erronous processing of -XX:FlightRecorderOptions
mgronlun
parents: 50851
diff changeset
   726
  }
ce53844224b6 8205906: jdk.jfr.jcmd.TestJcmdDumpLimited fails due to erronous processing of -XX:FlightRecorderOptions
mgronlun
parents: 50851
diff changeset
   727
}