annotate src/share/vm/services/diagnosticFramework.hpp @ 5763:a3d71693e0ce

removed bytecode disassembly from CodeCacheRuntime into separate BytecodeDisassembler class removed VM call for doing bytecode disassembly added support for explicitly excluding classes from JaCoCo (put '// JaCoCo Exclude' somewhere in the source file) added node intrinsics to MaterializeNode added snippets for the UnsignedMath classes each file opened by CFGPrinter now includes a unique id in its name to avoid a race of multiple threads writing to the same file the IdealGraphPrinter uses the new BytecodeDisassembler mechanism teh UnsignedMath class is exclude from JaCoCo processing as it is used in snippets
author Doug Simon <doug.simon@oracle.com>
date Wed, 04 Jul 2012 21:57:49 +0200
parents f1cb6f9cfe21
children d2a62e0f25eb
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
4133
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
1 /*
4932
f1cb6f9cfe21 7145243: Need additional specializations for argument parsing framework
fparain
parents: 4851
diff changeset
2 * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
4133
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
4 *
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
5 * This code is free software; you can redistribute it and/or modify it
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
6 * under the terms of the GNU General Public License version 2 only, as
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
7 * published by the Free Software Foundation.
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
8 *
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
9 * This code is distributed in the hope that it will be useful, but WITHOUT
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
12 * version 2 for more details (a copy is included in the LICENSE file that
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
13 * accompanied this code).
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
14 *
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
15 * You should have received a copy of the GNU General Public License version
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
16 * 2 along with this work; if not, write to the Free Software Foundation,
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
18 *
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
20 * or visit www.oracle.com if you need additional information or have any
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
21 * questions.
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
22 *
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
23 */
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
24
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
25 #ifndef SHARE_VM_SERVICES_DIAGNOSTICFRAMEWORK_HPP
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
26 #define SHARE_VM_SERVICES_DIAGNOSTICFRAMEWORK_HPP
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
27
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
28 #include "classfile/vmSymbols.hpp"
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
29 #include "memory/allocation.hpp"
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
30 #include "runtime/arguments.hpp"
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
31 #include "runtime/os.hpp"
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
32 #include "runtime/vm_version.hpp"
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
33 #include "runtime/vmThread.hpp"
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
34 #include "utilities/ostream.hpp"
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
35
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
36
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
37 // CmdLine is the class used to handle a command line containing a single
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
38 // diagnostic command and its arguments. It provides methods to access the
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
39 // command name and the beginning of the arguments. The class is also
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
40 // able to identify commented command lines and the "stop" keyword
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
41 class CmdLine : public StackObj {
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
42 private:
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
43 const char* _cmd;
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
44 size_t _cmd_len;
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
45 const char* _args;
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
46 size_t _args_len;
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
47 public:
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
48 CmdLine(const char* line, size_t len, bool no_command_name);
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
49 const char* args_addr() const { return _args; }
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
50 size_t args_len() const { return _args_len; }
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
51 const char* cmd_addr() const { return _cmd; }
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
52 size_t cmd_len() const { return _cmd_len; }
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
53 bool is_empty() { return _cmd_len == 0; }
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
54 bool is_executable() { return is_empty() || _cmd[0] != '#'; }
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
55 bool is_stop() { return !is_empty() && strncmp("stop", _cmd, _cmd_len) == 0; }
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
56 };
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
57
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
58 // Iterator class taking a character string in input and returning a CmdLine
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
59 // instance for each command line. The argument delimiter has to be specified.
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
60 class DCmdIter : public StackObj {
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
61 friend class DCmd;
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
62 private:
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
63 const char* _str;
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
64 char _delim;
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
65 size_t _len;
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
66 size_t _cursor;
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
67 public:
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
68
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
69 DCmdIter(const char* str, char delim) {
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
70 _str = str;
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
71 _delim = delim;
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
72 _len = strlen(str);
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
73 _cursor = 0;
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
74 }
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
75 bool has_next() { return _cursor < _len; }
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
76 CmdLine next() {
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
77 assert(_cursor <= _len, "Cannot iterate more");
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
78 size_t n = _cursor;
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
79 while (n < _len && _str[n] != _delim) n++;
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
80 CmdLine line(&(_str[_cursor]), n - _cursor, false);
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
81 _cursor = n + 1;
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
82 // The default copy constructor of CmdLine is used to return a CmdLine
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
83 // instance to the caller.
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
84 return line;
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
85 }
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
86 };
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
87
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
88 // Iterator class to iterate over diagnostic command arguments
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
89 class DCmdArgIter : public ResourceObj {
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
90 const char* _buffer;
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
91 size_t _len;
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
92 size_t _cursor;
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
93 const char* _key_addr;
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
94 size_t _key_len;
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
95 const char* _value_addr;
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
96 size_t _value_len;
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
97 char _delim;
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
98 public:
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
99 DCmdArgIter(const char* buf, size_t len, char delim) {
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
100 _buffer = buf;
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
101 _len = len;
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
102 _delim = delim;
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
103 _cursor = 0;
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
104 }
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
105 bool next(TRAPS);
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
106 const char* key_addr() { return _key_addr; }
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
107 size_t key_length() { return _key_len; }
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
108 const char* value_addr() { return _value_addr; }
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
109 size_t value_length() { return _value_len; }
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
110 };
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
111
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
112 // A DCmdInfo instance provides a description of a diagnostic command. It is
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
113 // used to export the description to the JMX interface of the framework.
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
114 class DCmdInfo : public ResourceObj {
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
115 protected:
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
116 const char* _name;
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
117 const char* _description;
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
118 const char* _impact;
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
119 int _num_arguments;
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
120 bool _is_enabled;
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
121 public:
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
122 DCmdInfo(const char* name,
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
123 const char* description,
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
124 const char* impact,
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
125 int num_arguments,
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
126 bool enabled) {
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
127 this->_name = name;
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
128 this->_description = description;
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
129 this->_impact = impact;
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
130 this->_num_arguments = num_arguments;
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
131 this->_is_enabled = enabled;
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
132 }
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
133 const char* name() const { return _name; }
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
134 const char* description() const { return _description; }
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
135 const char* impact() const { return _impact; }
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
136 int num_arguments() const { return _num_arguments; }
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
137 bool is_enabled() const { return _is_enabled; }
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
138
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
139 static bool by_name(void* name, DCmdInfo* info);
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
140 };
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
141
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
142 // A DCmdArgumentInfo instance provides a description of a diagnostic command
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
143 // argument. It is used to export the description to the JMX interface of the
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
144 // framework.
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
145 class DCmdArgumentInfo : public ResourceObj {
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
146 protected:
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
147 const char* _name;
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
148 const char* _description;
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
149 const char* _type;
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
150 const char* _default_string;
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
151 bool _mandatory;
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
152 bool _option;
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
153 int _position;
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
154 public:
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
155 DCmdArgumentInfo(const char* name, const char* description, const char* type,
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
156 const char* default_string, bool mandatory, bool option) {
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
157 this->_name = name;
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
158 this->_description = description;
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
159 this->_type = type;
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
160 this->_default_string = default_string;
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
161 this->_option = option;
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
162 this->_mandatory = mandatory;
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
163 this->_option = option;
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
164 this->_position = -1;
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
165 }
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
166 DCmdArgumentInfo(const char* name, const char* description, const char* type,
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
167 const char* default_string, bool mandatory, bool option,
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
168 int position) {
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
169 this->_name = name;
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
170 this->_description = description;
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
171 this->_type = type;
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
172 this->_default_string = default_string;
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
173 this->_option = option;
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
174 this->_mandatory = mandatory;
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
175 this->_option = option;
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
176 this->_position = position;
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
177 }
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
178 const char* name() const { return _name; }
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
179 const char* description() const { return _description; }
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
180 const char* type() const { return _type; }
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
181 const char* default_string() const { return _default_string; }
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
182 bool is_mandatory() const { return _mandatory; }
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
183 bool is_option() const { return _option; }
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
184 int position() const { return _position; }
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
185 };
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
186
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
187 // The DCmdParser class can be used to create an argument parser for a
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
188 // diagnostic command. It is not mandatory to use it to parse arguments.
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
189 class DCmdParser {
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
190 private:
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
191 GenDCmdArgument* _options;
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
192 GenDCmdArgument* _arguments_list;
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
193 char _delim;
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
194 public:
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
195 DCmdParser() {
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
196 _options = NULL;
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
197 _arguments_list = NULL;
4932
f1cb6f9cfe21 7145243: Need additional specializations for argument parsing framework
fparain
parents: 4851
diff changeset
198 _delim = ' ';
4133
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
199 }
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
200 void add_dcmd_option(GenDCmdArgument* arg);
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
201 void add_dcmd_argument(GenDCmdArgument* arg);
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
202 GenDCmdArgument* lookup_dcmd_option(const char* name, size_t len);
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
203 GenDCmdArgument* arguments_list() { return _arguments_list; };
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
204 void check(TRAPS);
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
205 void parse(CmdLine* line, char delim, TRAPS);
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
206 void print_help(outputStream* out, const char* cmd_name);
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
207 void reset(TRAPS);
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
208 void cleanup();
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
209 int num_arguments();
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
210 GrowableArray<const char*>* argument_name_array();
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
211 GrowableArray<DCmdArgumentInfo*>* argument_info_array();
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
212 };
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
213
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
214 // The DCmd class is the parent class of all diagnostic commands
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
215 // Diagnostic command instances should not be instantiated directly but
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
216 // created using the associated factory. The factory can be retrieved with
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
217 // the DCmdFactory::getFactory() method.
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
218 // A diagnostic command instance can either be allocated in the resource Area
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
219 // or in the C-heap. Allocation in the resource area is recommended when the
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
220 // current thread is the only one which will access the diagnostic command
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
221 // instance. Allocation in the C-heap is required when the diagnostic command
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
222 // is accessed by several threads (for instance to perform asynchronous
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
223 // execution).
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
224 // To ensure a proper cleanup, it's highly recommended to use a DCmdMark for
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
225 // each diagnostic command instance. In case of a C-heap allocated diagnostic
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
226 // command instance, the DCmdMark must be created in the context of the last
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
227 // thread that will access the instance.
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
228 class DCmd : public ResourceObj {
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
229 protected:
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
230 outputStream* _output;
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
231 bool _is_heap_allocated;
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
232 public:
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
233 DCmd(outputStream* output, bool heap_allocated) {
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
234 _output = output;
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
235 _is_heap_allocated = heap_allocated;
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
236 }
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
237
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
238 static const char* name() { return "No Name";}
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
239 static const char* description() { return "No Help";}
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
240 static const char* disabled_message() { return "Diagnostic command currently disabled"; }
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
241 static const char* impact() { return "Low: No impact"; }
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
242 static int num_arguments() { return 0; }
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
243 outputStream* output() { return _output; }
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
244 bool is_heap_allocated() { return _is_heap_allocated; }
4773
4f25538b54c9 7120511: Add diagnostic commands
fparain
parents: 4133
diff changeset
245 virtual void print_help(const char* name) {
4f25538b54c9 7120511: Add diagnostic commands
fparain
parents: 4133
diff changeset
246 output()->print_cr("Syntax: %s", name);
4f25538b54c9 7120511: Add diagnostic commands
fparain
parents: 4133
diff changeset
247 }
4f25538b54c9 7120511: Add diagnostic commands
fparain
parents: 4133
diff changeset
248 virtual void parse(CmdLine* line, char delim, TRAPS) {
4f25538b54c9 7120511: Add diagnostic commands
fparain
parents: 4133
diff changeset
249 DCmdArgIter iter(line->args_addr(), line->args_len(), delim);
4f25538b54c9 7120511: Add diagnostic commands
fparain
parents: 4133
diff changeset
250 bool has_arg = iter.next(CHECK);
4f25538b54c9 7120511: Add diagnostic commands
fparain
parents: 4133
diff changeset
251 if (has_arg) {
4f25538b54c9 7120511: Add diagnostic commands
fparain
parents: 4133
diff changeset
252 THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(),
4f25538b54c9 7120511: Add diagnostic commands
fparain
parents: 4133
diff changeset
253 "Unknown argument in diagnostic command");
4f25538b54c9 7120511: Add diagnostic commands
fparain
parents: 4133
diff changeset
254 }
4f25538b54c9 7120511: Add diagnostic commands
fparain
parents: 4133
diff changeset
255 }
4133
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
256 virtual void execute(TRAPS) { }
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
257 virtual void reset(TRAPS) { }
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
258 virtual void cleanup() { }
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
259
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
260 // support for the JMX interface
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
261 virtual GrowableArray<const char*>* argument_name_array() {
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
262 GrowableArray<const char*>* array = new GrowableArray<const char*>(0);
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
263 return array;
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
264 }
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
265 virtual GrowableArray<DCmdArgumentInfo*>* argument_info_array() {
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
266 GrowableArray<DCmdArgumentInfo*>* array = new GrowableArray<DCmdArgumentInfo*>(0);
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
267 return array;
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
268 }
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
269
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
270 // main method to invoke the framework
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
271 static void parse_and_execute(outputStream* out, const char* cmdline,
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
272 char delim, TRAPS);
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
273 };
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
274
4773
4f25538b54c9 7120511: Add diagnostic commands
fparain
parents: 4133
diff changeset
275 class DCmdWithParser : public DCmd {
4f25538b54c9 7120511: Add diagnostic commands
fparain
parents: 4133
diff changeset
276 protected:
4f25538b54c9 7120511: Add diagnostic commands
fparain
parents: 4133
diff changeset
277 DCmdParser _dcmdparser;
4f25538b54c9 7120511: Add diagnostic commands
fparain
parents: 4133
diff changeset
278 public:
4f25538b54c9 7120511: Add diagnostic commands
fparain
parents: 4133
diff changeset
279 DCmdWithParser (outputStream *output, bool heap=false) : DCmd(output, heap) { }
4f25538b54c9 7120511: Add diagnostic commands
fparain
parents: 4133
diff changeset
280 static const char* name() { return "No Name";}
4f25538b54c9 7120511: Add diagnostic commands
fparain
parents: 4133
diff changeset
281 static const char* description() { return "No Help";}
4f25538b54c9 7120511: Add diagnostic commands
fparain
parents: 4133
diff changeset
282 static const char* disabled_message() { return "Diagnostic command currently disabled"; }
4f25538b54c9 7120511: Add diagnostic commands
fparain
parents: 4133
diff changeset
283 static const char* impact() { return "Low: No impact"; }
4f25538b54c9 7120511: Add diagnostic commands
fparain
parents: 4133
diff changeset
284 static int num_arguments() { return 0; }
4f25538b54c9 7120511: Add diagnostic commands
fparain
parents: 4133
diff changeset
285 virtual void parse(CmdLine *line, char delim, TRAPS);
4f25538b54c9 7120511: Add diagnostic commands
fparain
parents: 4133
diff changeset
286 virtual void execute(TRAPS) { }
4f25538b54c9 7120511: Add diagnostic commands
fparain
parents: 4133
diff changeset
287 virtual void reset(TRAPS);
4f25538b54c9 7120511: Add diagnostic commands
fparain
parents: 4133
diff changeset
288 virtual void cleanup();
4f25538b54c9 7120511: Add diagnostic commands
fparain
parents: 4133
diff changeset
289 virtual void print_help(const char* name);
4f25538b54c9 7120511: Add diagnostic commands
fparain
parents: 4133
diff changeset
290 virtual GrowableArray<const char*>* argument_name_array();
4f25538b54c9 7120511: Add diagnostic commands
fparain
parents: 4133
diff changeset
291 virtual GrowableArray<DCmdArgumentInfo*>* argument_info_array();
4f25538b54c9 7120511: Add diagnostic commands
fparain
parents: 4133
diff changeset
292 };
4f25538b54c9 7120511: Add diagnostic commands
fparain
parents: 4133
diff changeset
293
4133
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
294 class DCmdMark : public StackObj {
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
295 DCmd* _ref;
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
296 public:
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
297 DCmdMark(DCmd* cmd) { _ref = cmd; }
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
298 ~DCmdMark() {
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
299 if (_ref != NULL) {
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
300 _ref->cleanup();
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
301 if (_ref->is_heap_allocated()) {
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
302 delete _ref;
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
303 }
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
304 }
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
305 }
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
306 };
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
307
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
308 // Diagnostic commands are not directly instantiated but created with a factory.
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
309 // Each diagnostic command class has its own factory. The DCmdFactory class also
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
310 // manages the status of the diagnostic command (hidden, enabled). A DCmdFactory
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
311 // has to be registered to make the diagnostic command available (see
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
312 // management.cpp)
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
313 class DCmdFactory: public CHeapObj {
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
314 private:
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
315 static Mutex* _dcmdFactory_lock;
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
316 // Pointer to the next factory in the singly-linked list of registered
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
317 // diagnostic commands
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
318 DCmdFactory* _next;
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
319 // When disabled, a diagnostic command cannot be executed. Any attempt to
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
320 // execute it will result in the printing of the disabled message without
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
321 // instantiating the command.
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
322 bool _enabled;
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
323 // When hidden, a diagnostic command doesn't appear in the list of commands
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
324 // provided by the 'help' command.
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
325 bool _hidden;
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
326 int _num_arguments;
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
327 static DCmdFactory* _DCmdFactoryList;
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
328 public:
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
329 DCmdFactory(int num_arguments, bool enabled, bool hidden) {
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
330 _next = NULL;
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
331 _enabled = enabled;
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
332 _hidden = hidden;
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
333 _num_arguments = num_arguments;
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
334 }
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
335 bool is_enabled() const { return _enabled; }
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
336 void set_enabled(bool b) { _enabled = b; }
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
337 bool is_hidden() const { return _hidden; }
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
338 void set_hidden(bool b) { _hidden = b; }
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
339 int num_arguments() { return _num_arguments; }
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
340 DCmdFactory* next() { return _next; }
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
341 virtual DCmd* create_Cheap_instance(outputStream* output) = 0;
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
342 virtual DCmd* create_resource_instance(outputStream* output) = 0;
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
343 virtual const char* name() const = 0;
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
344 virtual const char* description() const = 0;
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
345 virtual const char* impact() const = 0;
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
346 virtual const char* disabled_message() const = 0;
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
347 // Register a DCmdFactory to make a diagnostic command available.
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
348 // Once registered, a diagnostic command must not be unregistered.
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
349 // To prevent a diagnostic command from being executed, just set the
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
350 // enabled flag to false.
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
351 static int register_DCmdFactory(DCmdFactory* factory);
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
352 static DCmdFactory* factory(const char* cmd, size_t len);
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
353 // Returns a C-heap allocated diagnostic command for the given command line
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
354 static DCmd* create_global_DCmd(CmdLine &line, outputStream* out, TRAPS);
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
355 // Returns a resourceArea allocated diagnostic command for the given command line
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
356 static DCmd* create_local_DCmd(CmdLine &line, outputStream* out, TRAPS);
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
357 static GrowableArray<const char*>* DCmd_list();
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
358 static GrowableArray<DCmdInfo*>* DCmdInfo_list();
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
359
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
360 friend class HelpDCmd;
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
361 };
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
362
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
363 // Template to easily create DCmdFactory instances. See management.cpp
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
364 // where this template is used to create and register factories.
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
365 template <class DCmdClass> class DCmdFactoryImpl : public DCmdFactory {
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
366 public:
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
367 DCmdFactoryImpl(bool enabled, bool hidden) :
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
368 DCmdFactory(DCmdClass::num_arguments(), enabled, hidden) { }
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
369 // Returns a C-heap allocated instance
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
370 virtual DCmd* create_Cheap_instance(outputStream* output) {
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
371 return new (ResourceObj::C_HEAP) DCmdClass(output, true);
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
372 }
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
373 // Returns a resourceArea allocated instance
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
374 virtual DCmd* create_resource_instance(outputStream* output) {
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
375 return new DCmdClass(output, false);
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
376 }
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
377 virtual const char* name() const {
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
378 return DCmdClass::name();
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
379 }
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
380 virtual const char* description() const {
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
381 return DCmdClass::description();
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
382 }
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
383 virtual const char* impact() const {
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
384 return DCmdClass::impact();
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
385 }
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
386 virtual const char* disabled_message() const {
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
387 return DCmdClass::disabled_message();
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
388 }
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
389 };
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
390
4851
a42c07c38c47 7132515: Add dcmd to manage UnlockingCommercialFeature flag
dsamersoff
parents: 4773
diff changeset
391 // This class provides a convenient way to register Dcmds, without a need to change
a42c07c38c47 7132515: Add dcmd to manage UnlockingCommercialFeature flag
dsamersoff
parents: 4773
diff changeset
392 // management.cpp every time. Body of these two methods resides in
a42c07c38c47 7132515: Add dcmd to manage UnlockingCommercialFeature flag
dsamersoff
parents: 4773
diff changeset
393 // diagnosticCommand.cpp
a42c07c38c47 7132515: Add dcmd to manage UnlockingCommercialFeature flag
dsamersoff
parents: 4773
diff changeset
394
a42c07c38c47 7132515: Add dcmd to manage UnlockingCommercialFeature flag
dsamersoff
parents: 4773
diff changeset
395 class DCmdRegistrant : public AllStatic {
a42c07c38c47 7132515: Add dcmd to manage UnlockingCommercialFeature flag
dsamersoff
parents: 4773
diff changeset
396
a42c07c38c47 7132515: Add dcmd to manage UnlockingCommercialFeature flag
dsamersoff
parents: 4773
diff changeset
397 private:
a42c07c38c47 7132515: Add dcmd to manage UnlockingCommercialFeature flag
dsamersoff
parents: 4773
diff changeset
398 static void register_dcmds();
a42c07c38c47 7132515: Add dcmd to manage UnlockingCommercialFeature flag
dsamersoff
parents: 4773
diff changeset
399 static void register_dcmds_ext();
a42c07c38c47 7132515: Add dcmd to manage UnlockingCommercialFeature flag
dsamersoff
parents: 4773
diff changeset
400
a42c07c38c47 7132515: Add dcmd to manage UnlockingCommercialFeature flag
dsamersoff
parents: 4773
diff changeset
401 friend class Management;
a42c07c38c47 7132515: Add dcmd to manage UnlockingCommercialFeature flag
dsamersoff
parents: 4773
diff changeset
402 };
a42c07c38c47 7132515: Add dcmd to manage UnlockingCommercialFeature flag
dsamersoff
parents: 4773
diff changeset
403
4133
3b688d6ff3d0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
404 #endif // SHARE_VM_SERVICES_DIAGNOSTICFRAMEWORK_HPP