src/share/vm/gc_implementation/g1/g1ErgoVerbose.hpp

Sat, 06 Oct 2012 01:17:44 -0700

author
johnc
date
Sat, 06 Oct 2012 01:17:44 -0700
changeset 4173
8a5ea0a9ccc4
parent 3998
7383557659bd
child 6876
710a3c8b516e
child 9327
f96fcd9e1e1b
permissions
-rw-r--r--

7127708: G1: change task num types from int to uint in concurrent mark
Summary: Change the type of various task num fields, parameters etc to unsigned and rename them to be more consistent with the other collectors. Code changes were also reviewed by Vitaly Davidovich.
Reviewed-by: johnc
Contributed-by: Kaushik Srenevasan <kaushik@twitter.com>

     1 /*
     2  * Copyright (c) 2011, 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  */
    25 #ifndef SHARE_VM_GC_IMPLEMENTATION_G1_G1ERGOVERBOSE_HPP
    26 #define SHARE_VM_GC_IMPLEMENTATION_G1_G1ERGOVERBOSE_HPP
    28 #include "memory/allocation.hpp"
    29 #include "utilities/debug.hpp"
    31 // The log of G1's heuristic decisions comprises of a series of
    32 // records which have a similar format in order to maintain
    33 // consistency across records and ultimately easier parsing of the
    34 // output, if we ever choose to do that. Each record consists of:
    35 // * A time stamp to be able to easily correlate each record with
    36 // other events.
    37 // * A unique string to allow us to easily identify such records.
    38 // * The name of the heuristic the record corresponds to.
    39 // * An action string which describes the action that G1 did or is
    40 // about to do.
    41 // * An optional reason string which describes the reason for the
    42 // action.
    43 // * An optional number of name/value pairs which contributed to the
    44 // decision to take the action described in the record.
    45 //
    46 // Each record is associated with a "tag" which is the combination of
    47 // the heuristic the record corresponds to, as well as the min level
    48 // of verboseness at which the record should be printed. The tag is
    49 // checked against the current settings to determine whether the record
    50 // should be printed or not.
    52 // The available verboseness levels.
    53 typedef enum {
    54   // Determine which part of the tag is occupied by the level.
    55   ErgoLevelShift = 8,
    56   ErgoLevelMask = ~((1 << ErgoLevelShift) - 1),
    58   // ErgoLow is 0 so that we don't have to explicitly or a heuristic
    59   // id with ErgoLow to keep its use simpler.
    60   ErgoLow = 0,
    61   ErgoHigh = 1 << ErgoLevelShift
    62 } ErgoLevel;
    64 // The available heuristics.
    65 typedef enum {
    66   // Determines which part of the tag is occupied by the heuristic id.
    67   ErgoHeuristicMask = ~ErgoLevelMask,
    69   ErgoHeapSizing = 0,
    70   ErgoCSetConstruction,
    71   ErgoConcCycles,
    72   ErgoMixedGCs,
    74   ErgoHeuristicNum
    75 } ErgoHeuristic;
    77 class G1ErgoVerbose : AllStatic {
    78 private:
    79   // Determines the minimum verboseness level at which records will be
    80   // printed.
    81   static ErgoLevel _level;
    82   // Determines which heuristics are currently enabled.
    83   static bool _enabled[ErgoHeuristicNum];
    85   static ErgoLevel extract_level(int tag) {
    86     return (ErgoLevel) (tag & ErgoLevelMask);
    87   }
    89   static ErgoHeuristic extract_heuristic(int tag) {
    90     return (ErgoHeuristic) (tag & ErgoHeuristicMask);
    91   }
    93 public:
    94   // Needs to be explicitly called at GC initialization.
    95   static void initialize();
    97   static void set_level(ErgoLevel level);
    98   static void set_enabled(ErgoHeuristic h, bool enabled);
    99   // It is applied to all heuristics.
   100   static void set_enabled(bool enabled);
   102   static bool enabled(int tag) {
   103     ErgoLevel level = extract_level(tag);
   104     ErgoHeuristic n = extract_heuristic(tag);
   105     return level <= _level && _enabled[n];
   106   }
   108   // Extract the heuristic id from the tag and return a string with
   109   // its name.
   110   static const char* to_string(int tag);
   111 };
   113 // The macros below generate the format string for values of different
   114 // types and/or metrics.
   116 // The reason for the action is optional and is handled specially: the
   117 // reason string is concatenated here so it's not necessary to pass it
   118 // as a parameter.
   119 #define ergo_format_reason(_reason_) ", reason: " _reason_
   121 // Single parameter format strings
   122 #define ergo_format_str(_name_)      ", " _name_ ": %s"
   123 #define ergo_format_region(_name_)   ", " _name_ ": %u regions"
   124 #define ergo_format_byte(_name_)     ", " _name_ ": "SIZE_FORMAT" bytes"
   125 #define ergo_format_double(_name_)   ", " _name_ ": %1.2f"
   126 #define ergo_format_perc(_name_)     ", " _name_ ": %1.2f %%"
   127 #define ergo_format_ms(_name_)       ", " _name_ ": %1.2f ms"
   128 #define ergo_format_size(_name_)     ", " _name_ ": "SIZE_FORMAT
   130 // Double parameter format strings
   131 #define ergo_format_byte_perc(_name_)                                   \
   132                              ", " _name_ ": "SIZE_FORMAT" bytes (%1.2f %%)"
   134 // Generates the format string
   135 #define ergo_format(_extra_format_)                           \
   136   " %1.3f: [G1Ergonomics (%s) %s" _extra_format_ "]"
   138 // Conditionally, prints an ergonomic decision record. _extra_format_
   139 // is the format string for the optional items we'd like to print
   140 // (i.e., the decision's reason and any associated values). This
   141 // string should be built up using the ergo_*_format macros (see
   142 // above) to ensure consistency.
   143 //
   144 // Since we cannot rely on the compiler supporting variable argument
   145 // macros, this macro accepts a fixed number of arguments and passes
   146 // them to the print method. For convenience, we have wrapper macros
   147 // below which take a specific number of arguments and set the rest to
   148 // a default value.
   149 #define ergo_verbose_common(_tag_, _action_, _extra_format_,                \
   150                             _arg0_, _arg1_, _arg2_, _arg3_, _arg4_, _arg5_) \
   151   do {                                                                      \
   152     if (G1ErgoVerbose::enabled((_tag_))) {                                  \
   153       gclog_or_tty->print_cr(ergo_format(_extra_format_),                   \
   154                              os::elapsedTime(),                             \
   155                              G1ErgoVerbose::to_string((_tag_)),             \
   156                              (_action_),                                    \
   157                              (_arg0_), (_arg1_), (_arg2_),                  \
   158                              (_arg3_), (_arg4_), (_arg5_));                 \
   159     }                                                                       \
   160   } while (0)
   163 #define ergo_verbose(_tag_, _action_)                                   \
   164   ergo_verbose_common(_tag_, _action_, "", 0, 0, 0, 0, 0, 0)
   166 #define ergo_verbose0(_tag_, _action_, _extra_format_)                  \
   167   ergo_verbose_common(_tag_, _action_, _extra_format_, 0, 0, 0, 0, 0, 0)
   169 #define ergo_verbose1(_tag_, _action_, _extra_format_,                  \
   170                       _arg0_)                                           \
   171   ergo_verbose_common(_tag_, _action_, _extra_format_,                  \
   172                       _arg0_, 0, 0, 0, 0, 0)
   174 #define ergo_verbose2(_tag_, _action_, _extra_format_,                  \
   175                       _arg0_, _arg1_)                                   \
   176   ergo_verbose_common(_tag_, _action_, _extra_format_,                  \
   177                       _arg0_, _arg1_, 0, 0, 0, 0)
   179 #define ergo_verbose3(_tag_, _action_, _extra_format_,                  \
   180                       _arg0_, _arg1_, _arg2_)                           \
   181   ergo_verbose_common(_tag_, _action_, _extra_format_,                  \
   182                       _arg0_, _arg1_, _arg2_, 0, 0, 0)
   184 #define ergo_verbose4(_tag_, _action_, _extra_format_,                  \
   185                       _arg0_, _arg1_, _arg2_, _arg3_)                   \
   186   ergo_verbose_common(_tag_, _action_, _extra_format_,                  \
   187                       _arg0_, _arg1_, _arg2_, _arg3_, 0, 0)
   189 #define ergo_verbose5(_tag_, _action_, _extra_format_,                  \
   190                       _arg0_, _arg1_, _arg2_, _arg3_, _arg4_)           \
   191   ergo_verbose_common(_tag_, _action_, _extra_format_,                  \
   192                       _arg0_, _arg1_, _arg2_, _arg3_, _arg4_, 0)
   194 #define ergo_verbose6(_tag_, _action_, _extra_format_,                  \
   195                       _arg0_, _arg1_, _arg2_, _arg3_, _arg4_, _arg5_)   \
   196   ergo_verbose_common(_tag_, _action_, _extra_format_,                  \
   197                       _arg0_, _arg1_, _arg2_, _arg3_, _arg4_, _arg5_)
   199 #endif // SHARE_VM_GC_IMPLEMENTATION_G1_G1ERGOVERBOSE_HPP

mercurial