Mercurial > hg > truffle
comparison src/share/vm/utilities/decoder.hpp @ 4917:db006a85bf91
7141259: Native stack is missing in hs_err
Summary: Code cleanup and creating a private decoder for error handler, since it can be triggered from in signal handler, where no lock can be taken
Reviewed-by: dholmes, kamg, acorn, coleenp
author | zgu |
---|---|
date | Thu, 09 Feb 2012 10:16:26 -0500 |
parents | d7e3846464d0 |
children | d2a62e0f25eb |
comparison
equal
deleted
inserted
replaced
4864:b2cd0ee8f778 | 4917:db006a85bf91 |
---|---|
1 /* | 1 /* |
2 * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved. | 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. | 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
4 * | 4 * |
5 * This code is free software; you can redistribute it and/or modify it | 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 | 6 * under the terms of the GNU General Public License version 2 only, as |
7 * published by the Free Software Foundation. | 7 * published by the Free Software Foundation. |
27 #define SHARE_VM_UTILITIES_DECODER_HPP | 27 #define SHARE_VM_UTILITIES_DECODER_HPP |
28 | 28 |
29 #include "memory/allocation.hpp" | 29 #include "memory/allocation.hpp" |
30 #include "runtime/mutex.hpp" | 30 #include "runtime/mutex.hpp" |
31 | 31 |
32 class NullDecoder: public CHeapObj { | 32 class AbstractDecoder : public CHeapObj { |
33 public: | 33 public: |
34 // status code for decoding native C frame | 34 // status code for decoding native C frame |
35 enum decoder_status { | 35 enum decoder_status { |
36 not_available = -10, // real decoder is not available | 36 not_available = -10, // real decoder is not available |
37 no_error = 0, // successfully decoded frames | 37 no_error = 0, // successfully decoded frames |
41 helper_not_found, // could not load dbghelp.dll (Windows only) | 41 helper_not_found, // could not load dbghelp.dll (Windows only) |
42 helper_func_error, // decoding functions not found (Windows only) | 42 helper_func_error, // decoding functions not found (Windows only) |
43 helper_init_error // SymInitialize failed (Windows only) | 43 helper_init_error // SymInitialize failed (Windows only) |
44 }; | 44 }; |
45 | 45 |
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; | |
54 | |
55 virtual decoder_status status() const { | |
56 return _decoder_status; | |
57 } | |
58 | |
59 virtual bool has_error() const { | |
60 return is_error(_decoder_status); | |
61 } | |
62 | |
63 static bool is_error(decoder_status status) { | |
64 return (status > 0); | |
65 } | |
66 | |
67 protected: | |
68 decoder_status _decoder_status; | |
69 }; | |
70 | |
71 // Do nothing decoder | |
72 class NullDecoder : public AbstractDecoder { | |
73 public: | |
46 NullDecoder() { | 74 NullDecoder() { |
47 _decoder_status = not_available; | 75 _decoder_status = not_available; |
48 } | 76 } |
49 | 77 |
50 ~NullDecoder() {}; | 78 ~NullDecoder() {}; |
59 } | 87 } |
60 | 88 |
61 virtual bool can_decode_C_frame_in_vm() const { | 89 virtual bool can_decode_C_frame_in_vm() const { |
62 return false; | 90 return false; |
63 } | 91 } |
64 | |
65 virtual decoder_status status() const { | |
66 return _decoder_status; | |
67 } | |
68 | |
69 virtual bool has_error() const { | |
70 return is_error(_decoder_status); | |
71 } | |
72 | |
73 static bool is_error(decoder_status status) { | |
74 return (status > 0); | |
75 } | |
76 | |
77 protected: | |
78 decoder_status _decoder_status; | |
79 }; | 92 }; |
80 | 93 |
81 | 94 |
82 class Decoder: AllStatic { | 95 class Decoder : AllStatic { |
83 public: | 96 public: |
84 static bool decode(address pc, char* buf, int buflen, int* offset, const char* modulepath = NULL); | 97 static bool decode(address pc, char* buf, int buflen, int* offset, const char* modulepath = NULL); |
85 static bool demangle(const char* symbol, char* buf, int buflen); | 98 static bool demangle(const char* symbol, char* buf, int buflen); |
86 static bool can_decode_C_frame_in_vm(); | 99 static bool can_decode_C_frame_in_vm(); |
87 | 100 |
101 // shutdown shared instance | |
88 static void shutdown(); | 102 static void shutdown(); |
89 protected: | 103 protected: |
90 static NullDecoder* get_decoder(); | 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(); | |
91 | 111 |
112 static AbstractDecoder* create_decoder(); | |
92 private: | 113 private: |
93 static NullDecoder* _decoder; | 114 static AbstractDecoder* _shared_decoder; |
94 static NullDecoder _do_nothing_decoder; | 115 static AbstractDecoder* _error_handler_decoder; |
116 static NullDecoder _do_nothing_decoder; | |
95 | 117 |
96 protected: | 118 protected: |
97 static Mutex* _decoder_lock; | 119 static Mutex* _shared_decoder_lock; |
98 }; | 120 }; |
99 | 121 |
100 #endif // SHARE_VM_UTILITIES_DECODER_HPP | 122 #endif // SHARE_VM_UTILITIES_DECODER_HPP |