src/share/vm/services/diagnosticArgument.cpp

Thu, 14 Jun 2018 09:15:08 -0700

author
kevinw
date
Thu, 14 Jun 2018 09:15:08 -0700
changeset 9327
f96fcd9e1e1b
parent 5751
1b03bed31241
child 9448
73d689add964
child 9858
b985cbb00e68
permissions
-rw-r--r--

8081202: Hotspot compile warning: "Invalid suffix on literal; C++11 requires a space between literal and identifier"
Summary: Need to add a space between macro identifier and string literal
Reviewed-by: bpittore, stefank, dholmes, kbarrett

fparain@3329 1 /*
katleman@4916 2 * Copyright (c) 2011, 2013, Oracle and/or its affiliates. All rights reserved.
fparain@3329 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
fparain@3329 4 *
fparain@3329 5 * This code is free software; you can redistribute it and/or modify it
fparain@3329 6 * under the terms of the GNU General Public License version 2 only, as
fparain@3329 7 * published by the Free Software Foundation.
fparain@3329 8 *
fparain@3329 9 * This code is distributed in the hope that it will be useful, but WITHOUT
fparain@3329 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
fparain@3329 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
fparain@3329 12 * version 2 for more details (a copy is included in the LICENSE file that
fparain@3329 13 * accompanied this code).
fparain@3329 14 *
fparain@3329 15 * You should have received a copy of the GNU General Public License version
fparain@3329 16 * 2 along with this work; if not, write to the Free Software Foundation,
fparain@3329 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
fparain@3329 18 *
fparain@3329 19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
fparain@3329 20 * or visit www.oracle.com if you need additional information or have any
fparain@3329 21 * questions.
fparain@3329 22 *
fparain@3329 23 */
fparain@3329 24
fparain@3329 25 #include "precompiled.hpp"
fparain@3329 26 #include "memory/allocation.inline.hpp"
sla@5237 27 #include "memory/resourceArea.hpp"
fparain@3329 28 #include "runtime/thread.hpp"
fparain@3329 29 #include "services/diagnosticArgument.hpp"
fparain@3329 30
fparain@3329 31 void GenDCmdArgument::read_value(const char* str, size_t len, TRAPS) {
fparain@3559 32 /* NOTE:Some argument types doesn't require a value,
fparain@3559 33 * for instance boolean arguments: "enableFeatureX". is
fparain@3559 34 * equivalent to "enableFeatureX=true". In these cases,
fparain@3559 35 * str will be null. This is perfectly valid.
fparain@3559 36 * All argument types must perform null checks on str.
fparain@3559 37 */
fparain@3559 38
fparain@3559 39 if (is_set() && !allow_multiple()) {
fparain@3329 40 THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(),
fparain@3559 41 "Duplicates in diagnostic command arguments\n");
fparain@3329 42 }
fparain@3329 43 parse_value(str, len, CHECK);
fparain@3329 44 set_is_set(true);
fparain@3329 45 }
fparain@3329 46
nloodin@3681 47 void GenDCmdArgument::to_string(jlong l, char* buf, size_t len) {
nloodin@3681 48 jio_snprintf(buf, len, INT64_FORMAT, l);
nloodin@3681 49 }
nloodin@3681 50
nloodin@3681 51 void GenDCmdArgument::to_string(bool b, char* buf, size_t len) {
nloodin@3681 52 jio_snprintf(buf, len, b ? "true" : "false");
nloodin@3681 53 }
nloodin@3681 54
nloodin@3681 55 void GenDCmdArgument::to_string(NanoTimeArgument n, char* buf, size_t len) {
nloodin@3681 56 jio_snprintf(buf, len, INT64_FORMAT, n._nanotime);
nloodin@3681 57 }
nloodin@3681 58
nloodin@3681 59 void GenDCmdArgument::to_string(MemorySizeArgument m, char* buf, size_t len) {
nloodin@3681 60 jio_snprintf(buf, len, INT64_FORMAT, m._size);
nloodin@3681 61 }
nloodin@3681 62
nloodin@3681 63 void GenDCmdArgument::to_string(char* c, char* buf, size_t len) {
allwin@5751 64 jio_snprintf(buf, len, "%s", (c != NULL) ? c : "");
nloodin@3681 65 }
nloodin@3681 66
nloodin@3681 67 void GenDCmdArgument::to_string(StringArrayArgument* f, char* buf, size_t len) {
nloodin@3681 68 int length = f->array()->length();
nloodin@3681 69 size_t written = 0;
nloodin@3681 70 buf[0] = 0;
nloodin@3681 71 for (int i = 0; i < length; i++) {
nloodin@3681 72 char* next_str = f->array()->at(i);
nloodin@3681 73 size_t next_size = strlen(next_str);
nloodin@3681 74 //Check if there's room left to write next element
nloodin@3681 75 if (written + next_size > len) {
nloodin@3681 76 return;
nloodin@3681 77 }
nloodin@3681 78 //Actually write element
nloodin@3681 79 strcat(buf, next_str);
nloodin@3681 80 written += next_size;
nloodin@3681 81 //Check if there's room left for the comma
nloodin@3681 82 if (i < length-1 && len - written > 0) {
nloodin@3681 83 strcat(buf, ",");
nloodin@3681 84 }
nloodin@3681 85 }
nloodin@3681 86 }
nloodin@3681 87
fparain@3329 88 template <> void DCmdArgument<jlong>::parse_value(const char* str,
fparain@3329 89 size_t len, TRAPS) {
sla@5237 90 int scanned = -1;
sla@5237 91 if (str == NULL
kevinw@9327 92 || sscanf(str, JLONG_FORMAT "%n", &_value, &scanned) != 1
sla@5237 93 || (size_t)scanned != len)
sla@5237 94 {
sla@5237 95 ResourceMark rm;
sla@5237 96
sla@5237 97 char* buf = NEW_RESOURCE_ARRAY(char, len + 1);
sla@5237 98 strncpy(buf, str, len);
sla@5237 99 buf[len] = '\0';
sla@5237 100 Exceptions::fthrow(THREAD_AND_LOCATION, vmSymbols::java_lang_IllegalArgumentException(),
sla@5237 101 "Integer parsing error in command argument '%s'. Could not parse: %s.", _name, buf);
fparain@3329 102 }
fparain@3329 103 }
fparain@3329 104
fparain@3329 105 template <> void DCmdArgument<jlong>::init_value(TRAPS) {
fparain@3329 106 if (has_default()) {
fparain@3329 107 this->parse_value(_default_string, strlen(_default_string), THREAD);
fparain@3329 108 if (HAS_PENDING_EXCEPTION) {
sla@5237 109 fatal("Default string must be parseable");
fparain@3329 110 }
fparain@3329 111 } else {
fparain@3329 112 set_value(0);
fparain@3329 113 }
fparain@3329 114 }
fparain@3329 115
fparain@3329 116 template <> void DCmdArgument<jlong>::destroy_value() { }
fparain@3329 117
fparain@3329 118 template <> void DCmdArgument<bool>::parse_value(const char* str,
fparain@3329 119 size_t len, TRAPS) {
fparain@3476 120 // len is the length of the current token starting at str
fparain@3329 121 if (len == 0) {
fparain@3329 122 set_value(true);
fparain@3329 123 } else {
fparain@3476 124 if (len == strlen("true") && strncasecmp(str, "true", len) == 0) {
fparain@3329 125 set_value(true);
fparain@3476 126 } else if (len == strlen("false") && strncasecmp(str, "false", len) == 0) {
fparain@3329 127 set_value(false);
fparain@3329 128 } else {
sla@5237 129 ResourceMark rm;
sla@5237 130
sla@5237 131 char* buf = NEW_RESOURCE_ARRAY(char, len + 1);
sla@5237 132 strncpy(buf, str, len);
sla@5237 133 buf[len] = '\0';
sla@5237 134 Exceptions::fthrow(THREAD_AND_LOCATION, vmSymbols::java_lang_IllegalArgumentException(),
sla@5237 135 "Boolean parsing error in command argument '%s'. Could not parse: %s.", _name, buf);
fparain@3329 136 }
fparain@3329 137 }
fparain@3329 138 }
fparain@3329 139
fparain@3329 140 template <> void DCmdArgument<bool>::init_value(TRAPS) {
fparain@3329 141 if (has_default()) {
fparain@3329 142 this->parse_value(_default_string, strlen(_default_string), THREAD);
fparain@3329 143 if (HAS_PENDING_EXCEPTION) {
fparain@3329 144 fatal("Default string must be parsable");
fparain@3329 145 }
fparain@3329 146 } else {
fparain@3329 147 set_value(false);
fparain@3329 148 }
fparain@3329 149 }
fparain@3329 150
fparain@3329 151 template <> void DCmdArgument<bool>::destroy_value() { }
fparain@3329 152
fparain@3329 153 template <> void DCmdArgument<char*>::parse_value(const char* str,
fparain@3329 154 size_t len, TRAPS) {
fparain@3559 155 if (str == NULL) {
fparain@3559 156 _value = NULL;
fparain@3559 157 } else {
zgu@3900 158 _value = NEW_C_HEAP_ARRAY(char, len+1, mtInternal);
fparain@3559 159 strncpy(_value, str, len);
fparain@3559 160 _value[len] = 0;
fparain@3559 161 }
fparain@3329 162 }
fparain@3329 163
fparain@3329 164 template <> void DCmdArgument<char*>::init_value(TRAPS) {
fparain@3559 165 if (has_default() && _default_string != NULL) {
fparain@3329 166 this->parse_value(_default_string, strlen(_default_string), THREAD);
fparain@3329 167 if (HAS_PENDING_EXCEPTION) {
fparain@3559 168 fatal("Default string must be parsable");
fparain@3329 169 }
fparain@3329 170 } else {
fparain@3329 171 set_value(NULL);
fparain@3329 172 }
fparain@3329 173 }
fparain@3329 174
fparain@3329 175 template <> void DCmdArgument<char*>::destroy_value() {
fparain@3329 176 if (_value != NULL) {
zgu@3900 177 FREE_C_HEAP_ARRAY(char, _value, mtInternal);
fparain@3329 178 set_value(NULL);
fparain@3329 179 }
fparain@3329 180 }
fparain@3559 181
fparain@3559 182 template <> void DCmdArgument<NanoTimeArgument>::parse_value(const char* str,
fparain@3559 183 size_t len, TRAPS) {
fparain@3559 184 if (str == NULL) {
fparain@3559 185 THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(),
sla@5237 186 "Integer parsing error nanotime value: syntax error, value is null");
fparain@3559 187 }
fparain@3559 188
hseigel@4465 189 int argc = sscanf(str, JLONG_FORMAT, &_value._time);
fparain@3559 190 if (argc != 1) {
fparain@3559 191 THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(),
fparain@3559 192 "Integer parsing error nanotime value: syntax error");
fparain@3559 193 }
fparain@3559 194 size_t idx = 0;
fparain@3559 195 while(idx < len && isdigit(str[idx])) {
fparain@3559 196 idx++;
fparain@3559 197 }
fparain@3559 198 if (idx == len) {
fparain@3559 199 // only accept missing unit if the value is 0
fparain@3559 200 if (_value._time != 0) {
fparain@3559 201 THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(),
fparain@3559 202 "Integer parsing error nanotime value: unit required");
fparain@3559 203 } else {
fparain@3559 204 _value._nanotime = 0;
fparain@3559 205 strcpy(_value._unit, "ns");
fparain@3559 206 return;
fparain@3559 207 }
fparain@3559 208 } else if(len - idx > 2) {
fparain@3559 209 THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(),
fparain@3559 210 "Integer parsing error nanotime value: illegal unit");
fparain@3559 211 } else {
fparain@3559 212 strncpy(_value._unit, &str[idx], len - idx);
fparain@3559 213 /*Write an extra null termination. This is safe because _value._unit
fparain@3559 214 * is declared as char[3], and length is checked to be not larger than
fparain@3559 215 * two above. Also, this is necessary, since length might be 1, and the
fparain@3559 216 * default value already in the string is ns, which is two chars.
fparain@3559 217 */
fparain@3559 218 _value._unit[len-idx] = '\0';
fparain@3559 219 }
fparain@3559 220
fparain@3559 221 if (strcmp(_value._unit, "ns") == 0) {
fparain@3559 222 _value._nanotime = _value._time;
fparain@3559 223 } else if (strcmp(_value._unit, "us") == 0) {
fparain@3559 224 _value._nanotime = _value._time * 1000;
fparain@3559 225 } else if (strcmp(_value._unit, "ms") == 0) {
fparain@3559 226 _value._nanotime = _value._time * 1000 * 1000;
fparain@3559 227 } else if (strcmp(_value._unit, "s") == 0) {
fparain@3559 228 _value._nanotime = _value._time * 1000 * 1000 * 1000;
fparain@3559 229 } else if (strcmp(_value._unit, "m") == 0) {
fparain@3559 230 _value._nanotime = _value._time * 60 * 1000 * 1000 * 1000;
fparain@3559 231 } else if (strcmp(_value._unit, "h") == 0) {
fparain@3559 232 _value._nanotime = _value._time * 60 * 60 * 1000 * 1000 * 1000;
fparain@3559 233 } else if (strcmp(_value._unit, "d") == 0) {
fparain@3559 234 _value._nanotime = _value._time * 24 * 60 * 60 * 1000 * 1000 * 1000;
fparain@3559 235 } else {
fparain@3559 236 THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(),
fparain@3559 237 "Integer parsing error nanotime value: illegal unit");
fparain@3559 238 }
fparain@3559 239 }
fparain@3559 240
fparain@3559 241 template <> void DCmdArgument<NanoTimeArgument>::init_value(TRAPS) {
fparain@3559 242 if (has_default()) {
fparain@3559 243 this->parse_value(_default_string, strlen(_default_string), THREAD);
fparain@3559 244 if (HAS_PENDING_EXCEPTION) {
fparain@3559 245 fatal("Default string must be parsable");
fparain@3559 246 }
fparain@3559 247 } else {
fparain@3559 248 _value._time = 0;
fparain@3559 249 _value._nanotime = 0;
ccheung@5259 250 strcpy(_value._unit, "ns");
fparain@3559 251 }
fparain@3559 252 }
fparain@3559 253
fparain@3559 254 template <> void DCmdArgument<NanoTimeArgument>::destroy_value() { }
fparain@3559 255
fparain@3559 256 // WARNING StringArrayArgument can only be used as an option, it cannot be
fparain@3559 257 // used as an argument with the DCmdParser
fparain@3559 258
fparain@3559 259 template <> void DCmdArgument<StringArrayArgument*>::parse_value(const char* str,
fparain@3559 260 size_t len, TRAPS) {
fparain@3559 261 _value->add(str,len);
fparain@3559 262 }
fparain@3559 263
fparain@3559 264 template <> void DCmdArgument<StringArrayArgument*>::init_value(TRAPS) {
fparain@3559 265 _value = new StringArrayArgument();
fparain@3559 266 _allow_multiple = true;
fparain@3559 267 if (has_default()) {
fparain@3559 268 fatal("StringArrayArgument cannot have default value");
fparain@3559 269 }
fparain@3559 270 }
fparain@3559 271
fparain@3559 272 template <> void DCmdArgument<StringArrayArgument*>::destroy_value() {
fparain@3559 273 if (_value != NULL) {
fparain@3559 274 delete _value;
fparain@3559 275 set_value(NULL);
fparain@3559 276 }
fparain@3559 277 }
fparain@3559 278
fparain@3559 279 template <> void DCmdArgument<MemorySizeArgument>::parse_value(const char* str,
fparain@3559 280 size_t len, TRAPS) {
fparain@3559 281 if (str == NULL) {
fparain@3559 282 THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(),
fparain@3559 283 "Integer parsing error nanotime value: syntax error");
fparain@3559 284 }
fparain@3559 285
fparain@3559 286 if (*str == '-') {
fparain@3559 287 THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(),
fparain@3559 288 "Parsing error memory size value: negative values not allowed");
fparain@3559 289 }
fparain@3559 290 int res = sscanf(str, UINT64_FORMAT "%c", &_value._val, &_value._multiplier);
fparain@3559 291 if (res == 2) {
fparain@3559 292 switch (_value._multiplier) {
fparain@3559 293 case 'k': case 'K':
fparain@3559 294 _value._size = _value._val * 1024;
fparain@3559 295 break;
fparain@3559 296 case 'm': case 'M':
fparain@3559 297 _value._size = _value._val * 1024 * 1024;
fparain@3559 298 break;
fparain@3559 299 case 'g': case 'G':
fparain@3559 300 _value._size = _value._val * 1024 * 1024 * 1024;
fparain@3559 301 break;
fparain@3559 302 default:
fparain@3559 303 _value._size = _value._val;
fparain@3559 304 _value._multiplier = ' ';
fparain@3559 305 //default case should be to break with no error, since user
fparain@3559 306 //can write size in bytes, or might have a delimiter and next arg
fparain@3559 307 break;
fparain@3559 308 }
fparain@3559 309 } else if (res == 1) {
fparain@3559 310 _value._size = _value._val;
fparain@3559 311 } else {
fparain@3559 312 THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(),
fparain@3559 313 "Parsing error memory size value: invalid value");
fparain@3559 314 }
fparain@3559 315 }
fparain@3559 316
fparain@3559 317 template <> void DCmdArgument<MemorySizeArgument>::init_value(TRAPS) {
fparain@3559 318 if (has_default()) {
fparain@3559 319 this->parse_value(_default_string, strlen(_default_string), THREAD);
fparain@3559 320 if (HAS_PENDING_EXCEPTION) {
fparain@3559 321 fatal("Default string must be parsable");
fparain@3559 322 }
fparain@3559 323 } else {
fparain@3559 324 _value._size = 0;
fparain@3559 325 _value._val = 0;
fparain@3559 326 _value._multiplier = ' ';
fparain@3559 327 }
fparain@3559 328 }
fparain@3559 329
fparain@3559 330 template <> void DCmdArgument<MemorySizeArgument>::destroy_value() { }

mercurial