1 /* 2 * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. 8 * 9 * This code is distributed in the hope that it will be useful, but WITHOUT 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 12 * version 2 for more details (a copy is included in the LICENSE file that 13 * accompanied this code). 14 * 15 * You should have received a copy of the GNU General Public License version 16 * 2 along with this work; if not, write to the Free Software Foundation, 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 18 * 19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 20 * or visit www.oracle.com if you need additional information or have any 21 * questions. 22 * 23 */ 24 25 #ifndef SHARE_VM_SERVICES_DIAGNOSTICARGUMENT_HPP 26 #define SHARE_VM_SERVICES_DIAGNOSTICARGUMENT_HPP 27 28 #include "classfile/vmSymbols.hpp" 29 #include "memory/allocation.hpp" 30 #include "runtime/os.hpp" 31 #include "runtime/thread.hpp" 32 #include "utilities/exceptions.hpp" 33 34 class StringArrayArgument : public CHeapObj { 35 private: 36 GrowableArray<char*>* _array; 37 public: 38 StringArrayArgument() { 39 _array = new(ResourceObj::C_HEAP)GrowableArray<char *>(32, true); 40 assert(_array != NULL, "Sanity check"); 41 } 42 void add(const char* str, size_t len) { 43 if (str != NULL) { 44 char* ptr = NEW_C_HEAP_ARRAY(char, len+1); 45 strncpy(ptr, str, len); 46 ptr[len] = 0; 47 _array->append(ptr); 48 } 49 } 50 GrowableArray<char*>* array() { 51 return _array; 52 } 53 ~StringArrayArgument() { 54 for (int i=0; i<_array->length(); i++) { 55 if(_array->at(i) != NULL) { // Safety check 56 FREE_C_HEAP_ARRAY(char, _array->at(i)); 57 } 58 } 59 delete _array; 60 } 61 }; 62 63 class NanoTimeArgument { 64 public: 65 jlong _nanotime; 66 jlong _time; 67 char _unit[3]; 68 }; 69 70 class MemorySizeArgument { 71 public: 72 u8 _size; 73 u8 _val; 74 char _multiplier; 75 }; 76 77 class GenDCmdArgument : public ResourceObj { 78 protected: 79 GenDCmdArgument* _next; 80 const char* _name; 81 const char* _description; 82 const char* _type; 83 const char* _default_string; 84 bool _is_set; 85 bool _is_mandatory; 86 bool _allow_multiple; 87 GenDCmdArgument(const char* name, const char* description, const char* type, 88 const char* default_string, bool mandatory) { 89 _name = name; 90 _description = description; 91 _type = type; 92 _default_string = default_string; 93 _is_mandatory = mandatory; 94 _is_set = false; 95 _allow_multiple = false; 96 }; 97 public: 98 const char* name() { return _name; } 99 const char* description() { return _description; } 100 const char* type() { return _type; } 101 const char* default_string() { return _default_string; } 102 bool is_set() { return _is_set; } 103 void set_is_set(bool b) { _is_set = b; } 104 bool allow_multiple() { return _allow_multiple; } 105 bool is_mandatory() { return _is_mandatory; } 106 bool has_value() { return _is_set || _default_string != NULL; } 107 bool has_default() { return _default_string != NULL; } 108 void read_value(const char* str, size_t len, TRAPS); 109 virtual void parse_value(const char* str, size_t len, TRAPS) = 0; 110 virtual void init_value(TRAPS) = 0; 111 virtual void reset(TRAPS) = 0; 112 virtual void cleanup() = 0; 113 void set_next(GenDCmdArgument* arg) { 114 _next = arg; 115 } 116 GenDCmdArgument* next() { 117 return _next; 118 } 119 }; 120 121 template <class ArgType> class DCmdArgument: public GenDCmdArgument { 122 private: 123 ArgType _value; 124 public: 125 DCmdArgument(const char* name, const char* description, const char* type, 126 bool mandatory) : 127 GenDCmdArgument(name, description, type, NULL, mandatory) { } 128 DCmdArgument(const char* name, const char* description, const char* type, 129 bool mandatory, const char* defaultvalue) : 130 GenDCmdArgument(name, description, type, defaultvalue, mandatory) 131 { } 132 ~DCmdArgument() { destroy_value(); } 133 ArgType value() { return _value;} 134 void set_value(ArgType v) { _value = v; } 135 void reset(TRAPS) { 136 destroy_value(); 137 init_value(CHECK); 138 _is_set = false; 139 } 140 void cleanup() { 141 destroy_value(); 142 } 143 void parse_value(const char* str, size_t len, TRAPS); 144 void init_value(TRAPS); 145 void destroy_value(); 146 }; 147 148 #endif /* SHARE_VM_SERVICES_DIAGNOSTICARGUMENT_HPP */