hotspot/src/share/vm/services/diagnosticCommand.cpp
author fparain
Wed, 14 Dec 2011 04:30:57 -0800
changeset 11209 110525ac80b0
child 11441 a89f443814cd
permissions -rw-r--r--
7104647: Adding a diagnostic command framework Reviewed-by: phh, dcubed
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
11209
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
     1
/*
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
     2
 * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
     4
 *
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
     7
 * published by the Free Software Foundation.
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
     8
 *
110525ac80b0 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
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
110525ac80b0 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
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
    13
 * accompanied this code).
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
    14
 *
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
    18
 *
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
    20
 * or visit www.oracle.com if you need additional information or have any
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
    21
 * questions.
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
    22
 *
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
    23
 */
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
    24
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
    25
#include "precompiled.hpp"
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
    26
#include "services/diagnosticArgument.hpp"
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
    27
#include "services/diagnosticCommand.hpp"
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
    28
#include "services/diagnosticFramework.hpp"
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
    29
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
    30
HelpDCmd::HelpDCmd(outputStream* output, bool heap) : DCmd(output, heap),
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
    31
  _all("-all", "Show help for all commands", "BOOLEAN", false, "false"),
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
    32
  _cmd("command name", "The name of the command for which we want help",
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
    33
        "STRING", false) {
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
    34
  _dcmdparser.add_dcmd_option(&_all);
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
    35
  _dcmdparser.add_dcmd_argument(&_cmd);
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
    36
};
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
    37
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
    38
void HelpDCmd::parse(CmdLine* line, char delim, TRAPS) {
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
    39
  _dcmdparser.parse(line, delim, CHECK);
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
    40
}
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
    41
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
    42
void HelpDCmd::print_help(outputStream* out) {
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
    43
  _dcmdparser.print_help(out, name());
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
    44
}
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
    45
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
    46
void HelpDCmd::execute(TRAPS) {
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
    47
  if (_all.value()) {
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
    48
    GrowableArray<const char*>* cmd_list = DCmdFactory::DCmd_list();
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
    49
    for (int i = 0; i < cmd_list->length(); i++) {
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
    50
      DCmdFactory* factory = DCmdFactory::factory(cmd_list->at(i),
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
    51
                                                  strlen(cmd_list->at(i)));
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
    52
      if (!factory->is_hidden()) {
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
    53
        output()->print_cr("%s%s", factory->name(),
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
    54
                           factory->is_enabled() ? "" : " [disabled]");
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
    55
        output()->print_cr("\t%s", factory->description());
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
    56
        output()->cr();
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
    57
      }
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
    58
      factory = factory->next();
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
    59
    }
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
    60
  } else if (_cmd.has_value()) {
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
    61
    DCmd* cmd = NULL;
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
    62
    DCmdFactory* factory = DCmdFactory::factory(_cmd.value(),
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
    63
                                                strlen(_cmd.value()));
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
    64
    if (factory != NULL) {
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
    65
      output()->print_cr("%s%s", factory->name(),
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
    66
                         factory->is_enabled() ? "" : " [disabled]");
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
    67
      output()->print_cr(factory->description());
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
    68
      output()->print_cr("\nImpact: %s", factory->impact());
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
    69
      cmd = factory->create_resource_instance(output());
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
    70
      if (cmd != NULL) {
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
    71
        DCmdMark mark(cmd);
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
    72
        cmd->print_help(output());
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
    73
      }
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
    74
    } else {
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
    75
      output()->print_cr("Help unavailable : '%s' : No such command", _cmd.value());
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
    76
    }
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
    77
  } else {
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
    78
    output()->print_cr("The following commands are available:");
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
    79
    GrowableArray<const char *>* cmd_list = DCmdFactory::DCmd_list();
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
    80
    for (int i = 0; i < cmd_list->length(); i++) {
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
    81
      DCmdFactory* factory = DCmdFactory::factory(cmd_list->at(i),
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
    82
                                                  strlen(cmd_list->at(i)));
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
    83
      if (!factory->is_hidden()) {
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
    84
        output()->print_cr("%s%s", factory->name(),
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
    85
                           factory->is_enabled() ? "" : " [disabled]");
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
    86
      }
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
    87
      factory = factory->_next;
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
    88
    }
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
    89
    output()->print_cr("\nFor more information about a specific command use 'help <command>'.");
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
    90
  }
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
    91
}
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
    92
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
    93
void HelpDCmd::reset(TRAPS) {
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
    94
  _dcmdparser.reset(CHECK);
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
    95
}
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
    96
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
    97
void HelpDCmd::cleanup() {
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
    98
  _dcmdparser.cleanup();
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
    99
}
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
   100
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
   101
int HelpDCmd::num_arguments() {
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
   102
  ResourceMark rm;
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
   103
  HelpDCmd* dcmd = new HelpDCmd(NULL, false);
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
   104
  if (dcmd != NULL) {
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
   105
    DCmdMark mark(dcmd);
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
   106
    return dcmd->_dcmdparser.num_arguments();
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
   107
  } else {
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
   108
    return 0;
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
   109
  }
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
   110
}
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
   111
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
   112
GrowableArray<const char*>* HelpDCmd::argument_name_array() {
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
   113
  return _dcmdparser.argument_name_array();
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
   114
}
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
   115
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
   116
GrowableArray<DCmdArgumentInfo*>* HelpDCmd::argument_info_array() {
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
   117
  return _dcmdparser.argument_info_array();
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
   118
}
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
   119
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
   120
void VersionDCmd::execute(TRAPS) {
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
   121
  output()->print_cr("%s version %s", Abstract_VM_Version::vm_name(),
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
   122
          Abstract_VM_Version::vm_release());
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
   123
  JDK_Version jdk_version = JDK_Version::current();
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
   124
  if (jdk_version.update_version() > 0) {
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
   125
    output()->print_cr("JDK %d.%d_%02d", jdk_version.major_version(),
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
   126
            jdk_version.minor_version(), jdk_version.update_version());
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
   127
  } else {
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
   128
    output()->print_cr("JDK %d.%d", jdk_version.major_version(),
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
   129
            jdk_version.minor_version());
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
   130
  }
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
   131
}