annotate src/share/vm/utilities/ostream.cpp @ 1721:413ad0331a0c

6977924: Changes for 6975078 produce build error with certain gcc versions Summary: The changes introduced for 6975078 assign badHeapOopVal to the _allocation field in the ResourceObj class. In 32 bit linux builds with certain versions of gcc this assignment will be flagged as an error while compiling allocation.cpp. In 32 bit builds the constant value badHeapOopVal (which is cast to an intptr_t) is negative. The _allocation field is typed as an unsigned intptr_t and gcc catches this as an error. Reviewed-by: jcoomes, ysr, phh
author johnc
date Wed, 18 Aug 2010 10:59:06 -0700
parents c18cbe5936b8
children f95d63e2154a
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
1552
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1353
diff changeset
2 * Copyright (c) 1997, 2009, Oracle and/or its affiliates. All rights reserved.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
a61af66fc99e Initial load
duke
parents:
diff changeset
4 *
a61af66fc99e Initial load
duke
parents:
diff changeset
5 * This code is free software; you can redistribute it and/or modify it
a61af66fc99e Initial load
duke
parents:
diff changeset
6 * under the terms of the GNU General Public License version 2 only, as
a61af66fc99e Initial load
duke
parents:
diff changeset
7 * published by the Free Software Foundation.
a61af66fc99e Initial load
duke
parents:
diff changeset
8 *
a61af66fc99e Initial load
duke
parents:
diff changeset
9 * This code is distributed in the hope that it will be useful, but WITHOUT
a61af66fc99e Initial load
duke
parents:
diff changeset
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
a61af66fc99e Initial load
duke
parents:
diff changeset
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
a61af66fc99e Initial load
duke
parents:
diff changeset
12 * version 2 for more details (a copy is included in the LICENSE file that
a61af66fc99e Initial load
duke
parents:
diff changeset
13 * accompanied this code).
a61af66fc99e Initial load
duke
parents:
diff changeset
14 *
a61af66fc99e Initial load
duke
parents:
diff changeset
15 * You should have received a copy of the GNU General Public License version
a61af66fc99e Initial load
duke
parents:
diff changeset
16 * 2 along with this work; if not, write to the Free Software Foundation,
a61af66fc99e Initial load
duke
parents:
diff changeset
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
a61af66fc99e Initial load
duke
parents:
diff changeset
18 *
1552
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1353
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1353
diff changeset
20 * or visit www.oracle.com if you need additional information or have any
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1353
diff changeset
21 * questions.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
22 *
a61af66fc99e Initial load
duke
parents:
diff changeset
23 */
a61af66fc99e Initial load
duke
parents:
diff changeset
24
a61af66fc99e Initial load
duke
parents:
diff changeset
25 # include "incls/_precompiled.incl"
a61af66fc99e Initial load
duke
parents:
diff changeset
26 # include "incls/_ostream.cpp.incl"
a61af66fc99e Initial load
duke
parents:
diff changeset
27
a61af66fc99e Initial load
duke
parents:
diff changeset
28 extern "C" void jio_print(const char* s); // Declarationtion of jvm method
a61af66fc99e Initial load
duke
parents:
diff changeset
29
a61af66fc99e Initial load
duke
parents:
diff changeset
30 outputStream::outputStream(int width) {
a61af66fc99e Initial load
duke
parents:
diff changeset
31 _width = width;
a61af66fc99e Initial load
duke
parents:
diff changeset
32 _position = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
33 _newlines = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
34 _precount = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
35 _indentation = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
36 }
a61af66fc99e Initial load
duke
parents:
diff changeset
37
a61af66fc99e Initial load
duke
parents:
diff changeset
38 outputStream::outputStream(int width, bool has_time_stamps) {
a61af66fc99e Initial load
duke
parents:
diff changeset
39 _width = width;
a61af66fc99e Initial load
duke
parents:
diff changeset
40 _position = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
41 _newlines = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
42 _precount = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
43 _indentation = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
44 if (has_time_stamps) _stamp.update();
a61af66fc99e Initial load
duke
parents:
diff changeset
45 }
a61af66fc99e Initial load
duke
parents:
diff changeset
46
a61af66fc99e Initial load
duke
parents:
diff changeset
47 void outputStream::update_position(const char* s, size_t len) {
a61af66fc99e Initial load
duke
parents:
diff changeset
48 for (size_t i = 0; i < len; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
49 char ch = s[i];
a61af66fc99e Initial load
duke
parents:
diff changeset
50 if (ch == '\n') {
a61af66fc99e Initial load
duke
parents:
diff changeset
51 _newlines += 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
52 _precount += _position + 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
53 _position = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
54 } else if (ch == '\t') {
100
c7c777385a15 6667042: PrintAssembly option does not work without special plugin
jrose
parents: 0
diff changeset
55 int tw = 8 - (_position & 7);
c7c777385a15 6667042: PrintAssembly option does not work without special plugin
jrose
parents: 0
diff changeset
56 _position += tw;
c7c777385a15 6667042: PrintAssembly option does not work without special plugin
jrose
parents: 0
diff changeset
57 _precount -= tw-1; // invariant: _precount + _position == total count
0
a61af66fc99e Initial load
duke
parents:
diff changeset
58 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
59 _position += 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
60 }
a61af66fc99e Initial load
duke
parents:
diff changeset
61 }
a61af66fc99e Initial load
duke
parents:
diff changeset
62 }
a61af66fc99e Initial load
duke
parents:
diff changeset
63
a61af66fc99e Initial load
duke
parents:
diff changeset
64 // Execute a vsprintf, using the given buffer if necessary.
a61af66fc99e Initial load
duke
parents:
diff changeset
65 // Return a pointer to the formatted string.
a61af66fc99e Initial load
duke
parents:
diff changeset
66 const char* outputStream::do_vsnprintf(char* buffer, size_t buflen,
a61af66fc99e Initial load
duke
parents:
diff changeset
67 const char* format, va_list ap,
a61af66fc99e Initial load
duke
parents:
diff changeset
68 bool add_cr,
a61af66fc99e Initial load
duke
parents:
diff changeset
69 size_t& result_len) {
a61af66fc99e Initial load
duke
parents:
diff changeset
70 const char* result;
a61af66fc99e Initial load
duke
parents:
diff changeset
71 if (add_cr) buflen--;
a61af66fc99e Initial load
duke
parents:
diff changeset
72 if (!strchr(format, '%')) {
a61af66fc99e Initial load
duke
parents:
diff changeset
73 // constant format string
a61af66fc99e Initial load
duke
parents:
diff changeset
74 result = format;
a61af66fc99e Initial load
duke
parents:
diff changeset
75 result_len = strlen(result);
a61af66fc99e Initial load
duke
parents:
diff changeset
76 if (add_cr && result_len >= buflen) result_len = buflen-1; // truncate
a61af66fc99e Initial load
duke
parents:
diff changeset
77 } else if (format[0] == '%' && format[1] == 's' && format[2] == '\0') {
a61af66fc99e Initial load
duke
parents:
diff changeset
78 // trivial copy-through format string
a61af66fc99e Initial load
duke
parents:
diff changeset
79 result = va_arg(ap, const char*);
a61af66fc99e Initial load
duke
parents:
diff changeset
80 result_len = strlen(result);
a61af66fc99e Initial load
duke
parents:
diff changeset
81 if (add_cr && result_len >= buflen) result_len = buflen-1; // truncate
a61af66fc99e Initial load
duke
parents:
diff changeset
82 } else if (vsnprintf(buffer, buflen, format, ap) >= 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
83 result = buffer;
a61af66fc99e Initial load
duke
parents:
diff changeset
84 result_len = strlen(result);
a61af66fc99e Initial load
duke
parents:
diff changeset
85 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
86 DEBUG_ONLY(warning("increase O_BUFLEN in ostream.hpp -- output truncated");)
a61af66fc99e Initial load
duke
parents:
diff changeset
87 result = buffer;
a61af66fc99e Initial load
duke
parents:
diff changeset
88 result_len = buflen - 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
89 buffer[result_len] = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
90 }
a61af66fc99e Initial load
duke
parents:
diff changeset
91 if (add_cr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
92 if (result != buffer) {
a61af66fc99e Initial load
duke
parents:
diff changeset
93 strncpy(buffer, result, buflen);
a61af66fc99e Initial load
duke
parents:
diff changeset
94 result = buffer;
a61af66fc99e Initial load
duke
parents:
diff changeset
95 }
a61af66fc99e Initial load
duke
parents:
diff changeset
96 buffer[result_len++] = '\n';
a61af66fc99e Initial load
duke
parents:
diff changeset
97 buffer[result_len] = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
98 }
a61af66fc99e Initial load
duke
parents:
diff changeset
99 return result;
a61af66fc99e Initial load
duke
parents:
diff changeset
100 }
a61af66fc99e Initial load
duke
parents:
diff changeset
101
a61af66fc99e Initial load
duke
parents:
diff changeset
102 void outputStream::print(const char* format, ...) {
a61af66fc99e Initial load
duke
parents:
diff changeset
103 char buffer[O_BUFLEN];
a61af66fc99e Initial load
duke
parents:
diff changeset
104 va_list ap;
a61af66fc99e Initial load
duke
parents:
diff changeset
105 va_start(ap, format);
a61af66fc99e Initial load
duke
parents:
diff changeset
106 size_t len;
a61af66fc99e Initial load
duke
parents:
diff changeset
107 const char* str = do_vsnprintf(buffer, O_BUFLEN, format, ap, false, len);
a61af66fc99e Initial load
duke
parents:
diff changeset
108 write(str, len);
a61af66fc99e Initial load
duke
parents:
diff changeset
109 va_end(ap);
a61af66fc99e Initial load
duke
parents:
diff changeset
110 }
a61af66fc99e Initial load
duke
parents:
diff changeset
111
a61af66fc99e Initial load
duke
parents:
diff changeset
112 void outputStream::print_cr(const char* format, ...) {
a61af66fc99e Initial load
duke
parents:
diff changeset
113 char buffer[O_BUFLEN];
a61af66fc99e Initial load
duke
parents:
diff changeset
114 va_list ap;
a61af66fc99e Initial load
duke
parents:
diff changeset
115 va_start(ap, format);
a61af66fc99e Initial load
duke
parents:
diff changeset
116 size_t len;
a61af66fc99e Initial load
duke
parents:
diff changeset
117 const char* str = do_vsnprintf(buffer, O_BUFLEN, format, ap, true, len);
a61af66fc99e Initial load
duke
parents:
diff changeset
118 write(str, len);
a61af66fc99e Initial load
duke
parents:
diff changeset
119 va_end(ap);
a61af66fc99e Initial load
duke
parents:
diff changeset
120 }
a61af66fc99e Initial load
duke
parents:
diff changeset
121
a61af66fc99e Initial load
duke
parents:
diff changeset
122 void outputStream::vprint(const char *format, va_list argptr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
123 char buffer[O_BUFLEN];
a61af66fc99e Initial load
duke
parents:
diff changeset
124 size_t len;
a61af66fc99e Initial load
duke
parents:
diff changeset
125 const char* str = do_vsnprintf(buffer, O_BUFLEN, format, argptr, false, len);
a61af66fc99e Initial load
duke
parents:
diff changeset
126 write(str, len);
a61af66fc99e Initial load
duke
parents:
diff changeset
127 }
a61af66fc99e Initial load
duke
parents:
diff changeset
128
a61af66fc99e Initial load
duke
parents:
diff changeset
129 void outputStream::vprint_cr(const char* format, va_list argptr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
130 char buffer[O_BUFLEN];
a61af66fc99e Initial load
duke
parents:
diff changeset
131 size_t len;
a61af66fc99e Initial load
duke
parents:
diff changeset
132 const char* str = do_vsnprintf(buffer, O_BUFLEN, format, argptr, true, len);
a61af66fc99e Initial load
duke
parents:
diff changeset
133 write(str, len);
a61af66fc99e Initial load
duke
parents:
diff changeset
134 }
a61af66fc99e Initial load
duke
parents:
diff changeset
135
a61af66fc99e Initial load
duke
parents:
diff changeset
136 void outputStream::fill_to(int col) {
100
c7c777385a15 6667042: PrintAssembly option does not work without special plugin
jrose
parents: 0
diff changeset
137 int need_fill = col - position();
c7c777385a15 6667042: PrintAssembly option does not work without special plugin
jrose
parents: 0
diff changeset
138 sp(need_fill);
c7c777385a15 6667042: PrintAssembly option does not work without special plugin
jrose
parents: 0
diff changeset
139 }
c7c777385a15 6667042: PrintAssembly option does not work without special plugin
jrose
parents: 0
diff changeset
140
c7c777385a15 6667042: PrintAssembly option does not work without special plugin
jrose
parents: 0
diff changeset
141 void outputStream::move_to(int col, int slop, int min_space) {
c7c777385a15 6667042: PrintAssembly option does not work without special plugin
jrose
parents: 0
diff changeset
142 if (position() >= col + slop)
c7c777385a15 6667042: PrintAssembly option does not work without special plugin
jrose
parents: 0
diff changeset
143 cr();
c7c777385a15 6667042: PrintAssembly option does not work without special plugin
jrose
parents: 0
diff changeset
144 int need_fill = col - position();
c7c777385a15 6667042: PrintAssembly option does not work without special plugin
jrose
parents: 0
diff changeset
145 if (need_fill < min_space)
c7c777385a15 6667042: PrintAssembly option does not work without special plugin
jrose
parents: 0
diff changeset
146 need_fill = min_space;
c7c777385a15 6667042: PrintAssembly option does not work without special plugin
jrose
parents: 0
diff changeset
147 sp(need_fill);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
148 }
a61af66fc99e Initial load
duke
parents:
diff changeset
149
a61af66fc99e Initial load
duke
parents:
diff changeset
150 void outputStream::put(char ch) {
a61af66fc99e Initial load
duke
parents:
diff changeset
151 assert(ch != 0, "please fix call site");
a61af66fc99e Initial load
duke
parents:
diff changeset
152 char buf[] = { ch, '\0' };
a61af66fc99e Initial load
duke
parents:
diff changeset
153 write(buf, 1);
a61af66fc99e Initial load
duke
parents:
diff changeset
154 }
a61af66fc99e Initial load
duke
parents:
diff changeset
155
100
c7c777385a15 6667042: PrintAssembly option does not work without special plugin
jrose
parents: 0
diff changeset
156 #define SP_USE_TABS false
c7c777385a15 6667042: PrintAssembly option does not work without special plugin
jrose
parents: 0
diff changeset
157
c7c777385a15 6667042: PrintAssembly option does not work without special plugin
jrose
parents: 0
diff changeset
158 void outputStream::sp(int count) {
c7c777385a15 6667042: PrintAssembly option does not work without special plugin
jrose
parents: 0
diff changeset
159 if (count < 0) return;
c7c777385a15 6667042: PrintAssembly option does not work without special plugin
jrose
parents: 0
diff changeset
160 if (SP_USE_TABS && count >= 8) {
c7c777385a15 6667042: PrintAssembly option does not work without special plugin
jrose
parents: 0
diff changeset
161 int target = position() + count;
c7c777385a15 6667042: PrintAssembly option does not work without special plugin
jrose
parents: 0
diff changeset
162 while (count >= 8) {
c7c777385a15 6667042: PrintAssembly option does not work without special plugin
jrose
parents: 0
diff changeset
163 this->write("\t", 1);
c7c777385a15 6667042: PrintAssembly option does not work without special plugin
jrose
parents: 0
diff changeset
164 count -= 8;
c7c777385a15 6667042: PrintAssembly option does not work without special plugin
jrose
parents: 0
diff changeset
165 }
c7c777385a15 6667042: PrintAssembly option does not work without special plugin
jrose
parents: 0
diff changeset
166 count = target - position();
c7c777385a15 6667042: PrintAssembly option does not work without special plugin
jrose
parents: 0
diff changeset
167 }
c7c777385a15 6667042: PrintAssembly option does not work without special plugin
jrose
parents: 0
diff changeset
168 while (count > 0) {
c7c777385a15 6667042: PrintAssembly option does not work without special plugin
jrose
parents: 0
diff changeset
169 int nw = (count > 8) ? 8 : count;
c7c777385a15 6667042: PrintAssembly option does not work without special plugin
jrose
parents: 0
diff changeset
170 this->write(" ", nw);
c7c777385a15 6667042: PrintAssembly option does not work without special plugin
jrose
parents: 0
diff changeset
171 count -= nw;
c7c777385a15 6667042: PrintAssembly option does not work without special plugin
jrose
parents: 0
diff changeset
172 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
173 }
a61af66fc99e Initial load
duke
parents:
diff changeset
174
a61af66fc99e Initial load
duke
parents:
diff changeset
175 void outputStream::cr() {
a61af66fc99e Initial load
duke
parents:
diff changeset
176 this->write("\n", 1);
a61af66fc99e Initial load
duke
parents:
diff changeset
177 }
a61af66fc99e Initial load
duke
parents:
diff changeset
178
a61af66fc99e Initial load
duke
parents:
diff changeset
179 void outputStream::stamp() {
a61af66fc99e Initial load
duke
parents:
diff changeset
180 if (! _stamp.is_updated()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
181 _stamp.update(); // start at 0 on first call to stamp()
a61af66fc99e Initial load
duke
parents:
diff changeset
182 }
a61af66fc99e Initial load
duke
parents:
diff changeset
183
a61af66fc99e Initial load
duke
parents:
diff changeset
184 // outputStream::stamp() may get called by ostream_abort(), use snprintf
a61af66fc99e Initial load
duke
parents:
diff changeset
185 // to avoid allocating large stack buffer in print().
a61af66fc99e Initial load
duke
parents:
diff changeset
186 char buf[40];
a61af66fc99e Initial load
duke
parents:
diff changeset
187 jio_snprintf(buf, sizeof(buf), "%.3f", _stamp.seconds());
a61af66fc99e Initial load
duke
parents:
diff changeset
188 print_raw(buf);
a61af66fc99e Initial load
duke
parents:
diff changeset
189 }
a61af66fc99e Initial load
duke
parents:
diff changeset
190
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 102
diff changeset
191 void outputStream::stamp(bool guard,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 102
diff changeset
192 const char* prefix,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 102
diff changeset
193 const char* suffix) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 102
diff changeset
194 if (!guard) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 102
diff changeset
195 return;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 102
diff changeset
196 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 102
diff changeset
197 print_raw(prefix);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 102
diff changeset
198 stamp();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 102
diff changeset
199 print_raw(suffix);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 102
diff changeset
200 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 102
diff changeset
201
0
a61af66fc99e Initial load
duke
parents:
diff changeset
202 void outputStream::date_stamp(bool guard,
a61af66fc99e Initial load
duke
parents:
diff changeset
203 const char* prefix,
a61af66fc99e Initial load
duke
parents:
diff changeset
204 const char* suffix) {
a61af66fc99e Initial load
duke
parents:
diff changeset
205 if (!guard) {
a61af66fc99e Initial load
duke
parents:
diff changeset
206 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
207 }
a61af66fc99e Initial load
duke
parents:
diff changeset
208 print_raw(prefix);
a61af66fc99e Initial load
duke
parents:
diff changeset
209 static const char error_time[] = "yyyy-mm-ddThh:mm:ss.mmm+zzzz";
a61af66fc99e Initial load
duke
parents:
diff changeset
210 static const int buffer_length = 32;
a61af66fc99e Initial load
duke
parents:
diff changeset
211 char buffer[buffer_length];
a61af66fc99e Initial load
duke
parents:
diff changeset
212 const char* iso8601_result = os::iso8601_time(buffer, buffer_length);
a61af66fc99e Initial load
duke
parents:
diff changeset
213 if (iso8601_result != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
214 print_raw(buffer);
a61af66fc99e Initial load
duke
parents:
diff changeset
215 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
216 print_raw(error_time);
a61af66fc99e Initial load
duke
parents:
diff changeset
217 }
a61af66fc99e Initial load
duke
parents:
diff changeset
218 print_raw(suffix);
a61af66fc99e Initial load
duke
parents:
diff changeset
219 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
220 }
a61af66fc99e Initial load
duke
parents:
diff changeset
221
a61af66fc99e Initial load
duke
parents:
diff changeset
222 void outputStream::indent() {
a61af66fc99e Initial load
duke
parents:
diff changeset
223 while (_position < _indentation) sp();
a61af66fc99e Initial load
duke
parents:
diff changeset
224 }
a61af66fc99e Initial load
duke
parents:
diff changeset
225
a61af66fc99e Initial load
duke
parents:
diff changeset
226 void outputStream::print_jlong(jlong value) {
a61af66fc99e Initial load
duke
parents:
diff changeset
227 // N.B. Same as INT64_FORMAT
a61af66fc99e Initial load
duke
parents:
diff changeset
228 print(os::jlong_format_specifier(), value);
a61af66fc99e Initial load
duke
parents:
diff changeset
229 }
a61af66fc99e Initial load
duke
parents:
diff changeset
230
a61af66fc99e Initial load
duke
parents:
diff changeset
231 void outputStream::print_julong(julong value) {
a61af66fc99e Initial load
duke
parents:
diff changeset
232 // N.B. Same as UINT64_FORMAT
a61af66fc99e Initial load
duke
parents:
diff changeset
233 print(os::julong_format_specifier(), value);
a61af66fc99e Initial load
duke
parents:
diff changeset
234 }
a61af66fc99e Initial load
duke
parents:
diff changeset
235
a61af66fc99e Initial load
duke
parents:
diff changeset
236 stringStream::stringStream(size_t initial_size) : outputStream() {
a61af66fc99e Initial load
duke
parents:
diff changeset
237 buffer_length = initial_size;
a61af66fc99e Initial load
duke
parents:
diff changeset
238 buffer = NEW_RESOURCE_ARRAY(char, buffer_length);
a61af66fc99e Initial load
duke
parents:
diff changeset
239 buffer_pos = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
240 buffer_fixed = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
241 }
a61af66fc99e Initial load
duke
parents:
diff changeset
242
a61af66fc99e Initial load
duke
parents:
diff changeset
243 // useful for output to fixed chunks of memory, such as performance counters
a61af66fc99e Initial load
duke
parents:
diff changeset
244 stringStream::stringStream(char* fixed_buffer, size_t fixed_buffer_size) : outputStream() {
a61af66fc99e Initial load
duke
parents:
diff changeset
245 buffer_length = fixed_buffer_size;
a61af66fc99e Initial load
duke
parents:
diff changeset
246 buffer = fixed_buffer;
a61af66fc99e Initial load
duke
parents:
diff changeset
247 buffer_pos = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
248 buffer_fixed = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
249 }
a61af66fc99e Initial load
duke
parents:
diff changeset
250
a61af66fc99e Initial load
duke
parents:
diff changeset
251 void stringStream::write(const char* s, size_t len) {
a61af66fc99e Initial load
duke
parents:
diff changeset
252 size_t write_len = len; // number of non-null bytes to write
a61af66fc99e Initial load
duke
parents:
diff changeset
253 size_t end = buffer_pos + len + 1; // position after write and final '\0'
a61af66fc99e Initial load
duke
parents:
diff changeset
254 if (end > buffer_length) {
a61af66fc99e Initial load
duke
parents:
diff changeset
255 if (buffer_fixed) {
a61af66fc99e Initial load
duke
parents:
diff changeset
256 // if buffer cannot resize, silently truncate
a61af66fc99e Initial load
duke
parents:
diff changeset
257 end = buffer_length;
a61af66fc99e Initial load
duke
parents:
diff changeset
258 write_len = end - buffer_pos - 1; // leave room for the final '\0'
a61af66fc99e Initial load
duke
parents:
diff changeset
259 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
260 // For small overruns, double the buffer. For larger ones,
a61af66fc99e Initial load
duke
parents:
diff changeset
261 // increase to the requested size.
a61af66fc99e Initial load
duke
parents:
diff changeset
262 if (end < buffer_length * 2) {
a61af66fc99e Initial load
duke
parents:
diff changeset
263 end = buffer_length * 2;
a61af66fc99e Initial load
duke
parents:
diff changeset
264 }
a61af66fc99e Initial load
duke
parents:
diff changeset
265 char* oldbuf = buffer;
a61af66fc99e Initial load
duke
parents:
diff changeset
266 buffer = NEW_RESOURCE_ARRAY(char, end);
a61af66fc99e Initial load
duke
parents:
diff changeset
267 strncpy(buffer, oldbuf, buffer_pos);
a61af66fc99e Initial load
duke
parents:
diff changeset
268 buffer_length = end;
a61af66fc99e Initial load
duke
parents:
diff changeset
269 }
a61af66fc99e Initial load
duke
parents:
diff changeset
270 }
a61af66fc99e Initial load
duke
parents:
diff changeset
271 // invariant: buffer is always null-terminated
a61af66fc99e Initial load
duke
parents:
diff changeset
272 guarantee(buffer_pos + write_len + 1 <= buffer_length, "stringStream oob");
a61af66fc99e Initial load
duke
parents:
diff changeset
273 buffer[buffer_pos + write_len] = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
274 strncpy(buffer + buffer_pos, s, write_len);
a61af66fc99e Initial load
duke
parents:
diff changeset
275 buffer_pos += write_len;
a61af66fc99e Initial load
duke
parents:
diff changeset
276
a61af66fc99e Initial load
duke
parents:
diff changeset
277 // Note that the following does not depend on write_len.
a61af66fc99e Initial load
duke
parents:
diff changeset
278 // This means that position and count get updated
a61af66fc99e Initial load
duke
parents:
diff changeset
279 // even when overflow occurs.
a61af66fc99e Initial load
duke
parents:
diff changeset
280 update_position(s, len);
a61af66fc99e Initial load
duke
parents:
diff changeset
281 }
a61af66fc99e Initial load
duke
parents:
diff changeset
282
a61af66fc99e Initial load
duke
parents:
diff changeset
283 char* stringStream::as_string() {
a61af66fc99e Initial load
duke
parents:
diff changeset
284 char* copy = NEW_RESOURCE_ARRAY(char, buffer_pos+1);
a61af66fc99e Initial load
duke
parents:
diff changeset
285 strncpy(copy, buffer, buffer_pos);
a61af66fc99e Initial load
duke
parents:
diff changeset
286 copy[buffer_pos] = 0; // terminating null
a61af66fc99e Initial load
duke
parents:
diff changeset
287 return copy;
a61af66fc99e Initial load
duke
parents:
diff changeset
288 }
a61af66fc99e Initial load
duke
parents:
diff changeset
289
a61af66fc99e Initial load
duke
parents:
diff changeset
290 stringStream::~stringStream() {}
a61af66fc99e Initial load
duke
parents:
diff changeset
291
a61af66fc99e Initial load
duke
parents:
diff changeset
292 xmlStream* xtty;
a61af66fc99e Initial load
duke
parents:
diff changeset
293 outputStream* tty;
a61af66fc99e Initial load
duke
parents:
diff changeset
294 outputStream* gclog_or_tty;
a61af66fc99e Initial load
duke
parents:
diff changeset
295 extern Mutex* tty_lock;
a61af66fc99e Initial load
duke
parents:
diff changeset
296
a61af66fc99e Initial load
duke
parents:
diff changeset
297 fileStream::fileStream(const char* file_name) {
a61af66fc99e Initial load
duke
parents:
diff changeset
298 _file = fopen(file_name, "w");
a61af66fc99e Initial load
duke
parents:
diff changeset
299 _need_close = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
300 }
a61af66fc99e Initial load
duke
parents:
diff changeset
301
a61af66fc99e Initial load
duke
parents:
diff changeset
302 void fileStream::write(const char* s, size_t len) {
513
2328d1d3f8cf 6781583: Hotspot build fails on linux 64 bit platform with gcc 4.3.2
xlu
parents: 356
diff changeset
303 if (_file != NULL) {
2328d1d3f8cf 6781583: Hotspot build fails on linux 64 bit platform with gcc 4.3.2
xlu
parents: 356
diff changeset
304 // Make an unused local variable to avoid warning from gcc 4.x compiler.
2328d1d3f8cf 6781583: Hotspot build fails on linux 64 bit platform with gcc 4.3.2
xlu
parents: 356
diff changeset
305 size_t count = fwrite(s, 1, len, _file);
2328d1d3f8cf 6781583: Hotspot build fails on linux 64 bit platform with gcc 4.3.2
xlu
parents: 356
diff changeset
306 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
307 update_position(s, len);
a61af66fc99e Initial load
duke
parents:
diff changeset
308 }
a61af66fc99e Initial load
duke
parents:
diff changeset
309
a61af66fc99e Initial load
duke
parents:
diff changeset
310 fileStream::~fileStream() {
a61af66fc99e Initial load
duke
parents:
diff changeset
311 if (_file != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
312 if (_need_close) fclose(_file);
a61af66fc99e Initial load
duke
parents:
diff changeset
313 _file = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
314 }
a61af66fc99e Initial load
duke
parents:
diff changeset
315 }
a61af66fc99e Initial load
duke
parents:
diff changeset
316
a61af66fc99e Initial load
duke
parents:
diff changeset
317 void fileStream::flush() {
a61af66fc99e Initial load
duke
parents:
diff changeset
318 fflush(_file);
a61af66fc99e Initial load
duke
parents:
diff changeset
319 }
a61af66fc99e Initial load
duke
parents:
diff changeset
320
a61af66fc99e Initial load
duke
parents:
diff changeset
321 fdStream::fdStream(const char* file_name) {
a61af66fc99e Initial load
duke
parents:
diff changeset
322 _fd = open(file_name, O_WRONLY | O_CREAT | O_TRUNC, 0666);
a61af66fc99e Initial load
duke
parents:
diff changeset
323 _need_close = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
324 }
a61af66fc99e Initial load
duke
parents:
diff changeset
325
a61af66fc99e Initial load
duke
parents:
diff changeset
326 fdStream::~fdStream() {
a61af66fc99e Initial load
duke
parents:
diff changeset
327 if (_fd != -1) {
a61af66fc99e Initial load
duke
parents:
diff changeset
328 if (_need_close) close(_fd);
a61af66fc99e Initial load
duke
parents:
diff changeset
329 _fd = -1;
a61af66fc99e Initial load
duke
parents:
diff changeset
330 }
a61af66fc99e Initial load
duke
parents:
diff changeset
331 }
a61af66fc99e Initial load
duke
parents:
diff changeset
332
a61af66fc99e Initial load
duke
parents:
diff changeset
333 void fdStream::write(const char* s, size_t len) {
513
2328d1d3f8cf 6781583: Hotspot build fails on linux 64 bit platform with gcc 4.3.2
xlu
parents: 356
diff changeset
334 if (_fd != -1) {
2328d1d3f8cf 6781583: Hotspot build fails on linux 64 bit platform with gcc 4.3.2
xlu
parents: 356
diff changeset
335 // Make an unused local variable to avoid warning from gcc 4.x compiler.
2328d1d3f8cf 6781583: Hotspot build fails on linux 64 bit platform with gcc 4.3.2
xlu
parents: 356
diff changeset
336 size_t count = ::write(_fd, s, (int)len);
2328d1d3f8cf 6781583: Hotspot build fails on linux 64 bit platform with gcc 4.3.2
xlu
parents: 356
diff changeset
337 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
338 update_position(s, len);
a61af66fc99e Initial load
duke
parents:
diff changeset
339 }
a61af66fc99e Initial load
duke
parents:
diff changeset
340
a61af66fc99e Initial load
duke
parents:
diff changeset
341 defaultStream* defaultStream::instance = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
342 int defaultStream::_output_fd = 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
343 int defaultStream::_error_fd = 2;
a61af66fc99e Initial load
duke
parents:
diff changeset
344 FILE* defaultStream::_output_stream = stdout;
a61af66fc99e Initial load
duke
parents:
diff changeset
345 FILE* defaultStream::_error_stream = stderr;
a61af66fc99e Initial load
duke
parents:
diff changeset
346
a61af66fc99e Initial load
duke
parents:
diff changeset
347 #define LOG_MAJOR_VERSION 160
a61af66fc99e Initial load
duke
parents:
diff changeset
348 #define LOG_MINOR_VERSION 1
a61af66fc99e Initial load
duke
parents:
diff changeset
349
a61af66fc99e Initial load
duke
parents:
diff changeset
350 void defaultStream::init() {
a61af66fc99e Initial load
duke
parents:
diff changeset
351 _inited = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
352 if (LogVMOutput || LogCompilation) {
a61af66fc99e Initial load
duke
parents:
diff changeset
353 init_log();
a61af66fc99e Initial load
duke
parents:
diff changeset
354 }
a61af66fc99e Initial load
duke
parents:
diff changeset
355 }
a61af66fc99e Initial load
duke
parents:
diff changeset
356
a61af66fc99e Initial load
duke
parents:
diff changeset
357 bool defaultStream::has_log_file() {
a61af66fc99e Initial load
duke
parents:
diff changeset
358 // lazily create log file (at startup, LogVMOutput is false even
a61af66fc99e Initial load
duke
parents:
diff changeset
359 // if +LogVMOutput is used, because the flags haven't been parsed yet)
a61af66fc99e Initial load
duke
parents:
diff changeset
360 // For safer printing during fatal error handling, do not init logfile
a61af66fc99e Initial load
duke
parents:
diff changeset
361 // if a VM error has been reported.
a61af66fc99e Initial load
duke
parents:
diff changeset
362 if (!_inited && !is_error_reported()) init();
a61af66fc99e Initial load
duke
parents:
diff changeset
363 return _log_file != NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
364 }
a61af66fc99e Initial load
duke
parents:
diff changeset
365
1353
a2ea687fdc7c 6938627: Make temporary directory use property java.io.tmpdir when specified
coleenp
parents: 579
diff changeset
366 static const char* make_log_name(const char* log_name, const char* force_directory) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
367 const char* basename = log_name;
a61af66fc99e Initial load
duke
parents:
diff changeset
368 char file_sep = os::file_separator()[0];
a61af66fc99e Initial load
duke
parents:
diff changeset
369 const char* cp;
a61af66fc99e Initial load
duke
parents:
diff changeset
370 for (cp = log_name; *cp != '\0'; cp++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
371 if (*cp == '/' || *cp == file_sep) {
a61af66fc99e Initial load
duke
parents:
diff changeset
372 basename = cp+1;
a61af66fc99e Initial load
duke
parents:
diff changeset
373 }
a61af66fc99e Initial load
duke
parents:
diff changeset
374 }
a61af66fc99e Initial load
duke
parents:
diff changeset
375 const char* nametail = log_name;
a61af66fc99e Initial load
duke
parents:
diff changeset
376
1353
a2ea687fdc7c 6938627: Make temporary directory use property java.io.tmpdir when specified
coleenp
parents: 579
diff changeset
377 // Compute buffer length
a2ea687fdc7c 6938627: Make temporary directory use property java.io.tmpdir when specified
coleenp
parents: 579
diff changeset
378 size_t buffer_length;
a2ea687fdc7c 6938627: Make temporary directory use property java.io.tmpdir when specified
coleenp
parents: 579
diff changeset
379 if (force_directory != NULL) {
a2ea687fdc7c 6938627: Make temporary directory use property java.io.tmpdir when specified
coleenp
parents: 579
diff changeset
380 buffer_length = strlen(force_directory) + strlen(os::file_separator()) +
a2ea687fdc7c 6938627: Make temporary directory use property java.io.tmpdir when specified
coleenp
parents: 579
diff changeset
381 strlen(basename) + 1;
a2ea687fdc7c 6938627: Make temporary directory use property java.io.tmpdir when specified
coleenp
parents: 579
diff changeset
382 } else {
a2ea687fdc7c 6938627: Make temporary directory use property java.io.tmpdir when specified
coleenp
parents: 579
diff changeset
383 buffer_length = strlen(log_name) + 1;
a2ea687fdc7c 6938627: Make temporary directory use property java.io.tmpdir when specified
coleenp
parents: 579
diff changeset
384 }
a2ea687fdc7c 6938627: Make temporary directory use property java.io.tmpdir when specified
coleenp
parents: 579
diff changeset
385
a2ea687fdc7c 6938627: Make temporary directory use property java.io.tmpdir when specified
coleenp
parents: 579
diff changeset
386 const char* star = strchr(basename, '*');
a2ea687fdc7c 6938627: Make temporary directory use property java.io.tmpdir when specified
coleenp
parents: 579
diff changeset
387 int star_pos = (star == NULL) ? -1 : (star - nametail);
a2ea687fdc7c 6938627: Make temporary directory use property java.io.tmpdir when specified
coleenp
parents: 579
diff changeset
388
a2ea687fdc7c 6938627: Make temporary directory use property java.io.tmpdir when specified
coleenp
parents: 579
diff changeset
389 char pid[32];
a2ea687fdc7c 6938627: Make temporary directory use property java.io.tmpdir when specified
coleenp
parents: 579
diff changeset
390 if (star_pos >= 0) {
a2ea687fdc7c 6938627: Make temporary directory use property java.io.tmpdir when specified
coleenp
parents: 579
diff changeset
391 jio_snprintf(pid, sizeof(pid), "%u", os::current_process_id());
a2ea687fdc7c 6938627: Make temporary directory use property java.io.tmpdir when specified
coleenp
parents: 579
diff changeset
392 buffer_length += strlen(pid);
a2ea687fdc7c 6938627: Make temporary directory use property java.io.tmpdir when specified
coleenp
parents: 579
diff changeset
393 }
a2ea687fdc7c 6938627: Make temporary directory use property java.io.tmpdir when specified
coleenp
parents: 579
diff changeset
394
a2ea687fdc7c 6938627: Make temporary directory use property java.io.tmpdir when specified
coleenp
parents: 579
diff changeset
395 // Create big enough buffer.
a2ea687fdc7c 6938627: Make temporary directory use property java.io.tmpdir when specified
coleenp
parents: 579
diff changeset
396 char *buf = NEW_C_HEAP_ARRAY(char, buffer_length);
a2ea687fdc7c 6938627: Make temporary directory use property java.io.tmpdir when specified
coleenp
parents: 579
diff changeset
397
0
a61af66fc99e Initial load
duke
parents:
diff changeset
398 strcpy(buf, "");
a61af66fc99e Initial load
duke
parents:
diff changeset
399 if (force_directory != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
400 strcat(buf, force_directory);
a61af66fc99e Initial load
duke
parents:
diff changeset
401 strcat(buf, os::file_separator());
a61af66fc99e Initial load
duke
parents:
diff changeset
402 nametail = basename; // completely skip directory prefix
a61af66fc99e Initial load
duke
parents:
diff changeset
403 }
a61af66fc99e Initial load
duke
parents:
diff changeset
404
a61af66fc99e Initial load
duke
parents:
diff changeset
405 if (star_pos >= 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
406 // convert foo*bar.log to foo123bar.log
a61af66fc99e Initial load
duke
parents:
diff changeset
407 int buf_pos = (int) strlen(buf);
a61af66fc99e Initial load
duke
parents:
diff changeset
408 strncpy(&buf[buf_pos], nametail, star_pos);
1353
a2ea687fdc7c 6938627: Make temporary directory use property java.io.tmpdir when specified
coleenp
parents: 579
diff changeset
409 strcpy(&buf[buf_pos + star_pos], pid);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
410 nametail += star_pos + 1; // skip prefix and star
a61af66fc99e Initial load
duke
parents:
diff changeset
411 }
a61af66fc99e Initial load
duke
parents:
diff changeset
412
a61af66fc99e Initial load
duke
parents:
diff changeset
413 strcat(buf, nametail); // append rest of name, or all of name
a61af66fc99e Initial load
duke
parents:
diff changeset
414 return buf;
a61af66fc99e Initial load
duke
parents:
diff changeset
415 }
a61af66fc99e Initial load
duke
parents:
diff changeset
416
a61af66fc99e Initial load
duke
parents:
diff changeset
417 void defaultStream::init_log() {
a61af66fc99e Initial load
duke
parents:
diff changeset
418 // %%% Need a MutexLocker?
a61af66fc99e Initial load
duke
parents:
diff changeset
419 const char* log_name = LogFile != NULL ? LogFile : "hotspot.log";
1353
a2ea687fdc7c 6938627: Make temporary directory use property java.io.tmpdir when specified
coleenp
parents: 579
diff changeset
420 const char* try_name = make_log_name(log_name, NULL);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
421 fileStream* file = new(ResourceObj::C_HEAP) fileStream(try_name);
a61af66fc99e Initial load
duke
parents:
diff changeset
422 if (!file->is_open()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
423 // Try again to open the file.
a61af66fc99e Initial load
duke
parents:
diff changeset
424 char warnbuf[O_BUFLEN*2];
1353
a2ea687fdc7c 6938627: Make temporary directory use property java.io.tmpdir when specified
coleenp
parents: 579
diff changeset
425 jio_snprintf(warnbuf, sizeof(warnbuf),
a2ea687fdc7c 6938627: Make temporary directory use property java.io.tmpdir when specified
coleenp
parents: 579
diff changeset
426 "Warning: Cannot open log file: %s\n", try_name);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
427 // Note: This feature is for maintainer use only. No need for L10N.
a61af66fc99e Initial load
duke
parents:
diff changeset
428 jio_print(warnbuf);
1353
a2ea687fdc7c 6938627: Make temporary directory use property java.io.tmpdir when specified
coleenp
parents: 579
diff changeset
429 FREE_C_HEAP_ARRAY(char, try_name);
a2ea687fdc7c 6938627: Make temporary directory use property java.io.tmpdir when specified
coleenp
parents: 579
diff changeset
430 try_name = make_log_name("hs_pid*.log", os::get_temp_directory());
a2ea687fdc7c 6938627: Make temporary directory use property java.io.tmpdir when specified
coleenp
parents: 579
diff changeset
431 jio_snprintf(warnbuf, sizeof(warnbuf),
a2ea687fdc7c 6938627: Make temporary directory use property java.io.tmpdir when specified
coleenp
parents: 579
diff changeset
432 "Warning: Forcing option -XX:LogFile=%s\n", try_name);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
433 jio_print(warnbuf);
a61af66fc99e Initial load
duke
parents:
diff changeset
434 delete file;
a61af66fc99e Initial load
duke
parents:
diff changeset
435 file = new(ResourceObj::C_HEAP) fileStream(try_name);
1353
a2ea687fdc7c 6938627: Make temporary directory use property java.io.tmpdir when specified
coleenp
parents: 579
diff changeset
436 FREE_C_HEAP_ARRAY(char, try_name);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
437 }
a61af66fc99e Initial load
duke
parents:
diff changeset
438 if (file->is_open()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
439 _log_file = file;
a61af66fc99e Initial load
duke
parents:
diff changeset
440 xmlStream* xs = new(ResourceObj::C_HEAP) xmlStream(file);
a61af66fc99e Initial load
duke
parents:
diff changeset
441 _outer_xmlStream = xs;
a61af66fc99e Initial load
duke
parents:
diff changeset
442 if (this == tty) xtty = xs;
a61af66fc99e Initial load
duke
parents:
diff changeset
443 // Write XML header.
a61af66fc99e Initial load
duke
parents:
diff changeset
444 xs->print_cr("<?xml version='1.0' encoding='UTF-8'?>");
a61af66fc99e Initial load
duke
parents:
diff changeset
445 // (For now, don't bother to issue a DTD for this private format.)
a61af66fc99e Initial load
duke
parents:
diff changeset
446 jlong time_ms = os::javaTimeMillis() - tty->time_stamp().milliseconds();
a61af66fc99e Initial load
duke
parents:
diff changeset
447 // %%% Should be: jlong time_ms = os::start_time_milliseconds(), if
a61af66fc99e Initial load
duke
parents:
diff changeset
448 // we ever get round to introduce that method on the os class
a61af66fc99e Initial load
duke
parents:
diff changeset
449 xs->head("hotspot_log version='%d %d'"
a61af66fc99e Initial load
duke
parents:
diff changeset
450 " process='%d' time_ms='"INT64_FORMAT"'",
a61af66fc99e Initial load
duke
parents:
diff changeset
451 LOG_MAJOR_VERSION, LOG_MINOR_VERSION,
a61af66fc99e Initial load
duke
parents:
diff changeset
452 os::current_process_id(), time_ms);
a61af66fc99e Initial load
duke
parents:
diff changeset
453 // Write VM version header immediately.
a61af66fc99e Initial load
duke
parents:
diff changeset
454 xs->head("vm_version");
a61af66fc99e Initial load
duke
parents:
diff changeset
455 xs->head("name"); xs->text("%s", VM_Version::vm_name()); xs->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
456 xs->tail("name");
a61af66fc99e Initial load
duke
parents:
diff changeset
457 xs->head("release"); xs->text("%s", VM_Version::vm_release()); xs->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
458 xs->tail("release");
a61af66fc99e Initial load
duke
parents:
diff changeset
459 xs->head("info"); xs->text("%s", VM_Version::internal_vm_info_string()); xs->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
460 xs->tail("info");
a61af66fc99e Initial load
duke
parents:
diff changeset
461 xs->tail("vm_version");
a61af66fc99e Initial load
duke
parents:
diff changeset
462 // Record information about the command-line invocation.
a61af66fc99e Initial load
duke
parents:
diff changeset
463 xs->head("vm_arguments"); // Cf. Arguments::print_on()
a61af66fc99e Initial load
duke
parents:
diff changeset
464 if (Arguments::num_jvm_flags() > 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
465 xs->head("flags");
a61af66fc99e Initial load
duke
parents:
diff changeset
466 Arguments::print_jvm_flags_on(xs->text());
a61af66fc99e Initial load
duke
parents:
diff changeset
467 xs->tail("flags");
a61af66fc99e Initial load
duke
parents:
diff changeset
468 }
a61af66fc99e Initial load
duke
parents:
diff changeset
469 if (Arguments::num_jvm_args() > 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
470 xs->head("args");
a61af66fc99e Initial load
duke
parents:
diff changeset
471 Arguments::print_jvm_args_on(xs->text());
a61af66fc99e Initial load
duke
parents:
diff changeset
472 xs->tail("args");
a61af66fc99e Initial load
duke
parents:
diff changeset
473 }
a61af66fc99e Initial load
duke
parents:
diff changeset
474 if (Arguments::java_command() != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
475 xs->head("command"); xs->text()->print_cr("%s", Arguments::java_command());
a61af66fc99e Initial load
duke
parents:
diff changeset
476 xs->tail("command");
a61af66fc99e Initial load
duke
parents:
diff changeset
477 }
a61af66fc99e Initial load
duke
parents:
diff changeset
478 if (Arguments::sun_java_launcher() != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
479 xs->head("launcher"); xs->text()->print_cr("%s", Arguments::sun_java_launcher());
a61af66fc99e Initial load
duke
parents:
diff changeset
480 xs->tail("launcher");
a61af66fc99e Initial load
duke
parents:
diff changeset
481 }
a61af66fc99e Initial load
duke
parents:
diff changeset
482 if (Arguments::system_properties() != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
483 xs->head("properties");
a61af66fc99e Initial load
duke
parents:
diff changeset
484 // Print it as a java-style property list.
a61af66fc99e Initial load
duke
parents:
diff changeset
485 // System properties don't generally contain newlines, so don't bother with unparsing.
a61af66fc99e Initial load
duke
parents:
diff changeset
486 for (SystemProperty* p = Arguments::system_properties(); p != NULL; p = p->next()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
487 xs->text()->print_cr("%s=%s", p->key(), p->value());
a61af66fc99e Initial load
duke
parents:
diff changeset
488 }
a61af66fc99e Initial load
duke
parents:
diff changeset
489 xs->tail("properties");
a61af66fc99e Initial load
duke
parents:
diff changeset
490 }
a61af66fc99e Initial load
duke
parents:
diff changeset
491 xs->tail("vm_arguments");
a61af66fc99e Initial load
duke
parents:
diff changeset
492 // tty output per se is grouped under the <tty>...</tty> element.
a61af66fc99e Initial load
duke
parents:
diff changeset
493 xs->head("tty");
a61af66fc99e Initial load
duke
parents:
diff changeset
494 // All further non-markup text gets copied to the tty:
a61af66fc99e Initial load
duke
parents:
diff changeset
495 xs->_text = this; // requires friend declaration!
a61af66fc99e Initial load
duke
parents:
diff changeset
496 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
497 delete(file);
a61af66fc99e Initial load
duke
parents:
diff changeset
498 // and leave xtty as NULL
a61af66fc99e Initial load
duke
parents:
diff changeset
499 LogVMOutput = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
500 DisplayVMOutput = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
501 LogCompilation = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
502 }
a61af66fc99e Initial load
duke
parents:
diff changeset
503 }
a61af66fc99e Initial load
duke
parents:
diff changeset
504
a61af66fc99e Initial load
duke
parents:
diff changeset
505 // finish_log() is called during normal VM shutdown. finish_log_on_error() is
a61af66fc99e Initial load
duke
parents:
diff changeset
506 // called by ostream_abort() after a fatal error.
a61af66fc99e Initial load
duke
parents:
diff changeset
507 //
a61af66fc99e Initial load
duke
parents:
diff changeset
508 void defaultStream::finish_log() {
a61af66fc99e Initial load
duke
parents:
diff changeset
509 xmlStream* xs = _outer_xmlStream;
a61af66fc99e Initial load
duke
parents:
diff changeset
510 xs->done("tty");
a61af66fc99e Initial load
duke
parents:
diff changeset
511
a61af66fc99e Initial load
duke
parents:
diff changeset
512 // Other log forks are appended here, at the End of Time:
a61af66fc99e Initial load
duke
parents:
diff changeset
513 CompileLog::finish_log(xs->out()); // write compile logging, if any, now
a61af66fc99e Initial load
duke
parents:
diff changeset
514
a61af66fc99e Initial load
duke
parents:
diff changeset
515 xs->done("hotspot_log");
a61af66fc99e Initial load
duke
parents:
diff changeset
516 xs->flush();
a61af66fc99e Initial load
duke
parents:
diff changeset
517
a61af66fc99e Initial load
duke
parents:
diff changeset
518 fileStream* file = _log_file;
a61af66fc99e Initial load
duke
parents:
diff changeset
519 _log_file = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
520
a61af66fc99e Initial load
duke
parents:
diff changeset
521 delete _outer_xmlStream;
a61af66fc99e Initial load
duke
parents:
diff changeset
522 _outer_xmlStream = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
523
a61af66fc99e Initial load
duke
parents:
diff changeset
524 file->flush();
a61af66fc99e Initial load
duke
parents:
diff changeset
525 delete file;
a61af66fc99e Initial load
duke
parents:
diff changeset
526 }
a61af66fc99e Initial load
duke
parents:
diff changeset
527
a61af66fc99e Initial load
duke
parents:
diff changeset
528 void defaultStream::finish_log_on_error(char *buf, int buflen) {
a61af66fc99e Initial load
duke
parents:
diff changeset
529 xmlStream* xs = _outer_xmlStream;
a61af66fc99e Initial load
duke
parents:
diff changeset
530
a61af66fc99e Initial load
duke
parents:
diff changeset
531 if (xs && xs->out()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
532
a61af66fc99e Initial load
duke
parents:
diff changeset
533 xs->done_raw("tty");
a61af66fc99e Initial load
duke
parents:
diff changeset
534
a61af66fc99e Initial load
duke
parents:
diff changeset
535 // Other log forks are appended here, at the End of Time:
a61af66fc99e Initial load
duke
parents:
diff changeset
536 CompileLog::finish_log_on_error(xs->out(), buf, buflen); // write compile logging, if any, now
a61af66fc99e Initial load
duke
parents:
diff changeset
537
a61af66fc99e Initial load
duke
parents:
diff changeset
538 xs->done_raw("hotspot_log");
a61af66fc99e Initial load
duke
parents:
diff changeset
539 xs->flush();
a61af66fc99e Initial load
duke
parents:
diff changeset
540
a61af66fc99e Initial load
duke
parents:
diff changeset
541 fileStream* file = _log_file;
a61af66fc99e Initial load
duke
parents:
diff changeset
542 _log_file = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
543 _outer_xmlStream = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
544
a61af66fc99e Initial load
duke
parents:
diff changeset
545 if (file) {
a61af66fc99e Initial load
duke
parents:
diff changeset
546 file->flush();
a61af66fc99e Initial load
duke
parents:
diff changeset
547
a61af66fc99e Initial load
duke
parents:
diff changeset
548 // Can't delete or close the file because delete and fclose aren't
a61af66fc99e Initial load
duke
parents:
diff changeset
549 // async-safe. We are about to die, so leave it to the kernel.
a61af66fc99e Initial load
duke
parents:
diff changeset
550 // delete file;
a61af66fc99e Initial load
duke
parents:
diff changeset
551 }
a61af66fc99e Initial load
duke
parents:
diff changeset
552 }
a61af66fc99e Initial load
duke
parents:
diff changeset
553 }
a61af66fc99e Initial load
duke
parents:
diff changeset
554
a61af66fc99e Initial load
duke
parents:
diff changeset
555 intx defaultStream::hold(intx writer_id) {
a61af66fc99e Initial load
duke
parents:
diff changeset
556 bool has_log = has_log_file(); // check before locking
a61af66fc99e Initial load
duke
parents:
diff changeset
557 if (// impossible, but who knows?
a61af66fc99e Initial load
duke
parents:
diff changeset
558 writer_id == NO_WRITER ||
a61af66fc99e Initial load
duke
parents:
diff changeset
559
a61af66fc99e Initial load
duke
parents:
diff changeset
560 // bootstrap problem
a61af66fc99e Initial load
duke
parents:
diff changeset
561 tty_lock == NULL ||
a61af66fc99e Initial load
duke
parents:
diff changeset
562
a61af66fc99e Initial load
duke
parents:
diff changeset
563 // can't grab a lock or call Thread::current() if TLS isn't initialized
a61af66fc99e Initial load
duke
parents:
diff changeset
564 ThreadLocalStorage::thread() == NULL ||
a61af66fc99e Initial load
duke
parents:
diff changeset
565
a61af66fc99e Initial load
duke
parents:
diff changeset
566 // developer hook
a61af66fc99e Initial load
duke
parents:
diff changeset
567 !SerializeVMOutput ||
a61af66fc99e Initial load
duke
parents:
diff changeset
568
a61af66fc99e Initial load
duke
parents:
diff changeset
569 // VM already unhealthy
a61af66fc99e Initial load
duke
parents:
diff changeset
570 is_error_reported() ||
a61af66fc99e Initial load
duke
parents:
diff changeset
571
a61af66fc99e Initial load
duke
parents:
diff changeset
572 // safepoint == global lock (for VM only)
a61af66fc99e Initial load
duke
parents:
diff changeset
573 (SafepointSynchronize::is_synchronizing() &&
a61af66fc99e Initial load
duke
parents:
diff changeset
574 Thread::current()->is_VM_thread())
a61af66fc99e Initial load
duke
parents:
diff changeset
575 ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
576 // do not attempt to lock unless we know the thread and the VM is healthy
a61af66fc99e Initial load
duke
parents:
diff changeset
577 return NO_WRITER;
a61af66fc99e Initial load
duke
parents:
diff changeset
578 }
a61af66fc99e Initial load
duke
parents:
diff changeset
579 if (_writer == writer_id) {
a61af66fc99e Initial load
duke
parents:
diff changeset
580 // already held, no need to re-grab the lock
a61af66fc99e Initial load
duke
parents:
diff changeset
581 return NO_WRITER;
a61af66fc99e Initial load
duke
parents:
diff changeset
582 }
a61af66fc99e Initial load
duke
parents:
diff changeset
583 tty_lock->lock_without_safepoint_check();
a61af66fc99e Initial load
duke
parents:
diff changeset
584 // got the lock
a61af66fc99e Initial load
duke
parents:
diff changeset
585 if (writer_id != _last_writer) {
a61af66fc99e Initial load
duke
parents:
diff changeset
586 if (has_log) {
a61af66fc99e Initial load
duke
parents:
diff changeset
587 _log_file->bol();
a61af66fc99e Initial load
duke
parents:
diff changeset
588 // output a hint where this output is coming from:
a61af66fc99e Initial load
duke
parents:
diff changeset
589 _log_file->print_cr("<writer thread='"INTX_FORMAT"'/>", writer_id);
a61af66fc99e Initial load
duke
parents:
diff changeset
590 }
a61af66fc99e Initial load
duke
parents:
diff changeset
591 _last_writer = writer_id;
a61af66fc99e Initial load
duke
parents:
diff changeset
592 }
a61af66fc99e Initial load
duke
parents:
diff changeset
593 _writer = writer_id;
a61af66fc99e Initial load
duke
parents:
diff changeset
594 return writer_id;
a61af66fc99e Initial load
duke
parents:
diff changeset
595 }
a61af66fc99e Initial load
duke
parents:
diff changeset
596
a61af66fc99e Initial load
duke
parents:
diff changeset
597 void defaultStream::release(intx holder) {
a61af66fc99e Initial load
duke
parents:
diff changeset
598 if (holder == NO_WRITER) {
a61af66fc99e Initial load
duke
parents:
diff changeset
599 // nothing to release: either a recursive lock, or we scribbled (too bad)
a61af66fc99e Initial load
duke
parents:
diff changeset
600 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
601 }
a61af66fc99e Initial load
duke
parents:
diff changeset
602 if (_writer != holder) {
a61af66fc99e Initial load
duke
parents:
diff changeset
603 return; // already unlocked, perhaps via break_tty_lock_for_safepoint
a61af66fc99e Initial load
duke
parents:
diff changeset
604 }
a61af66fc99e Initial load
duke
parents:
diff changeset
605 _writer = NO_WRITER;
a61af66fc99e Initial load
duke
parents:
diff changeset
606 tty_lock->unlock();
a61af66fc99e Initial load
duke
parents:
diff changeset
607 }
a61af66fc99e Initial load
duke
parents:
diff changeset
608
a61af66fc99e Initial load
duke
parents:
diff changeset
609
a61af66fc99e Initial load
duke
parents:
diff changeset
610 // Yuck: jio_print does not accept char*/len.
a61af66fc99e Initial load
duke
parents:
diff changeset
611 static void call_jio_print(const char* s, size_t len) {
a61af66fc99e Initial load
duke
parents:
diff changeset
612 char buffer[O_BUFLEN+100];
a61af66fc99e Initial load
duke
parents:
diff changeset
613 if (len > sizeof(buffer)-1) {
a61af66fc99e Initial load
duke
parents:
diff changeset
614 warning("increase O_BUFLEN in ostream.cpp -- output truncated");
a61af66fc99e Initial load
duke
parents:
diff changeset
615 len = sizeof(buffer)-1;
a61af66fc99e Initial load
duke
parents:
diff changeset
616 }
a61af66fc99e Initial load
duke
parents:
diff changeset
617 strncpy(buffer, s, len);
a61af66fc99e Initial load
duke
parents:
diff changeset
618 buffer[len] = '\0';
a61af66fc99e Initial load
duke
parents:
diff changeset
619 jio_print(buffer);
a61af66fc99e Initial load
duke
parents:
diff changeset
620 }
a61af66fc99e Initial load
duke
parents:
diff changeset
621
a61af66fc99e Initial load
duke
parents:
diff changeset
622
a61af66fc99e Initial load
duke
parents:
diff changeset
623 void defaultStream::write(const char* s, size_t len) {
a61af66fc99e Initial load
duke
parents:
diff changeset
624 intx thread_id = os::current_thread_id();
a61af66fc99e Initial load
duke
parents:
diff changeset
625 intx holder = hold(thread_id);
a61af66fc99e Initial load
duke
parents:
diff changeset
626
a61af66fc99e Initial load
duke
parents:
diff changeset
627 if (DisplayVMOutput &&
a61af66fc99e Initial load
duke
parents:
diff changeset
628 (_outer_xmlStream == NULL || !_outer_xmlStream->inside_attrs())) {
a61af66fc99e Initial load
duke
parents:
diff changeset
629 // print to output stream. It can be redirected by a vfprintf hook
a61af66fc99e Initial load
duke
parents:
diff changeset
630 if (s[len] == '\0') {
a61af66fc99e Initial load
duke
parents:
diff changeset
631 jio_print(s);
a61af66fc99e Initial load
duke
parents:
diff changeset
632 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
633 call_jio_print(s, len);
a61af66fc99e Initial load
duke
parents:
diff changeset
634 }
a61af66fc99e Initial load
duke
parents:
diff changeset
635 }
a61af66fc99e Initial load
duke
parents:
diff changeset
636
a61af66fc99e Initial load
duke
parents:
diff changeset
637 // print to log file
a61af66fc99e Initial load
duke
parents:
diff changeset
638 if (has_log_file()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
639 int nl0 = _newlines;
a61af66fc99e Initial load
duke
parents:
diff changeset
640 xmlTextStream::write(s, len);
a61af66fc99e Initial load
duke
parents:
diff changeset
641 // flush the log file too, if there were any newlines
a61af66fc99e Initial load
duke
parents:
diff changeset
642 if (nl0 != _newlines){
a61af66fc99e Initial load
duke
parents:
diff changeset
643 flush();
a61af66fc99e Initial load
duke
parents:
diff changeset
644 }
a61af66fc99e Initial load
duke
parents:
diff changeset
645 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
646 update_position(s, len);
a61af66fc99e Initial load
duke
parents:
diff changeset
647 }
a61af66fc99e Initial load
duke
parents:
diff changeset
648
a61af66fc99e Initial load
duke
parents:
diff changeset
649 release(holder);
a61af66fc99e Initial load
duke
parents:
diff changeset
650 }
a61af66fc99e Initial load
duke
parents:
diff changeset
651
a61af66fc99e Initial load
duke
parents:
diff changeset
652 intx ttyLocker::hold_tty() {
a61af66fc99e Initial load
duke
parents:
diff changeset
653 if (defaultStream::instance == NULL) return defaultStream::NO_WRITER;
a61af66fc99e Initial load
duke
parents:
diff changeset
654 intx thread_id = os::current_thread_id();
a61af66fc99e Initial load
duke
parents:
diff changeset
655 return defaultStream::instance->hold(thread_id);
a61af66fc99e Initial load
duke
parents:
diff changeset
656 }
a61af66fc99e Initial load
duke
parents:
diff changeset
657
a61af66fc99e Initial load
duke
parents:
diff changeset
658 void ttyLocker::release_tty(intx holder) {
a61af66fc99e Initial load
duke
parents:
diff changeset
659 if (holder == defaultStream::NO_WRITER) return;
a61af66fc99e Initial load
duke
parents:
diff changeset
660 defaultStream::instance->release(holder);
a61af66fc99e Initial load
duke
parents:
diff changeset
661 }
a61af66fc99e Initial load
duke
parents:
diff changeset
662
a61af66fc99e Initial load
duke
parents:
diff changeset
663 void ttyLocker::break_tty_lock_for_safepoint(intx holder) {
a61af66fc99e Initial load
duke
parents:
diff changeset
664 if (defaultStream::instance != NULL &&
a61af66fc99e Initial load
duke
parents:
diff changeset
665 defaultStream::instance->writer() == holder) {
a61af66fc99e Initial load
duke
parents:
diff changeset
666 if (xtty != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
667 xtty->print_cr("<!-- safepoint while printing -->");
a61af66fc99e Initial load
duke
parents:
diff changeset
668 }
a61af66fc99e Initial load
duke
parents:
diff changeset
669 defaultStream::instance->release(holder);
a61af66fc99e Initial load
duke
parents:
diff changeset
670 }
a61af66fc99e Initial load
duke
parents:
diff changeset
671 // (else there was no lock to break)
a61af66fc99e Initial load
duke
parents:
diff changeset
672 }
a61af66fc99e Initial load
duke
parents:
diff changeset
673
a61af66fc99e Initial load
duke
parents:
diff changeset
674 void ostream_init() {
a61af66fc99e Initial load
duke
parents:
diff changeset
675 if (defaultStream::instance == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
676 defaultStream::instance = new(ResourceObj::C_HEAP) defaultStream();
a61af66fc99e Initial load
duke
parents:
diff changeset
677 tty = defaultStream::instance;
a61af66fc99e Initial load
duke
parents:
diff changeset
678
a61af66fc99e Initial load
duke
parents:
diff changeset
679 // We want to ensure that time stamps in GC logs consider time 0
a61af66fc99e Initial load
duke
parents:
diff changeset
680 // the time when the JVM is initialized, not the first time we ask
a61af66fc99e Initial load
duke
parents:
diff changeset
681 // for a time stamp. So, here, we explicitly update the time stamp
a61af66fc99e Initial load
duke
parents:
diff changeset
682 // of tty.
a61af66fc99e Initial load
duke
parents:
diff changeset
683 tty->time_stamp().update_to(1);
a61af66fc99e Initial load
duke
parents:
diff changeset
684 }
a61af66fc99e Initial load
duke
parents:
diff changeset
685 }
a61af66fc99e Initial load
duke
parents:
diff changeset
686
a61af66fc99e Initial load
duke
parents:
diff changeset
687 void ostream_init_log() {
a61af66fc99e Initial load
duke
parents:
diff changeset
688 // For -Xloggc:<file> option - called in runtime/thread.cpp
a61af66fc99e Initial load
duke
parents:
diff changeset
689 // Note : this must be called AFTER ostream_init()
a61af66fc99e Initial load
duke
parents:
diff changeset
690
a61af66fc99e Initial load
duke
parents:
diff changeset
691 gclog_or_tty = tty; // default to tty
a61af66fc99e Initial load
duke
parents:
diff changeset
692 if (Arguments::gc_log_filename() != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
693 fileStream * gclog = new(ResourceObj::C_HEAP)
a61af66fc99e Initial load
duke
parents:
diff changeset
694 fileStream(Arguments::gc_log_filename());
a61af66fc99e Initial load
duke
parents:
diff changeset
695 if (gclog->is_open()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
696 // now we update the time stamp of the GC log to be synced up
a61af66fc99e Initial load
duke
parents:
diff changeset
697 // with tty.
a61af66fc99e Initial load
duke
parents:
diff changeset
698 gclog->time_stamp().update_to(tty->time_stamp().ticks());
a61af66fc99e Initial load
duke
parents:
diff changeset
699 gclog_or_tty = gclog;
a61af66fc99e Initial load
duke
parents:
diff changeset
700 }
a61af66fc99e Initial load
duke
parents:
diff changeset
701 }
a61af66fc99e Initial load
duke
parents:
diff changeset
702
a61af66fc99e Initial load
duke
parents:
diff changeset
703 // If we haven't lazily initialized the logfile yet, do it now,
a61af66fc99e Initial load
duke
parents:
diff changeset
704 // to avoid the possibility of lazy initialization during a VM
a61af66fc99e Initial load
duke
parents:
diff changeset
705 // crash, which can affect the stability of the fatal error handler.
a61af66fc99e Initial load
duke
parents:
diff changeset
706 defaultStream::instance->has_log_file();
a61af66fc99e Initial load
duke
parents:
diff changeset
707 }
a61af66fc99e Initial load
duke
parents:
diff changeset
708
a61af66fc99e Initial load
duke
parents:
diff changeset
709 // ostream_exit() is called during normal VM exit to finish log files, flush
a61af66fc99e Initial load
duke
parents:
diff changeset
710 // output and free resource.
a61af66fc99e Initial load
duke
parents:
diff changeset
711 void ostream_exit() {
a61af66fc99e Initial load
duke
parents:
diff changeset
712 static bool ostream_exit_called = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
713 if (ostream_exit_called) return;
a61af66fc99e Initial load
duke
parents:
diff changeset
714 ostream_exit_called = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
715 if (gclog_or_tty != tty) {
a61af66fc99e Initial load
duke
parents:
diff changeset
716 delete gclog_or_tty;
a61af66fc99e Initial load
duke
parents:
diff changeset
717 }
a61af66fc99e Initial load
duke
parents:
diff changeset
718 {
a61af66fc99e Initial load
duke
parents:
diff changeset
719 // we temporaly disable PrintMallocFree here
a61af66fc99e Initial load
duke
parents:
diff changeset
720 // as otherwise it'll lead to using of almost deleted
a61af66fc99e Initial load
duke
parents:
diff changeset
721 // tty or defaultStream::instance in logging facility
a61af66fc99e Initial load
duke
parents:
diff changeset
722 // of HeapFree(), see 6391258
a61af66fc99e Initial load
duke
parents:
diff changeset
723 DEBUG_ONLY(FlagSetting fs(PrintMallocFree, false);)
a61af66fc99e Initial load
duke
parents:
diff changeset
724 if (tty != defaultStream::instance) {
a61af66fc99e Initial load
duke
parents:
diff changeset
725 delete tty;
a61af66fc99e Initial load
duke
parents:
diff changeset
726 }
a61af66fc99e Initial load
duke
parents:
diff changeset
727 if (defaultStream::instance != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
728 delete defaultStream::instance;
a61af66fc99e Initial load
duke
parents:
diff changeset
729 }
a61af66fc99e Initial load
duke
parents:
diff changeset
730 }
a61af66fc99e Initial load
duke
parents:
diff changeset
731 tty = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
732 xtty = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
733 gclog_or_tty = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
734 defaultStream::instance = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
735 }
a61af66fc99e Initial load
duke
parents:
diff changeset
736
a61af66fc99e Initial load
duke
parents:
diff changeset
737 // ostream_abort() is called by os::abort() when VM is about to die.
a61af66fc99e Initial load
duke
parents:
diff changeset
738 void ostream_abort() {
a61af66fc99e Initial load
duke
parents:
diff changeset
739 // Here we can't delete gclog_or_tty and tty, just flush their output
a61af66fc99e Initial load
duke
parents:
diff changeset
740 if (gclog_or_tty) gclog_or_tty->flush();
a61af66fc99e Initial load
duke
parents:
diff changeset
741 if (tty) tty->flush();
a61af66fc99e Initial load
duke
parents:
diff changeset
742
a61af66fc99e Initial load
duke
parents:
diff changeset
743 if (defaultStream::instance != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
744 static char buf[4096];
a61af66fc99e Initial load
duke
parents:
diff changeset
745 defaultStream::instance->finish_log_on_error(buf, sizeof(buf));
a61af66fc99e Initial load
duke
parents:
diff changeset
746 }
a61af66fc99e Initial load
duke
parents:
diff changeset
747 }
a61af66fc99e Initial load
duke
parents:
diff changeset
748
a61af66fc99e Initial load
duke
parents:
diff changeset
749 staticBufferStream::staticBufferStream(char* buffer, size_t buflen,
a61af66fc99e Initial load
duke
parents:
diff changeset
750 outputStream *outer_stream) {
a61af66fc99e Initial load
duke
parents:
diff changeset
751 _buffer = buffer;
a61af66fc99e Initial load
duke
parents:
diff changeset
752 _buflen = buflen;
a61af66fc99e Initial load
duke
parents:
diff changeset
753 _outer_stream = outer_stream;
a61af66fc99e Initial load
duke
parents:
diff changeset
754 }
a61af66fc99e Initial load
duke
parents:
diff changeset
755
a61af66fc99e Initial load
duke
parents:
diff changeset
756 void staticBufferStream::write(const char* c, size_t len) {
a61af66fc99e Initial load
duke
parents:
diff changeset
757 _outer_stream->print_raw(c, (int)len);
a61af66fc99e Initial load
duke
parents:
diff changeset
758 }
a61af66fc99e Initial load
duke
parents:
diff changeset
759
a61af66fc99e Initial load
duke
parents:
diff changeset
760 void staticBufferStream::flush() {
a61af66fc99e Initial load
duke
parents:
diff changeset
761 _outer_stream->flush();
a61af66fc99e Initial load
duke
parents:
diff changeset
762 }
a61af66fc99e Initial load
duke
parents:
diff changeset
763
a61af66fc99e Initial load
duke
parents:
diff changeset
764 void staticBufferStream::print(const char* format, ...) {
a61af66fc99e Initial load
duke
parents:
diff changeset
765 va_list ap;
a61af66fc99e Initial load
duke
parents:
diff changeset
766 va_start(ap, format);
a61af66fc99e Initial load
duke
parents:
diff changeset
767 size_t len;
a61af66fc99e Initial load
duke
parents:
diff changeset
768 const char* str = do_vsnprintf(_buffer, _buflen, format, ap, false, len);
a61af66fc99e Initial load
duke
parents:
diff changeset
769 write(str, len);
a61af66fc99e Initial load
duke
parents:
diff changeset
770 va_end(ap);
a61af66fc99e Initial load
duke
parents:
diff changeset
771 }
a61af66fc99e Initial load
duke
parents:
diff changeset
772
a61af66fc99e Initial load
duke
parents:
diff changeset
773 void staticBufferStream::print_cr(const char* format, ...) {
a61af66fc99e Initial load
duke
parents:
diff changeset
774 va_list ap;
a61af66fc99e Initial load
duke
parents:
diff changeset
775 va_start(ap, format);
a61af66fc99e Initial load
duke
parents:
diff changeset
776 size_t len;
a61af66fc99e Initial load
duke
parents:
diff changeset
777 const char* str = do_vsnprintf(_buffer, _buflen, format, ap, true, len);
a61af66fc99e Initial load
duke
parents:
diff changeset
778 write(str, len);
a61af66fc99e Initial load
duke
parents:
diff changeset
779 va_end(ap);
a61af66fc99e Initial load
duke
parents:
diff changeset
780 }
a61af66fc99e Initial load
duke
parents:
diff changeset
781
a61af66fc99e Initial load
duke
parents:
diff changeset
782 void staticBufferStream::vprint(const char *format, va_list argptr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
783 size_t len;
a61af66fc99e Initial load
duke
parents:
diff changeset
784 const char* str = do_vsnprintf(_buffer, _buflen, format, argptr, false, len);
a61af66fc99e Initial load
duke
parents:
diff changeset
785 write(str, len);
a61af66fc99e Initial load
duke
parents:
diff changeset
786 }
a61af66fc99e Initial load
duke
parents:
diff changeset
787
a61af66fc99e Initial load
duke
parents:
diff changeset
788 void staticBufferStream::vprint_cr(const char* format, va_list argptr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
789 size_t len;
a61af66fc99e Initial load
duke
parents:
diff changeset
790 const char* str = do_vsnprintf(_buffer, _buflen, format, argptr, true, len);
a61af66fc99e Initial load
duke
parents:
diff changeset
791 write(str, len);
a61af66fc99e Initial load
duke
parents:
diff changeset
792 }
a61af66fc99e Initial load
duke
parents:
diff changeset
793
222
2a1a77d3458f 6718676: putback for 6604014 is incomplete
never
parents: 102
diff changeset
794 bufferedStream::bufferedStream(size_t initial_size, size_t bufmax) : outputStream() {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
795 buffer_length = initial_size;
a61af66fc99e Initial load
duke
parents:
diff changeset
796 buffer = NEW_C_HEAP_ARRAY(char, buffer_length);
a61af66fc99e Initial load
duke
parents:
diff changeset
797 buffer_pos = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
798 buffer_fixed = false;
222
2a1a77d3458f 6718676: putback for 6604014 is incomplete
never
parents: 102
diff changeset
799 buffer_max = bufmax;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
800 }
a61af66fc99e Initial load
duke
parents:
diff changeset
801
222
2a1a77d3458f 6718676: putback for 6604014 is incomplete
never
parents: 102
diff changeset
802 bufferedStream::bufferedStream(char* fixed_buffer, size_t fixed_buffer_size, size_t bufmax) : outputStream() {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
803 buffer_length = fixed_buffer_size;
a61af66fc99e Initial load
duke
parents:
diff changeset
804 buffer = fixed_buffer;
a61af66fc99e Initial load
duke
parents:
diff changeset
805 buffer_pos = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
806 buffer_fixed = true;
222
2a1a77d3458f 6718676: putback for 6604014 is incomplete
never
parents: 102
diff changeset
807 buffer_max = bufmax;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
808 }
a61af66fc99e Initial load
duke
parents:
diff changeset
809
a61af66fc99e Initial load
duke
parents:
diff changeset
810 void bufferedStream::write(const char* s, size_t len) {
222
2a1a77d3458f 6718676: putback for 6604014 is incomplete
never
parents: 102
diff changeset
811
2a1a77d3458f 6718676: putback for 6604014 is incomplete
never
parents: 102
diff changeset
812 if(buffer_pos + len > buffer_max) {
2a1a77d3458f 6718676: putback for 6604014 is incomplete
never
parents: 102
diff changeset
813 flush();
2a1a77d3458f 6718676: putback for 6604014 is incomplete
never
parents: 102
diff changeset
814 }
2a1a77d3458f 6718676: putback for 6604014 is incomplete
never
parents: 102
diff changeset
815
0
a61af66fc99e Initial load
duke
parents:
diff changeset
816 size_t end = buffer_pos + len;
a61af66fc99e Initial load
duke
parents:
diff changeset
817 if (end >= buffer_length) {
a61af66fc99e Initial load
duke
parents:
diff changeset
818 if (buffer_fixed) {
a61af66fc99e Initial load
duke
parents:
diff changeset
819 // if buffer cannot resize, silently truncate
a61af66fc99e Initial load
duke
parents:
diff changeset
820 len = buffer_length - buffer_pos - 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
821 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
822 // For small overruns, double the buffer. For larger ones,
a61af66fc99e Initial load
duke
parents:
diff changeset
823 // increase to the requested size.
a61af66fc99e Initial load
duke
parents:
diff changeset
824 if (end < buffer_length * 2) {
a61af66fc99e Initial load
duke
parents:
diff changeset
825 end = buffer_length * 2;
a61af66fc99e Initial load
duke
parents:
diff changeset
826 }
a61af66fc99e Initial load
duke
parents:
diff changeset
827 buffer = REALLOC_C_HEAP_ARRAY(char, buffer, end);
a61af66fc99e Initial load
duke
parents:
diff changeset
828 buffer_length = end;
a61af66fc99e Initial load
duke
parents:
diff changeset
829 }
a61af66fc99e Initial load
duke
parents:
diff changeset
830 }
a61af66fc99e Initial load
duke
parents:
diff changeset
831 memcpy(buffer + buffer_pos, s, len);
a61af66fc99e Initial load
duke
parents:
diff changeset
832 buffer_pos += len;
a61af66fc99e Initial load
duke
parents:
diff changeset
833 update_position(s, len);
a61af66fc99e Initial load
duke
parents:
diff changeset
834 }
a61af66fc99e Initial load
duke
parents:
diff changeset
835
a61af66fc99e Initial load
duke
parents:
diff changeset
836 char* bufferedStream::as_string() {
a61af66fc99e Initial load
duke
parents:
diff changeset
837 char* copy = NEW_RESOURCE_ARRAY(char, buffer_pos+1);
a61af66fc99e Initial load
duke
parents:
diff changeset
838 strncpy(copy, buffer, buffer_pos);
a61af66fc99e Initial load
duke
parents:
diff changeset
839 copy[buffer_pos] = 0; // terminating null
a61af66fc99e Initial load
duke
parents:
diff changeset
840 return copy;
a61af66fc99e Initial load
duke
parents:
diff changeset
841 }
a61af66fc99e Initial load
duke
parents:
diff changeset
842
a61af66fc99e Initial load
duke
parents:
diff changeset
843 bufferedStream::~bufferedStream() {
a61af66fc99e Initial load
duke
parents:
diff changeset
844 if (!buffer_fixed) {
a61af66fc99e Initial load
duke
parents:
diff changeset
845 FREE_C_HEAP_ARRAY(char, buffer);
a61af66fc99e Initial load
duke
parents:
diff changeset
846 }
a61af66fc99e Initial load
duke
parents:
diff changeset
847 }
a61af66fc99e Initial load
duke
parents:
diff changeset
848
a61af66fc99e Initial load
duke
parents:
diff changeset
849 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
850
a61af66fc99e Initial load
duke
parents:
diff changeset
851 #if defined(SOLARIS) || defined(LINUX)
a61af66fc99e Initial load
duke
parents:
diff changeset
852 #include <sys/types.h>
a61af66fc99e Initial load
duke
parents:
diff changeset
853 #include <sys/socket.h>
a61af66fc99e Initial load
duke
parents:
diff changeset
854 #include <netinet/in.h>
a61af66fc99e Initial load
duke
parents:
diff changeset
855 #include <arpa/inet.h>
a61af66fc99e Initial load
duke
parents:
diff changeset
856 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
857
a61af66fc99e Initial load
duke
parents:
diff changeset
858 // Network access
222
2a1a77d3458f 6718676: putback for 6604014 is incomplete
never
parents: 102
diff changeset
859 networkStream::networkStream() : bufferedStream(1024*10, 1024*10) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
860
a61af66fc99e Initial load
duke
parents:
diff changeset
861 _socket = -1;
a61af66fc99e Initial load
duke
parents:
diff changeset
862
a61af66fc99e Initial load
duke
parents:
diff changeset
863 hpi::initialize_socket_library();
a61af66fc99e Initial load
duke
parents:
diff changeset
864
a61af66fc99e Initial load
duke
parents:
diff changeset
865 int result = hpi::socket(AF_INET, SOCK_STREAM, 0);
a61af66fc99e Initial load
duke
parents:
diff changeset
866 if (result <= 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
867 assert(false, "Socket could not be created!");
a61af66fc99e Initial load
duke
parents:
diff changeset
868 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
869 _socket = result;
a61af66fc99e Initial load
duke
parents:
diff changeset
870 }
a61af66fc99e Initial load
duke
parents:
diff changeset
871 }
a61af66fc99e Initial load
duke
parents:
diff changeset
872
a61af66fc99e Initial load
duke
parents:
diff changeset
873 int networkStream::read(char *buf, size_t len) {
a61af66fc99e Initial load
duke
parents:
diff changeset
874 return hpi::recv(_socket, buf, (int)len, 0);
a61af66fc99e Initial load
duke
parents:
diff changeset
875 }
a61af66fc99e Initial load
duke
parents:
diff changeset
876
a61af66fc99e Initial load
duke
parents:
diff changeset
877 void networkStream::flush() {
a61af66fc99e Initial load
duke
parents:
diff changeset
878 if (size() != 0) {
222
2a1a77d3458f 6718676: putback for 6604014 is incomplete
never
parents: 102
diff changeset
879 int result = hpi::raw_send(_socket, (char *)base(), (int)size(), 0);
2a1a77d3458f 6718676: putback for 6604014 is incomplete
never
parents: 102
diff changeset
880 assert(result != -1, "connection error");
2a1a77d3458f 6718676: putback for 6604014 is incomplete
never
parents: 102
diff changeset
881 assert(result == (int)size(), "didn't send enough data");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
882 }
a61af66fc99e Initial load
duke
parents:
diff changeset
883 reset();
a61af66fc99e Initial load
duke
parents:
diff changeset
884 }
a61af66fc99e Initial load
duke
parents:
diff changeset
885
a61af66fc99e Initial load
duke
parents:
diff changeset
886 networkStream::~networkStream() {
a61af66fc99e Initial load
duke
parents:
diff changeset
887 close();
a61af66fc99e Initial load
duke
parents:
diff changeset
888 }
a61af66fc99e Initial load
duke
parents:
diff changeset
889
a61af66fc99e Initial load
duke
parents:
diff changeset
890 void networkStream::close() {
a61af66fc99e Initial load
duke
parents:
diff changeset
891 if (_socket != -1) {
a61af66fc99e Initial load
duke
parents:
diff changeset
892 flush();
a61af66fc99e Initial load
duke
parents:
diff changeset
893 hpi::socket_close(_socket);
a61af66fc99e Initial load
duke
parents:
diff changeset
894 _socket = -1;
a61af66fc99e Initial load
duke
parents:
diff changeset
895 }
a61af66fc99e Initial load
duke
parents:
diff changeset
896 }
a61af66fc99e Initial load
duke
parents:
diff changeset
897
a61af66fc99e Initial load
duke
parents:
diff changeset
898 bool networkStream::connect(const char *ip, short port) {
a61af66fc99e Initial load
duke
parents:
diff changeset
899
a61af66fc99e Initial load
duke
parents:
diff changeset
900 struct sockaddr_in server;
a61af66fc99e Initial load
duke
parents:
diff changeset
901 server.sin_family = AF_INET;
a61af66fc99e Initial load
duke
parents:
diff changeset
902 server.sin_port = htons(port);
a61af66fc99e Initial load
duke
parents:
diff changeset
903
a61af66fc99e Initial load
duke
parents:
diff changeset
904 server.sin_addr.s_addr = inet_addr(ip);
80
092ea87cc974 6679422: networkStream::connect() in ostream.cpp is not 64-bit clean
jcoomes
parents: 0
diff changeset
905 if (server.sin_addr.s_addr == (uint32_t)-1) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
906 #ifdef _WINDOWS
a61af66fc99e Initial load
duke
parents:
diff changeset
907 struct hostent* host = hpi::get_host_by_name((char*)ip);
a61af66fc99e Initial load
duke
parents:
diff changeset
908 #else
a61af66fc99e Initial load
duke
parents:
diff changeset
909 struct hostent* host = gethostbyname(ip);
a61af66fc99e Initial load
duke
parents:
diff changeset
910 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
911 if (host != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
912 memcpy(&server.sin_addr, host->h_addr_list[0], host->h_length);
a61af66fc99e Initial load
duke
parents:
diff changeset
913 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
914 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
915 }
a61af66fc99e Initial load
duke
parents:
diff changeset
916 }
a61af66fc99e Initial load
duke
parents:
diff changeset
917
a61af66fc99e Initial load
duke
parents:
diff changeset
918
a61af66fc99e Initial load
duke
parents:
diff changeset
919 int result = hpi::connect(_socket, (struct sockaddr*)&server, sizeof(struct sockaddr_in));
a61af66fc99e Initial load
duke
parents:
diff changeset
920 return (result >= 0);
a61af66fc99e Initial load
duke
parents:
diff changeset
921 }
a61af66fc99e Initial load
duke
parents:
diff changeset
922
a61af66fc99e Initial load
duke
parents:
diff changeset
923 #endif