src/share/vm/services/diagnosticArgument.cpp

Wed, 14 Dec 2011 04:30:57 -0800

author
fparain
date
Wed, 14 Dec 2011 04:30:57 -0800
changeset 3329
3b688d6ff3d0
child 3476
520830f632e7
permissions
-rw-r--r--

7104647: Adding a diagnostic command framework
Reviewed-by: phh, dcubed

fparain@3329 1 /*
fparain@3329 2 * Copyright (c) 2011, 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"
fparain@3329 27 #include "runtime/thread.hpp"
fparain@3329 28 #include "services/diagnosticArgument.hpp"
fparain@3329 29
fparain@3329 30 void GenDCmdArgument::read_value(const char* str, size_t len, TRAPS) {
fparain@3329 31 if (is_set()) {
fparain@3329 32 THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(),
fparain@3329 33 "Duplicates in diagnostic command arguments");
fparain@3329 34 }
fparain@3329 35 parse_value(str, len, CHECK);
fparain@3329 36 set_is_set(true);
fparain@3329 37 }
fparain@3329 38
fparain@3329 39 template <> void DCmdArgument<jlong>::parse_value(const char* str,
fparain@3329 40 size_t len, TRAPS) {
fparain@3329 41 if (sscanf(str, INT64_FORMAT, &_value) != 1) {
fparain@3329 42 THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(),
fparain@3329 43 "Integer parsing error in diagnostic command arguments");
fparain@3329 44 }
fparain@3329 45 }
fparain@3329 46
fparain@3329 47 template <> void DCmdArgument<jlong>::init_value(TRAPS) {
fparain@3329 48 if (has_default()) {
fparain@3329 49 this->parse_value(_default_string, strlen(_default_string), THREAD);
fparain@3329 50 if (HAS_PENDING_EXCEPTION) {
fparain@3329 51 fatal("Default string must be parsable");
fparain@3329 52 }
fparain@3329 53 } else {
fparain@3329 54 set_value(0);
fparain@3329 55 }
fparain@3329 56 }
fparain@3329 57
fparain@3329 58 template <> void DCmdArgument<jlong>::destroy_value() { }
fparain@3329 59
fparain@3329 60 template <> void DCmdArgument<bool>::parse_value(const char* str,
fparain@3329 61 size_t len, TRAPS) {
fparain@3329 62 if (len == 0) {
fparain@3329 63 set_value(true);
fparain@3329 64 } else {
fparain@3329 65 if (strcasecmp(str, "true") == 0) {
fparain@3329 66 set_value(true);
fparain@3329 67 } else if (strcasecmp(str, "false") == 0) {
fparain@3329 68 set_value(false);
fparain@3329 69 } else {
fparain@3329 70 THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(),
fparain@3329 71 "Boolean parsing error in diagnostic command arguments");
fparain@3329 72 }
fparain@3329 73 }
fparain@3329 74 }
fparain@3329 75
fparain@3329 76 template <> void DCmdArgument<bool>::init_value(TRAPS) {
fparain@3329 77 if (has_default()) {
fparain@3329 78 this->parse_value(_default_string, strlen(_default_string), THREAD);
fparain@3329 79 if (HAS_PENDING_EXCEPTION) {
fparain@3329 80 fatal("Default string must be parsable");
fparain@3329 81 }
fparain@3329 82 } else {
fparain@3329 83 set_value(false);
fparain@3329 84 }
fparain@3329 85 }
fparain@3329 86
fparain@3329 87 template <> void DCmdArgument<bool>::destroy_value() { }
fparain@3329 88
fparain@3329 89 template <> void DCmdArgument<char*>::parse_value(const char* str,
fparain@3329 90 size_t len, TRAPS) {
fparain@3329 91 _value = NEW_C_HEAP_ARRAY(char, len+1);
fparain@3329 92 strncpy(_value, str, len);
fparain@3329 93 _value[len] = 0;
fparain@3329 94 }
fparain@3329 95
fparain@3329 96 template <> void DCmdArgument<char*>::init_value(TRAPS) {
fparain@3329 97 if (has_default()) {
fparain@3329 98 this->parse_value(_default_string, strlen(_default_string), THREAD);
fparain@3329 99 if (HAS_PENDING_EXCEPTION) {
fparain@3329 100 fatal("Default string must be parsable");
fparain@3329 101 }
fparain@3329 102 } else {
fparain@3329 103 set_value(NULL);
fparain@3329 104 }
fparain@3329 105 }
fparain@3329 106
fparain@3329 107 template <> void DCmdArgument<char*>::destroy_value() {
fparain@3329 108 if (_value != NULL) {
fparain@3329 109 FREE_C_HEAP_ARRAY(char, _value);
fparain@3329 110 set_value(NULL);
fparain@3329 111 }
fparain@3329 112 }

mercurial