fparain@3329: /* fparain@3559: * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. fparain@3329: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. fparain@3329: * fparain@3329: * This code is free software; you can redistribute it and/or modify it fparain@3329: * under the terms of the GNU General Public License version 2 only, as fparain@3329: * published by the Free Software Foundation. fparain@3329: * fparain@3329: * This code is distributed in the hope that it will be useful, but WITHOUT fparain@3329: * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or fparain@3329: * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License fparain@3329: * version 2 for more details (a copy is included in the LICENSE file that fparain@3329: * accompanied this code). fparain@3329: * fparain@3329: * You should have received a copy of the GNU General Public License version fparain@3329: * 2 along with this work; if not, write to the Free Software Foundation, fparain@3329: * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. fparain@3329: * fparain@3329: * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA fparain@3329: * or visit www.oracle.com if you need additional information or have any fparain@3329: * questions. fparain@3329: * fparain@3329: */ fparain@3329: fparain@3329: #ifndef SHARE_VM_SERVICES_DIAGNOSTICARGUMENT_HPP fparain@3329: #define SHARE_VM_SERVICES_DIAGNOSTICARGUMENT_HPP fparain@3329: fparain@3329: #include "classfile/vmSymbols.hpp" fparain@3329: #include "memory/allocation.hpp" fparain@3329: #include "runtime/os.hpp" fparain@3329: #include "runtime/thread.hpp" fparain@3329: #include "utilities/exceptions.hpp" fparain@3329: zgu@3900: class StringArrayArgument : public CHeapObj { fparain@3559: private: fparain@3559: GrowableArray* _array; fparain@3559: public: fparain@3559: StringArrayArgument() { zgu@3900: _array = new(ResourceObj::C_HEAP, mtInternal)GrowableArray(32, true); fparain@3559: assert(_array != NULL, "Sanity check"); fparain@3559: } fparain@3559: void add(const char* str, size_t len) { fparain@3559: if (str != NULL) { zgu@3900: char* ptr = NEW_C_HEAP_ARRAY(char, len+1, mtInternal); fparain@3559: strncpy(ptr, str, len); fparain@3559: ptr[len] = 0; fparain@3559: _array->append(ptr); fparain@3559: } fparain@3559: } fparain@3559: GrowableArray* array() { fparain@3559: return _array; fparain@3559: } fparain@3559: ~StringArrayArgument() { fparain@3559: for (int i=0; i<_array->length(); i++) { fparain@3559: if(_array->at(i) != NULL) { // Safety check zgu@3900: FREE_C_HEAP_ARRAY(char, _array->at(i), mtInternal); fparain@3559: } fparain@3559: } fparain@3559: delete _array; fparain@3559: } fparain@3559: }; fparain@3559: fparain@3559: class NanoTimeArgument { fparain@3559: public: fparain@3559: jlong _nanotime; fparain@3559: jlong _time; fparain@3559: char _unit[3]; fparain@3559: }; fparain@3559: fparain@3559: class MemorySizeArgument { fparain@3559: public: fparain@3559: u8 _size; fparain@3559: u8 _val; fparain@3559: char _multiplier; fparain@3559: }; fparain@3559: fparain@3329: class GenDCmdArgument : public ResourceObj { fparain@3329: protected: fparain@3329: GenDCmdArgument* _next; fparain@3329: const char* _name; fparain@3329: const char* _description; fparain@3329: const char* _type; fparain@3329: const char* _default_string; fparain@3329: bool _is_set; fparain@3329: bool _is_mandatory; fparain@3559: bool _allow_multiple; fparain@3329: GenDCmdArgument(const char* name, const char* description, const char* type, fparain@3329: const char* default_string, bool mandatory) { fparain@3329: _name = name; fparain@3329: _description = description; fparain@3329: _type = type; fparain@3329: _default_string = default_string; fparain@3329: _is_mandatory = mandatory; fparain@3329: _is_set = false; fparain@3559: _allow_multiple = false; fparain@3329: }; fparain@3329: public: fparain@3329: const char* name() { return _name; } fparain@3329: const char* description() { return _description; } fparain@3329: const char* type() { return _type; } fparain@3329: const char* default_string() { return _default_string; } fparain@3329: bool is_set() { return _is_set; } fparain@3329: void set_is_set(bool b) { _is_set = b; } fparain@3559: bool allow_multiple() { return _allow_multiple; } fparain@3329: bool is_mandatory() { return _is_mandatory; } fparain@3329: bool has_value() { return _is_set || _default_string != NULL; } fparain@3329: bool has_default() { return _default_string != NULL; } fparain@3329: void read_value(const char* str, size_t len, TRAPS); fparain@3329: virtual void parse_value(const char* str, size_t len, TRAPS) = 0; fparain@3329: virtual void init_value(TRAPS) = 0; fparain@3329: virtual void reset(TRAPS) = 0; fparain@3329: virtual void cleanup() = 0; nloodin@3681: virtual void value_as_str(char* buf, size_t len) = 0; fparain@3329: void set_next(GenDCmdArgument* arg) { fparain@3329: _next = arg; fparain@3329: } fparain@3329: GenDCmdArgument* next() { fparain@3329: return _next; fparain@3329: } nloodin@3681: nloodin@3681: void to_string(jlong l, char* buf, size_t len); nloodin@3681: void to_string(bool b, char* buf, size_t len); nloodin@3681: void to_string(char* c, char* buf, size_t len); nloodin@3681: void to_string(NanoTimeArgument n, char* buf, size_t len); nloodin@3681: void to_string(MemorySizeArgument f, char* buf, size_t len); nloodin@3681: void to_string(StringArrayArgument* s, char* buf, size_t len); fparain@3329: }; fparain@3329: fparain@3329: template class DCmdArgument: public GenDCmdArgument { fparain@3329: private: fparain@3329: ArgType _value; fparain@3329: public: fparain@3329: DCmdArgument(const char* name, const char* description, const char* type, fparain@3329: bool mandatory) : fparain@3329: GenDCmdArgument(name, description, type, NULL, mandatory) { } fparain@3329: DCmdArgument(const char* name, const char* description, const char* type, fparain@3329: bool mandatory, const char* defaultvalue) : fparain@3329: GenDCmdArgument(name, description, type, defaultvalue, mandatory) fparain@3329: { } fparain@3329: ~DCmdArgument() { destroy_value(); } fparain@3329: ArgType value() { return _value;} fparain@3329: void set_value(ArgType v) { _value = v; } fparain@3329: void reset(TRAPS) { fparain@3329: destroy_value(); fparain@3329: init_value(CHECK); fparain@3329: _is_set = false; fparain@3329: } fparain@3329: void cleanup() { fparain@3329: destroy_value(); fparain@3329: } fparain@3329: void parse_value(const char* str, size_t len, TRAPS); fparain@3329: void init_value(TRAPS); fparain@3329: void destroy_value(); nloodin@3681: void value_as_str(char *buf, size_t len) { return to_string(_value, buf, len);} fparain@3329: }; fparain@3329: fparain@3329: #endif /* SHARE_VM_SERVICES_DIAGNOSTICARGUMENT_HPP */