src/share/vm/utilities/debug.hpp

Wed, 19 Jan 2011 19:30:42 -0500

author
tonyp
date
Wed, 19 Jan 2011 19:30:42 -0500
changeset 2472
0fa27f37d4d4
parent 2314
f95d63e2154a
child 2497
3582bf76420e
permissions
-rw-r--r--

6977804: G1: remove the zero-filling thread
Summary: This changeset removes the zero-filling thread from G1 and collapses the two free region lists we had before (the "free" and "unclean" lists) into one. The new free list uses the new heap region sets / lists abstractions that we'll ultimately use it to keep track of all regions in the heap. A heap region set was also introduced for the humongous regions. Finally, this change increases the concurrency between the thread that completes freeing regions (after a cleanup pause) and the rest of the system (before we'd have to wait for said thread to complete before allocating a new region). The changest also includes a lot of refactoring and code simplification.
Reviewed-by: jcoomes, johnc

duke@435 1 /*
stefank@2314 2 * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
duke@435 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
duke@435 4 *
duke@435 5 * This code is free software; you can redistribute it and/or modify it
duke@435 6 * under the terms of the GNU General Public License version 2 only, as
duke@435 7 * published by the Free Software Foundation.
duke@435 8 *
duke@435 9 * This code is distributed in the hope that it will be useful, but WITHOUT
duke@435 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
duke@435 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
duke@435 12 * version 2 for more details (a copy is included in the LICENSE file that
duke@435 13 * accompanied this code).
duke@435 14 *
duke@435 15 * You should have received a copy of the GNU General Public License version
duke@435 16 * 2 along with this work; if not, write to the Free Software Foundation,
duke@435 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
duke@435 18 *
trims@1907 19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
trims@1907 20 * or visit www.oracle.com if you need additional information or have any
trims@1907 21 * questions.
duke@435 22 *
duke@435 23 */
duke@435 24
stefank@2314 25 #ifndef SHARE_VM_UTILITIES_DEBUG_HPP
stefank@2314 26 #define SHARE_VM_UTILITIES_DEBUG_HPP
stefank@2314 27
stefank@2314 28 #include "utilities/globalDefinitions.hpp"
stefank@2314 29
jcoomes@1845 30 #include <stdarg.h>
jcoomes@1845 31
jcoomes@1845 32 // Simple class to format the ctor arguments into a fixed-sized buffer.
jcoomes@1845 33 template <size_t bufsz = 256>
jcoomes@1845 34 class FormatBuffer {
jcoomes@1845 35 public:
jcoomes@1845 36 inline FormatBuffer(const char * format, ...);
tonyp@2472 37 inline void append(const char* format, ...);
jcoomes@1845 38 operator const char *() const { return _buf; }
jcoomes@1845 39
jcoomes@1845 40 private:
jcoomes@1845 41 FormatBuffer(const FormatBuffer &); // prevent copies
jcoomes@1845 42
jcoomes@1845 43 private:
jcoomes@1845 44 char _buf[bufsz];
jcoomes@1845 45 };
jcoomes@1845 46
jcoomes@1845 47 template <size_t bufsz>
jcoomes@1845 48 FormatBuffer<bufsz>::FormatBuffer(const char * format, ...) {
jcoomes@1845 49 va_list argp;
jcoomes@1845 50 va_start(argp, format);
jcoomes@1845 51 vsnprintf(_buf, bufsz, format, argp);
jcoomes@1845 52 va_end(argp);
jcoomes@1845 53 }
jcoomes@1845 54
tonyp@2472 55 template <size_t bufsz>
tonyp@2472 56 void FormatBuffer<bufsz>::append(const char* format, ...) {
tonyp@2472 57 // Given that the constructor does a vsnprintf we can assume that
tonyp@2472 58 // _buf is already initialized.
tonyp@2472 59 size_t len = strlen(_buf);
tonyp@2472 60 char* buf_end = _buf + len;
tonyp@2472 61
tonyp@2472 62 va_list argp;
tonyp@2472 63 va_start(argp, format);
tonyp@2472 64 vsnprintf(buf_end, bufsz - len, format, argp);
tonyp@2472 65 va_end(argp);
tonyp@2472 66 }
tonyp@2472 67
jcoomes@1845 68 // Used to format messages for assert(), guarantee(), fatal(), etc.
jcoomes@1845 69 typedef FormatBuffer<> err_msg;
jcoomes@1845 70
duke@435 71 // assertions
duke@435 72 #ifdef ASSERT
jcoomes@1845 73 #ifndef USE_REPEATED_ASSERTS
jcoomes@1845 74 #define assert(p, msg) \
jcoomes@1845 75 do { \
jcoomes@1845 76 if (!(p)) { \
jcoomes@1845 77 report_vm_error(__FILE__, __LINE__, "assert(" #p ") failed", msg); \
jcoomes@1845 78 BREAKPOINT; \
jcoomes@1845 79 } \
jcoomes@1845 80 } while (0)
jcoomes@1845 81 #else // #ifndef USE_REPEATED_ASSERTS
jcoomes@1845 82 #define assert(p, msg)
jcoomes@1845 83 do { \
jcoomes@1845 84 for (int __i = 0; __i < AssertRepeat; __i++) { \
jcoomes@1845 85 if (!(p)) { \
jcoomes@1845 86 report_vm_error(__FILE__, __LINE__, "assert(" #p ") failed", msg); \
jcoomes@1845 87 BREAKPOINT; \
jcoomes@1845 88 } \
jcoomes@1845 89 } \
jcoomes@1845 90 } while (0)
jcoomes@1845 91 #endif // #ifndef USE_REPEATED_ASSERTS
duke@435 92
duke@435 93 // This version of assert is for use with checking return status from
duke@435 94 // library calls that return actual error values eg. EINVAL,
duke@435 95 // ENOMEM etc, rather than returning -1 and setting errno.
duke@435 96 // When the status is not what is expected it is very useful to know
duke@435 97 // what status was actually returned, so we pass the status variable as
duke@435 98 // an extra arg and use strerror to convert it to a meaningful string
duke@435 99 // like "Invalid argument", "out of memory" etc
jcoomes@1845 100 #define assert_status(p, status, msg) \
jcoomes@1845 101 do { \
jcoomes@1845 102 if (!(p)) { \
jcoomes@1845 103 report_vm_error(__FILE__, __LINE__, "assert(" #p ") failed", \
jcoomes@1845 104 err_msg("error %s(%d) %s", strerror(status), \
jcoomes@1845 105 status, msg)); \
jcoomes@1845 106 BREAKPOINT; \
jcoomes@1845 107 } \
jcoomes@1845 108 } while (0)
duke@435 109
duke@435 110 // Do not assert this condition if there's already another error reported.
duke@435 111 #define assert_if_no_error(cond,msg) assert((cond) || is_error_reported(), msg)
jcoomes@1845 112 #else // #ifdef ASSERT
duke@435 113 #define assert(p,msg)
duke@435 114 #define assert_status(p,status,msg)
duke@435 115 #define assert_if_no_error(cond,msg)
jcoomes@1845 116 #endif // #ifdef ASSERT
duke@435 117
jcoomes@1845 118 // guarantee is like assert except it's always executed -- use it for
jcoomes@1845 119 // cheap tests that catch errors that would otherwise be hard to find.
jcoomes@1845 120 // guarantee is also used for Verify options.
jcoomes@1845 121 #define guarantee(p, msg) \
jcoomes@1845 122 do { \
jcoomes@1845 123 if (!(p)) { \
jcoomes@1845 124 report_vm_error(__FILE__, __LINE__, "guarantee(" #p ") failed", msg); \
jcoomes@1845 125 BREAKPOINT; \
jcoomes@1845 126 } \
jcoomes@1845 127 } while (0)
duke@435 128
jcoomes@1845 129 #define fatal(msg) \
jcoomes@1845 130 do { \
jcoomes@1845 131 report_fatal(__FILE__, __LINE__, msg); \
jcoomes@1845 132 BREAKPOINT; \
jcoomes@1845 133 } while (0)
duke@435 134
duke@435 135 // out of memory
jcoomes@1845 136 #define vm_exit_out_of_memory(size, msg) \
jcoomes@1845 137 do { \
jcoomes@1845 138 report_vm_out_of_memory(__FILE__, __LINE__, size, msg); \
jcoomes@1845 139 BREAKPOINT; \
jcoomes@1845 140 } while (0)
duke@435 141
jcoomes@1845 142 #define ShouldNotCallThis() \
jcoomes@1845 143 do { \
jcoomes@1845 144 report_should_not_call(__FILE__, __LINE__); \
jcoomes@1845 145 BREAKPOINT; \
jcoomes@1845 146 } while (0)
duke@435 147
jcoomes@1845 148 #define ShouldNotReachHere() \
jcoomes@1845 149 do { \
jcoomes@1845 150 report_should_not_reach_here(__FILE__, __LINE__); \
jcoomes@1845 151 BREAKPOINT; \
jcoomes@1845 152 } while (0)
jcoomes@1845 153
jcoomes@1845 154 #define Unimplemented() \
jcoomes@1845 155 do { \
jcoomes@1845 156 report_unimplemented(__FILE__, __LINE__); \
jcoomes@1845 157 BREAKPOINT; \
jcoomes@1845 158 } while (0)
jcoomes@1845 159
jcoomes@1845 160 #define Untested(msg) \
jcoomes@1845 161 do { \
jcoomes@1845 162 report_untested(__FILE__, __LINE__, msg); \
jcoomes@1845 163 BREAKPOINT; \
jcoomes@1845 164 } while (0);
duke@435 165
duke@435 166 // error reporting helper functions
jcoomes@1845 167 void report_vm_error(const char* file, int line, const char* error_msg,
jcoomes@1845 168 const char* detail_msg = NULL);
jcoomes@1845 169 void report_fatal(const char* file, int line, const char* message);
jcoomes@1845 170 void report_vm_out_of_memory(const char* file, int line, size_t size,
jcoomes@1845 171 const char* message);
jcoomes@1845 172 void report_should_not_call(const char* file, int line);
jcoomes@1845 173 void report_should_not_reach_here(const char* file, int line);
jcoomes@1845 174 void report_unimplemented(const char* file, int line);
jcoomes@1845 175 void report_untested(const char* file, int line, const char* message);
jcoomes@1845 176
duke@435 177 void warning(const char* format, ...);
duke@435 178
duke@435 179 // out of memory reporting
duke@435 180 void report_java_out_of_memory(const char* message);
duke@435 181
duke@435 182 // Support for self-destruct
duke@435 183 bool is_error_reported();
duke@435 184 void set_error_reported();
duke@435 185
jcoomes@1845 186 /* Test assert(), fatal(), guarantee(), etc. */
jcoomes@1845 187 NOT_PRODUCT(void test_error_handler(size_t test_num);)
jcoomes@1845 188
duke@435 189 void pd_ps(frame f);
duke@435 190 void pd_obfuscate_location(char *buf, size_t buflen);
stefank@2314 191
stefank@2314 192 #endif // SHARE_VM_UTILITIES_DEBUG_HPP

mercurial