src/share/vm/utilities/decoder.hpp

Thu, 28 Jun 2012 17:03:16 -0400

author
zgu
date
Thu, 28 Jun 2012 17:03:16 -0400
changeset 3900
d2a62e0f25eb
parent 3544
db006a85bf91
child 3961
3b01d0321dfa
permissions
-rw-r--r--

6995781: Native Memory Tracking (Phase 1)
7151532: DCmd for hotspot native memory tracking
Summary: Implementation of native memory tracking phase 1, which tracks VM native memory usage, and related DCmd
Reviewed-by: acorn, coleenp, fparain

     1 /*
     2  * Copyright (c) 1997, 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  */
    26 #ifndef SHARE_VM_UTILITIES_DECODER_HPP
    27 #define SHARE_VM_UTILITIES_DECODER_HPP
    29 #include "memory/allocation.hpp"
    30 #include "runtime/mutex.hpp"
    32 class AbstractDecoder : public CHeapObj<mtInternal> {
    33 public:
    34   // status code for decoding native C frame
    35   enum decoder_status {
    36          not_available = -10,  // real decoder is not available
    37          no_error = 0,         // successfully decoded frames
    38          out_of_memory,        // out of memory
    39          file_invalid,         // invalid elf file
    40          file_not_found,       // could not found symbol file (on windows), such as jvm.pdb or jvm.map
    41          helper_not_found,     // could not load dbghelp.dll (Windows only)
    42          helper_func_error,    // decoding functions not found (Windows only)
    43          helper_init_error     // SymInitialize failed (Windows only)
    44   };
    46   // decode an pc address to corresponding function name and an offset from the beginning of
    47   // the function
    48   virtual bool decode(address pc, char* buf, int buflen, int* offset,
    49     const char* modulepath = NULL) = 0;
    50   // demangle a C++ symbol
    51   virtual bool demangle(const char* symbol, char* buf, int buflen) = 0;
    52   // if the decoder can decode symbols in vm
    53   virtual bool can_decode_C_frame_in_vm() const = 0;
    55   virtual decoder_status status() const {
    56     return _decoder_status;
    57   }
    59   virtual bool has_error() const {
    60     return is_error(_decoder_status);
    61   }
    63   static bool is_error(decoder_status status) {
    64     return (status > 0);
    65   }
    67 protected:
    68   decoder_status  _decoder_status;
    69 };
    71 // Do nothing decoder
    72 class NullDecoder : public AbstractDecoder {
    73 public:
    74   NullDecoder() {
    75     _decoder_status = not_available;
    76   }
    78   ~NullDecoder() {};
    80   virtual bool decode(address pc, char* buf, int buflen, int* offset,
    81     const char* modulepath = NULL) {
    82     return false;
    83   }
    85   virtual bool demangle(const char* symbol, char* buf, int buflen) {
    86     return false;
    87   }
    89   virtual bool can_decode_C_frame_in_vm() const {
    90     return false;
    91   }
    92 };
    95 class Decoder : AllStatic {
    96 public:
    97   static bool decode(address pc, char* buf, int buflen, int* offset, const char* modulepath = NULL);
    98   static bool demangle(const char* symbol, char* buf, int buflen);
    99   static bool can_decode_C_frame_in_vm();
   101   // shutdown shared instance
   102   static void shutdown();
   103 protected:
   104   // shared decoder instance, _shared_instance_lock is needed
   105   static AbstractDecoder* get_shared_instance();
   106   // a private instance for error handler. Error handler can be
   107   // triggered almost everywhere, including signal handler, where
   108   // no lock can be taken. So the shared decoder can not be used
   109   // in this scenario.
   110   static AbstractDecoder* get_error_handler_instance();
   112   static AbstractDecoder* create_decoder();
   113 private:
   114   static AbstractDecoder*     _shared_decoder;
   115   static AbstractDecoder*     _error_handler_decoder;
   116   static NullDecoder          _do_nothing_decoder;
   118 protected:
   119   static Mutex*               _shared_decoder_lock;
   120 };
   122 #endif // SHARE_VM_UTILITIES_DECODER_HPP

mercurial