annotate src/share/vm/utilities/ostream.cpp @ 6862:8a5ea0a9ccc4

7127708: G1: change task num types from int to uint in concurrent mark Summary: Change the type of various task num fields, parameters etc to unsigned and rename them to be more consistent with the other collectors. Code changes were also reviewed by Vitaly Davidovich. Reviewed-by: johnc Contributed-by: Kaushik Srenevasan <kaushik@twitter.com>
author johnc
date Sat, 06 Oct 2012 01:17:44 -0700
parents 4ee06e614636
children c38f13903fdf c3e799c37717
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
6605
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6197
diff changeset
2 * Copyright (c) 1997, 2012, 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
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
25 #include "precompiled.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
26 #include "compiler/compileLog.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
27 #include "oops/oop.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
28 #include "runtime/arguments.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
29 #include "utilities/defaultStream.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
30 #include "utilities/ostream.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
31 #include "utilities/top.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
32 #include "utilities/xmlstream.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
33 #ifdef TARGET_OS_FAMILY_linux
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
34 # include "os_linux.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
35 #endif
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
36 #ifdef TARGET_OS_FAMILY_solaris
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
37 # include "os_solaris.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
38 #endif
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
39 #ifdef TARGET_OS_FAMILY_windows
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
40 # include "os_windows.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
41 #endif
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents: 3767
diff changeset
42 #ifdef TARGET_OS_FAMILY_bsd
f08d439fab8c 7089790: integrate bsd-port changes
never
parents: 3767
diff changeset
43 # include "os_bsd.inline.hpp"
f08d439fab8c 7089790: integrate bsd-port changes
never
parents: 3767
diff changeset
44 #endif
0
a61af66fc99e Initial load
duke
parents:
diff changeset
45
a61af66fc99e Initial load
duke
parents:
diff changeset
46 extern "C" void jio_print(const char* s); // Declarationtion of jvm method
a61af66fc99e Initial load
duke
parents:
diff changeset
47
a61af66fc99e Initial load
duke
parents:
diff changeset
48 outputStream::outputStream(int width) {
a61af66fc99e Initial load
duke
parents:
diff changeset
49 _width = width;
a61af66fc99e Initial load
duke
parents:
diff changeset
50 _position = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
51 _newlines = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
52 _precount = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
53 _indentation = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
54 }
a61af66fc99e Initial load
duke
parents:
diff changeset
55
a61af66fc99e Initial load
duke
parents:
diff changeset
56 outputStream::outputStream(int width, bool has_time_stamps) {
a61af66fc99e Initial load
duke
parents:
diff changeset
57 _width = width;
a61af66fc99e Initial load
duke
parents:
diff changeset
58 _position = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
59 _newlines = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
60 _precount = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
61 _indentation = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
62 if (has_time_stamps) _stamp.update();
a61af66fc99e Initial load
duke
parents:
diff changeset
63 }
a61af66fc99e Initial load
duke
parents:
diff changeset
64
a61af66fc99e Initial load
duke
parents:
diff changeset
65 void outputStream::update_position(const char* s, size_t len) {
a61af66fc99e Initial load
duke
parents:
diff changeset
66 for (size_t i = 0; i < len; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
67 char ch = s[i];
a61af66fc99e Initial load
duke
parents:
diff changeset
68 if (ch == '\n') {
a61af66fc99e Initial load
duke
parents:
diff changeset
69 _newlines += 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
70 _precount += _position + 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
71 _position = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
72 } else if (ch == '\t') {
100
c7c777385a15 6667042: PrintAssembly option does not work without special plugin
jrose
parents: 0
diff changeset
73 int tw = 8 - (_position & 7);
c7c777385a15 6667042: PrintAssembly option does not work without special plugin
jrose
parents: 0
diff changeset
74 _position += tw;
c7c777385a15 6667042: PrintAssembly option does not work without special plugin
jrose
parents: 0
diff changeset
75 _precount -= tw-1; // invariant: _precount + _position == total count
0
a61af66fc99e Initial load
duke
parents:
diff changeset
76 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
77 _position += 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
78 }
a61af66fc99e Initial load
duke
parents:
diff changeset
79 }
a61af66fc99e Initial load
duke
parents:
diff changeset
80 }
a61af66fc99e Initial load
duke
parents:
diff changeset
81
a61af66fc99e Initial load
duke
parents:
diff changeset
82 // Execute a vsprintf, using the given buffer if necessary.
a61af66fc99e Initial load
duke
parents:
diff changeset
83 // Return a pointer to the formatted string.
a61af66fc99e Initial load
duke
parents:
diff changeset
84 const char* outputStream::do_vsnprintf(char* buffer, size_t buflen,
a61af66fc99e Initial load
duke
parents:
diff changeset
85 const char* format, va_list ap,
a61af66fc99e Initial load
duke
parents:
diff changeset
86 bool add_cr,
a61af66fc99e Initial load
duke
parents:
diff changeset
87 size_t& result_len) {
a61af66fc99e Initial load
duke
parents:
diff changeset
88 const char* result;
a61af66fc99e Initial load
duke
parents:
diff changeset
89 if (add_cr) buflen--;
a61af66fc99e Initial load
duke
parents:
diff changeset
90 if (!strchr(format, '%')) {
a61af66fc99e Initial load
duke
parents:
diff changeset
91 // constant format string
a61af66fc99e Initial load
duke
parents:
diff changeset
92 result = format;
a61af66fc99e Initial load
duke
parents:
diff changeset
93 result_len = strlen(result);
a61af66fc99e Initial load
duke
parents:
diff changeset
94 if (add_cr && result_len >= buflen) result_len = buflen-1; // truncate
a61af66fc99e Initial load
duke
parents:
diff changeset
95 } else if (format[0] == '%' && format[1] == 's' && format[2] == '\0') {
a61af66fc99e Initial load
duke
parents:
diff changeset
96 // trivial copy-through format string
a61af66fc99e Initial load
duke
parents:
diff changeset
97 result = va_arg(ap, const char*);
a61af66fc99e Initial load
duke
parents:
diff changeset
98 result_len = strlen(result);
a61af66fc99e Initial load
duke
parents:
diff changeset
99 if (add_cr && result_len >= buflen) result_len = buflen-1; // truncate
a61af66fc99e Initial load
duke
parents:
diff changeset
100 } else if (vsnprintf(buffer, buflen, format, ap) >= 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
101 result = buffer;
a61af66fc99e Initial load
duke
parents:
diff changeset
102 result_len = strlen(result);
a61af66fc99e Initial load
duke
parents:
diff changeset
103 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
104 DEBUG_ONLY(warning("increase O_BUFLEN in ostream.hpp -- output truncated");)
a61af66fc99e Initial load
duke
parents:
diff changeset
105 result = buffer;
a61af66fc99e Initial load
duke
parents:
diff changeset
106 result_len = buflen - 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
107 buffer[result_len] = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
108 }
a61af66fc99e Initial load
duke
parents:
diff changeset
109 if (add_cr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
110 if (result != buffer) {
a61af66fc99e Initial load
duke
parents:
diff changeset
111 strncpy(buffer, result, buflen);
a61af66fc99e Initial load
duke
parents:
diff changeset
112 result = buffer;
a61af66fc99e Initial load
duke
parents:
diff changeset
113 }
a61af66fc99e Initial load
duke
parents:
diff changeset
114 buffer[result_len++] = '\n';
a61af66fc99e Initial load
duke
parents:
diff changeset
115 buffer[result_len] = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
116 }
a61af66fc99e Initial load
duke
parents:
diff changeset
117 return result;
a61af66fc99e Initial load
duke
parents:
diff changeset
118 }
a61af66fc99e Initial load
duke
parents:
diff changeset
119
a61af66fc99e Initial load
duke
parents:
diff changeset
120 void outputStream::print(const char* format, ...) {
a61af66fc99e Initial load
duke
parents:
diff changeset
121 char buffer[O_BUFLEN];
a61af66fc99e Initial load
duke
parents:
diff changeset
122 va_list ap;
a61af66fc99e Initial load
duke
parents:
diff changeset
123 va_start(ap, format);
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, ap, false, len);
a61af66fc99e Initial load
duke
parents:
diff changeset
126 write(str, len);
a61af66fc99e Initial load
duke
parents:
diff changeset
127 va_end(ap);
a61af66fc99e Initial load
duke
parents:
diff changeset
128 }
a61af66fc99e Initial load
duke
parents:
diff changeset
129
a61af66fc99e Initial load
duke
parents:
diff changeset
130 void outputStream::print_cr(const char* format, ...) {
a61af66fc99e Initial load
duke
parents:
diff changeset
131 char buffer[O_BUFLEN];
a61af66fc99e Initial load
duke
parents:
diff changeset
132 va_list ap;
a61af66fc99e Initial load
duke
parents:
diff changeset
133 va_start(ap, format);
a61af66fc99e Initial load
duke
parents:
diff changeset
134 size_t len;
a61af66fc99e Initial load
duke
parents:
diff changeset
135 const char* str = do_vsnprintf(buffer, O_BUFLEN, format, ap, true, len);
a61af66fc99e Initial load
duke
parents:
diff changeset
136 write(str, len);
a61af66fc99e Initial load
duke
parents:
diff changeset
137 va_end(ap);
a61af66fc99e Initial load
duke
parents:
diff changeset
138 }
a61af66fc99e Initial load
duke
parents:
diff changeset
139
a61af66fc99e Initial load
duke
parents:
diff changeset
140 void outputStream::vprint(const char *format, va_list argptr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
141 char buffer[O_BUFLEN];
a61af66fc99e Initial load
duke
parents:
diff changeset
142 size_t len;
a61af66fc99e Initial load
duke
parents:
diff changeset
143 const char* str = do_vsnprintf(buffer, O_BUFLEN, format, argptr, false, len);
a61af66fc99e Initial load
duke
parents:
diff changeset
144 write(str, len);
a61af66fc99e Initial load
duke
parents:
diff changeset
145 }
a61af66fc99e Initial load
duke
parents:
diff changeset
146
a61af66fc99e Initial load
duke
parents:
diff changeset
147 void outputStream::vprint_cr(const char* format, va_list argptr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
148 char buffer[O_BUFLEN];
a61af66fc99e Initial load
duke
parents:
diff changeset
149 size_t len;
a61af66fc99e Initial load
duke
parents:
diff changeset
150 const char* str = do_vsnprintf(buffer, O_BUFLEN, format, argptr, true, len);
a61af66fc99e Initial load
duke
parents:
diff changeset
151 write(str, len);
a61af66fc99e Initial load
duke
parents:
diff changeset
152 }
a61af66fc99e Initial load
duke
parents:
diff changeset
153
a61af66fc99e Initial load
duke
parents:
diff changeset
154 void outputStream::fill_to(int col) {
100
c7c777385a15 6667042: PrintAssembly option does not work without special plugin
jrose
parents: 0
diff changeset
155 int need_fill = col - position();
c7c777385a15 6667042: PrintAssembly option does not work without special plugin
jrose
parents: 0
diff changeset
156 sp(need_fill);
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
c7c777385a15 6667042: PrintAssembly option does not work without special plugin
jrose
parents: 0
diff changeset
159 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
160 if (position() >= col + slop)
c7c777385a15 6667042: PrintAssembly option does not work without special plugin
jrose
parents: 0
diff changeset
161 cr();
c7c777385a15 6667042: PrintAssembly option does not work without special plugin
jrose
parents: 0
diff changeset
162 int need_fill = col - position();
c7c777385a15 6667042: PrintAssembly option does not work without special plugin
jrose
parents: 0
diff changeset
163 if (need_fill < min_space)
c7c777385a15 6667042: PrintAssembly option does not work without special plugin
jrose
parents: 0
diff changeset
164 need_fill = min_space;
c7c777385a15 6667042: PrintAssembly option does not work without special plugin
jrose
parents: 0
diff changeset
165 sp(need_fill);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
166 }
a61af66fc99e Initial load
duke
parents:
diff changeset
167
a61af66fc99e Initial load
duke
parents:
diff changeset
168 void outputStream::put(char ch) {
a61af66fc99e Initial load
duke
parents:
diff changeset
169 assert(ch != 0, "please fix call site");
a61af66fc99e Initial load
duke
parents:
diff changeset
170 char buf[] = { ch, '\0' };
a61af66fc99e Initial load
duke
parents:
diff changeset
171 write(buf, 1);
a61af66fc99e Initial load
duke
parents:
diff changeset
172 }
a61af66fc99e Initial load
duke
parents:
diff changeset
173
100
c7c777385a15 6667042: PrintAssembly option does not work without special plugin
jrose
parents: 0
diff changeset
174 #define SP_USE_TABS false
c7c777385a15 6667042: PrintAssembly option does not work without special plugin
jrose
parents: 0
diff changeset
175
c7c777385a15 6667042: PrintAssembly option does not work without special plugin
jrose
parents: 0
diff changeset
176 void outputStream::sp(int count) {
c7c777385a15 6667042: PrintAssembly option does not work without special plugin
jrose
parents: 0
diff changeset
177 if (count < 0) return;
c7c777385a15 6667042: PrintAssembly option does not work without special plugin
jrose
parents: 0
diff changeset
178 if (SP_USE_TABS && count >= 8) {
c7c777385a15 6667042: PrintAssembly option does not work without special plugin
jrose
parents: 0
diff changeset
179 int target = position() + count;
c7c777385a15 6667042: PrintAssembly option does not work without special plugin
jrose
parents: 0
diff changeset
180 while (count >= 8) {
c7c777385a15 6667042: PrintAssembly option does not work without special plugin
jrose
parents: 0
diff changeset
181 this->write("\t", 1);
c7c777385a15 6667042: PrintAssembly option does not work without special plugin
jrose
parents: 0
diff changeset
182 count -= 8;
c7c777385a15 6667042: PrintAssembly option does not work without special plugin
jrose
parents: 0
diff changeset
183 }
c7c777385a15 6667042: PrintAssembly option does not work without special plugin
jrose
parents: 0
diff changeset
184 count = target - position();
c7c777385a15 6667042: PrintAssembly option does not work without special plugin
jrose
parents: 0
diff changeset
185 }
c7c777385a15 6667042: PrintAssembly option does not work without special plugin
jrose
parents: 0
diff changeset
186 while (count > 0) {
c7c777385a15 6667042: PrintAssembly option does not work without special plugin
jrose
parents: 0
diff changeset
187 int nw = (count > 8) ? 8 : count;
c7c777385a15 6667042: PrintAssembly option does not work without special plugin
jrose
parents: 0
diff changeset
188 this->write(" ", nw);
c7c777385a15 6667042: PrintAssembly option does not work without special plugin
jrose
parents: 0
diff changeset
189 count -= nw;
c7c777385a15 6667042: PrintAssembly option does not work without special plugin
jrose
parents: 0
diff changeset
190 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
191 }
a61af66fc99e Initial load
duke
parents:
diff changeset
192
a61af66fc99e Initial load
duke
parents:
diff changeset
193 void outputStream::cr() {
a61af66fc99e Initial load
duke
parents:
diff changeset
194 this->write("\n", 1);
a61af66fc99e Initial load
duke
parents:
diff changeset
195 }
a61af66fc99e Initial load
duke
parents:
diff changeset
196
a61af66fc99e Initial load
duke
parents:
diff changeset
197 void outputStream::stamp() {
a61af66fc99e Initial load
duke
parents:
diff changeset
198 if (! _stamp.is_updated()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
199 _stamp.update(); // start at 0 on first call to stamp()
a61af66fc99e Initial load
duke
parents:
diff changeset
200 }
a61af66fc99e Initial load
duke
parents:
diff changeset
201
a61af66fc99e Initial load
duke
parents:
diff changeset
202 // outputStream::stamp() may get called by ostream_abort(), use snprintf
a61af66fc99e Initial load
duke
parents:
diff changeset
203 // to avoid allocating large stack buffer in print().
a61af66fc99e Initial load
duke
parents:
diff changeset
204 char buf[40];
a61af66fc99e Initial load
duke
parents:
diff changeset
205 jio_snprintf(buf, sizeof(buf), "%.3f", _stamp.seconds());
a61af66fc99e Initial load
duke
parents:
diff changeset
206 print_raw(buf);
a61af66fc99e Initial load
duke
parents:
diff changeset
207 }
a61af66fc99e Initial load
duke
parents:
diff changeset
208
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 102
diff changeset
209 void outputStream::stamp(bool guard,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 102
diff changeset
210 const char* prefix,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 102
diff changeset
211 const char* suffix) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 102
diff changeset
212 if (!guard) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 102
diff changeset
213 return;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 102
diff changeset
214 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 102
diff changeset
215 print_raw(prefix);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 102
diff changeset
216 stamp();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 102
diff changeset
217 print_raw(suffix);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 102
diff changeset
218 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 102
diff changeset
219
0
a61af66fc99e Initial load
duke
parents:
diff changeset
220 void outputStream::date_stamp(bool guard,
a61af66fc99e Initial load
duke
parents:
diff changeset
221 const char* prefix,
a61af66fc99e Initial load
duke
parents:
diff changeset
222 const char* suffix) {
a61af66fc99e Initial load
duke
parents:
diff changeset
223 if (!guard) {
a61af66fc99e Initial load
duke
parents:
diff changeset
224 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
225 }
a61af66fc99e Initial load
duke
parents:
diff changeset
226 print_raw(prefix);
a61af66fc99e Initial load
duke
parents:
diff changeset
227 static const char error_time[] = "yyyy-mm-ddThh:mm:ss.mmm+zzzz";
a61af66fc99e Initial load
duke
parents:
diff changeset
228 static const int buffer_length = 32;
a61af66fc99e Initial load
duke
parents:
diff changeset
229 char buffer[buffer_length];
a61af66fc99e Initial load
duke
parents:
diff changeset
230 const char* iso8601_result = os::iso8601_time(buffer, buffer_length);
a61af66fc99e Initial load
duke
parents:
diff changeset
231 if (iso8601_result != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
232 print_raw(buffer);
a61af66fc99e Initial load
duke
parents:
diff changeset
233 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
234 print_raw(error_time);
a61af66fc99e Initial load
duke
parents:
diff changeset
235 }
a61af66fc99e Initial load
duke
parents:
diff changeset
236 print_raw(suffix);
a61af66fc99e Initial load
duke
parents:
diff changeset
237 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
238 }
a61af66fc99e Initial load
duke
parents:
diff changeset
239
6605
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6197
diff changeset
240 outputStream& outputStream::indent() {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
241 while (_position < _indentation) sp();
6605
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6197
diff changeset
242 return *this;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
243 }
a61af66fc99e Initial load
duke
parents:
diff changeset
244
a61af66fc99e Initial load
duke
parents:
diff changeset
245 void outputStream::print_jlong(jlong value) {
a61af66fc99e Initial load
duke
parents:
diff changeset
246 // N.B. Same as INT64_FORMAT
a61af66fc99e Initial load
duke
parents:
diff changeset
247 print(os::jlong_format_specifier(), value);
a61af66fc99e Initial load
duke
parents:
diff changeset
248 }
a61af66fc99e Initial load
duke
parents:
diff changeset
249
a61af66fc99e Initial load
duke
parents:
diff changeset
250 void outputStream::print_julong(julong value) {
a61af66fc99e Initial load
duke
parents:
diff changeset
251 // N.B. Same as UINT64_FORMAT
a61af66fc99e Initial load
duke
parents:
diff changeset
252 print(os::julong_format_specifier(), value);
a61af66fc99e Initial load
duke
parents:
diff changeset
253 }
a61af66fc99e Initial load
duke
parents:
diff changeset
254
6605
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6197
diff changeset
255 /**
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6197
diff changeset
256 * This prints out hex data in a 'windbg' or 'xxd' form, where each line is:
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6197
diff changeset
257 * <hex-address>: 8 * <hex-halfword> <ascii translation (optional)>
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6197
diff changeset
258 * example:
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6197
diff changeset
259 * 0000000: 7f44 4f46 0102 0102 0000 0000 0000 0000 .DOF............
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6197
diff changeset
260 * 0000010: 0000 0000 0000 0040 0000 0020 0000 0005 .......@... ....
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6197
diff changeset
261 * 0000020: 0000 0000 0000 0040 0000 0000 0000 015d .......@.......]
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6197
diff changeset
262 * ...
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6197
diff changeset
263 *
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6197
diff changeset
264 * indent is applied to each line. Ends with a CR.
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6197
diff changeset
265 */
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6197
diff changeset
266 void outputStream::print_data(void* data, size_t len, bool with_ascii) {
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6197
diff changeset
267 size_t limit = (len + 16) / 16 * 16;
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6197
diff changeset
268 for (size_t i = 0; i < limit; ++i) {
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6197
diff changeset
269 if (i % 16 == 0) {
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6197
diff changeset
270 indent().print("%07x:", i);
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6197
diff changeset
271 }
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6197
diff changeset
272 if (i % 2 == 0) {
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6197
diff changeset
273 print(" ");
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6197
diff changeset
274 }
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6197
diff changeset
275 if (i < len) {
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6197
diff changeset
276 print("%02x", ((unsigned char*)data)[i]);
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6197
diff changeset
277 } else {
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6197
diff changeset
278 print(" ");
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6197
diff changeset
279 }
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6197
diff changeset
280 if ((i + 1) % 16 == 0) {
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6197
diff changeset
281 if (with_ascii) {
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6197
diff changeset
282 print(" ");
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6197
diff changeset
283 for (size_t j = 0; j < 16; ++j) {
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6197
diff changeset
284 size_t idx = i + j - 15;
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6197
diff changeset
285 if (idx < len) {
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6197
diff changeset
286 char c = ((char*)data)[idx];
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6197
diff changeset
287 print("%c", c >= 32 && c <= 126 ? c : '.');
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6197
diff changeset
288 }
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6197
diff changeset
289 }
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6197
diff changeset
290 }
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6197
diff changeset
291 print_cr("");
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6197
diff changeset
292 }
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6197
diff changeset
293 }
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6197
diff changeset
294 }
4ee06e614636 7116786: RFE: Detailed information on VerifyErrors
kamg
parents: 6197
diff changeset
295
0
a61af66fc99e Initial load
duke
parents:
diff changeset
296 stringStream::stringStream(size_t initial_size) : outputStream() {
a61af66fc99e Initial load
duke
parents:
diff changeset
297 buffer_length = initial_size;
a61af66fc99e Initial load
duke
parents:
diff changeset
298 buffer = NEW_RESOURCE_ARRAY(char, buffer_length);
a61af66fc99e Initial load
duke
parents:
diff changeset
299 buffer_pos = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
300 buffer_fixed = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
301 }
a61af66fc99e Initial load
duke
parents:
diff changeset
302
a61af66fc99e Initial load
duke
parents:
diff changeset
303 // useful for output to fixed chunks of memory, such as performance counters
a61af66fc99e Initial load
duke
parents:
diff changeset
304 stringStream::stringStream(char* fixed_buffer, size_t fixed_buffer_size) : outputStream() {
a61af66fc99e Initial load
duke
parents:
diff changeset
305 buffer_length = fixed_buffer_size;
a61af66fc99e Initial load
duke
parents:
diff changeset
306 buffer = fixed_buffer;
a61af66fc99e Initial load
duke
parents:
diff changeset
307 buffer_pos = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
308 buffer_fixed = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
309 }
a61af66fc99e Initial load
duke
parents:
diff changeset
310
a61af66fc99e Initial load
duke
parents:
diff changeset
311 void stringStream::write(const char* s, size_t len) {
a61af66fc99e Initial load
duke
parents:
diff changeset
312 size_t write_len = len; // number of non-null bytes to write
a61af66fc99e Initial load
duke
parents:
diff changeset
313 size_t end = buffer_pos + len + 1; // position after write and final '\0'
a61af66fc99e Initial load
duke
parents:
diff changeset
314 if (end > buffer_length) {
a61af66fc99e Initial load
duke
parents:
diff changeset
315 if (buffer_fixed) {
a61af66fc99e Initial load
duke
parents:
diff changeset
316 // if buffer cannot resize, silently truncate
a61af66fc99e Initial load
duke
parents:
diff changeset
317 end = buffer_length;
a61af66fc99e Initial load
duke
parents:
diff changeset
318 write_len = end - buffer_pos - 1; // leave room for the final '\0'
a61af66fc99e Initial load
duke
parents:
diff changeset
319 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
320 // For small overruns, double the buffer. For larger ones,
a61af66fc99e Initial load
duke
parents:
diff changeset
321 // increase to the requested size.
a61af66fc99e Initial load
duke
parents:
diff changeset
322 if (end < buffer_length * 2) {
a61af66fc99e Initial load
duke
parents:
diff changeset
323 end = buffer_length * 2;
a61af66fc99e Initial load
duke
parents:
diff changeset
324 }
a61af66fc99e Initial load
duke
parents:
diff changeset
325 char* oldbuf = buffer;
a61af66fc99e Initial load
duke
parents:
diff changeset
326 buffer = NEW_RESOURCE_ARRAY(char, end);
a61af66fc99e Initial load
duke
parents:
diff changeset
327 strncpy(buffer, oldbuf, buffer_pos);
a61af66fc99e Initial load
duke
parents:
diff changeset
328 buffer_length = end;
a61af66fc99e Initial load
duke
parents:
diff changeset
329 }
a61af66fc99e Initial load
duke
parents:
diff changeset
330 }
a61af66fc99e Initial load
duke
parents:
diff changeset
331 // invariant: buffer is always null-terminated
a61af66fc99e Initial load
duke
parents:
diff changeset
332 guarantee(buffer_pos + write_len + 1 <= buffer_length, "stringStream oob");
a61af66fc99e Initial load
duke
parents:
diff changeset
333 buffer[buffer_pos + write_len] = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
334 strncpy(buffer + buffer_pos, s, write_len);
a61af66fc99e Initial load
duke
parents:
diff changeset
335 buffer_pos += write_len;
a61af66fc99e Initial load
duke
parents:
diff changeset
336
a61af66fc99e Initial load
duke
parents:
diff changeset
337 // Note that the following does not depend on write_len.
a61af66fc99e Initial load
duke
parents:
diff changeset
338 // This means that position and count get updated
a61af66fc99e Initial load
duke
parents:
diff changeset
339 // even when overflow occurs.
a61af66fc99e Initial load
duke
parents:
diff changeset
340 update_position(s, len);
a61af66fc99e Initial load
duke
parents:
diff changeset
341 }
a61af66fc99e Initial load
duke
parents:
diff changeset
342
a61af66fc99e Initial load
duke
parents:
diff changeset
343 char* stringStream::as_string() {
a61af66fc99e Initial load
duke
parents:
diff changeset
344 char* copy = NEW_RESOURCE_ARRAY(char, buffer_pos+1);
a61af66fc99e Initial load
duke
parents:
diff changeset
345 strncpy(copy, buffer, buffer_pos);
a61af66fc99e Initial load
duke
parents:
diff changeset
346 copy[buffer_pos] = 0; // terminating null
a61af66fc99e Initial load
duke
parents:
diff changeset
347 return copy;
a61af66fc99e Initial load
duke
parents:
diff changeset
348 }
a61af66fc99e Initial load
duke
parents:
diff changeset
349
a61af66fc99e Initial load
duke
parents:
diff changeset
350 stringStream::~stringStream() {}
a61af66fc99e Initial load
duke
parents:
diff changeset
351
a61af66fc99e Initial load
duke
parents:
diff changeset
352 xmlStream* xtty;
a61af66fc99e Initial load
duke
parents:
diff changeset
353 outputStream* tty;
a61af66fc99e Initial load
duke
parents:
diff changeset
354 outputStream* gclog_or_tty;
a61af66fc99e Initial load
duke
parents:
diff changeset
355 extern Mutex* tty_lock;
a61af66fc99e Initial load
duke
parents:
diff changeset
356
a61af66fc99e Initial load
duke
parents:
diff changeset
357 fileStream::fileStream(const char* file_name) {
a61af66fc99e Initial load
duke
parents:
diff changeset
358 _file = fopen(file_name, "w");
a61af66fc99e Initial load
duke
parents:
diff changeset
359 _need_close = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
360 }
a61af66fc99e Initial load
duke
parents:
diff changeset
361
2199
d8a72fbc4be7 7003401: Implement VM error-reporting functionality on erroneous termination
kamg
parents: 1980
diff changeset
362 fileStream::fileStream(const char* file_name, const char* opentype) {
d8a72fbc4be7 7003401: Implement VM error-reporting functionality on erroneous termination
kamg
parents: 1980
diff changeset
363 _file = fopen(file_name, opentype);
d8a72fbc4be7 7003401: Implement VM error-reporting functionality on erroneous termination
kamg
parents: 1980
diff changeset
364 _need_close = true;
d8a72fbc4be7 7003401: Implement VM error-reporting functionality on erroneous termination
kamg
parents: 1980
diff changeset
365 }
d8a72fbc4be7 7003401: Implement VM error-reporting functionality on erroneous termination
kamg
parents: 1980
diff changeset
366
0
a61af66fc99e Initial load
duke
parents:
diff changeset
367 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
368 if (_file != NULL) {
2328d1d3f8cf 6781583: Hotspot build fails on linux 64 bit platform with gcc 4.3.2
xlu
parents: 356
diff changeset
369 // 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
370 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
371 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
372 update_position(s, len);
a61af66fc99e Initial load
duke
parents:
diff changeset
373 }
a61af66fc99e Initial load
duke
parents:
diff changeset
374
2199
d8a72fbc4be7 7003401: Implement VM error-reporting functionality on erroneous termination
kamg
parents: 1980
diff changeset
375 long fileStream::fileSize() {
d8a72fbc4be7 7003401: Implement VM error-reporting functionality on erroneous termination
kamg
parents: 1980
diff changeset
376 long size = -1;
d8a72fbc4be7 7003401: Implement VM error-reporting functionality on erroneous termination
kamg
parents: 1980
diff changeset
377 if (_file != NULL) {
d8a72fbc4be7 7003401: Implement VM error-reporting functionality on erroneous termination
kamg
parents: 1980
diff changeset
378 long pos = ::ftell(_file);
d8a72fbc4be7 7003401: Implement VM error-reporting functionality on erroneous termination
kamg
parents: 1980
diff changeset
379 if (::fseek(_file, 0, SEEK_END) == 0) {
d8a72fbc4be7 7003401: Implement VM error-reporting functionality on erroneous termination
kamg
parents: 1980
diff changeset
380 size = ::ftell(_file);
d8a72fbc4be7 7003401: Implement VM error-reporting functionality on erroneous termination
kamg
parents: 1980
diff changeset
381 }
d8a72fbc4be7 7003401: Implement VM error-reporting functionality on erroneous termination
kamg
parents: 1980
diff changeset
382 ::fseek(_file, pos, SEEK_SET);
d8a72fbc4be7 7003401: Implement VM error-reporting functionality on erroneous termination
kamg
parents: 1980
diff changeset
383 }
d8a72fbc4be7 7003401: Implement VM error-reporting functionality on erroneous termination
kamg
parents: 1980
diff changeset
384 return size;
d8a72fbc4be7 7003401: Implement VM error-reporting functionality on erroneous termination
kamg
parents: 1980
diff changeset
385 }
d8a72fbc4be7 7003401: Implement VM error-reporting functionality on erroneous termination
kamg
parents: 1980
diff changeset
386
d8a72fbc4be7 7003401: Implement VM error-reporting functionality on erroneous termination
kamg
parents: 1980
diff changeset
387 char* fileStream::readln(char *data, int count ) {
d8a72fbc4be7 7003401: Implement VM error-reporting functionality on erroneous termination
kamg
parents: 1980
diff changeset
388 char * ret = ::fgets(data, count, _file);
d8a72fbc4be7 7003401: Implement VM error-reporting functionality on erroneous termination
kamg
parents: 1980
diff changeset
389 //Get rid of annoying \n char
d8a72fbc4be7 7003401: Implement VM error-reporting functionality on erroneous termination
kamg
parents: 1980
diff changeset
390 data[::strlen(data)-1] = '\0';
d8a72fbc4be7 7003401: Implement VM error-reporting functionality on erroneous termination
kamg
parents: 1980
diff changeset
391 return ret;
d8a72fbc4be7 7003401: Implement VM error-reporting functionality on erroneous termination
kamg
parents: 1980
diff changeset
392 }
d8a72fbc4be7 7003401: Implement VM error-reporting functionality on erroneous termination
kamg
parents: 1980
diff changeset
393
0
a61af66fc99e Initial load
duke
parents:
diff changeset
394 fileStream::~fileStream() {
a61af66fc99e Initial load
duke
parents:
diff changeset
395 if (_file != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
396 if (_need_close) fclose(_file);
3767
2a241e764894 6941923: RFE: Handling large log files produced by long running Java Applications
minqi
parents: 2420
diff changeset
397 _file = NULL;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
398 }
a61af66fc99e Initial load
duke
parents:
diff changeset
399 }
a61af66fc99e Initial load
duke
parents:
diff changeset
400
a61af66fc99e Initial load
duke
parents:
diff changeset
401 void fileStream::flush() {
a61af66fc99e Initial load
duke
parents:
diff changeset
402 fflush(_file);
a61af66fc99e Initial load
duke
parents:
diff changeset
403 }
a61af66fc99e Initial load
duke
parents:
diff changeset
404
a61af66fc99e Initial load
duke
parents:
diff changeset
405 fdStream::fdStream(const char* file_name) {
a61af66fc99e Initial load
duke
parents:
diff changeset
406 _fd = open(file_name, O_WRONLY | O_CREAT | O_TRUNC, 0666);
a61af66fc99e Initial load
duke
parents:
diff changeset
407 _need_close = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
408 }
a61af66fc99e Initial load
duke
parents:
diff changeset
409
a61af66fc99e Initial load
duke
parents:
diff changeset
410 fdStream::~fdStream() {
a61af66fc99e Initial load
duke
parents:
diff changeset
411 if (_fd != -1) {
a61af66fc99e Initial load
duke
parents:
diff changeset
412 if (_need_close) close(_fd);
a61af66fc99e Initial load
duke
parents:
diff changeset
413 _fd = -1;
a61af66fc99e Initial load
duke
parents:
diff changeset
414 }
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 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
418 if (_fd != -1) {
2328d1d3f8cf 6781583: Hotspot build fails on linux 64 bit platform with gcc 4.3.2
xlu
parents: 356
diff changeset
419 // 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
420 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
421 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
422 update_position(s, len);
a61af66fc99e Initial load
duke
parents:
diff changeset
423 }
a61af66fc99e Initial load
duke
parents:
diff changeset
424
3767
2a241e764894 6941923: RFE: Handling large log files produced by long running Java Applications
minqi
parents: 2420
diff changeset
425 rotatingFileStream::~rotatingFileStream() {
2a241e764894 6941923: RFE: Handling large log files produced by long running Java Applications
minqi
parents: 2420
diff changeset
426 if (_file != NULL) {
2a241e764894 6941923: RFE: Handling large log files produced by long running Java Applications
minqi
parents: 2420
diff changeset
427 if (_need_close) fclose(_file);
2a241e764894 6941923: RFE: Handling large log files produced by long running Java Applications
minqi
parents: 2420
diff changeset
428 _file = NULL;
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 4717
diff changeset
429 FREE_C_HEAP_ARRAY(char, _file_name, mtInternal);
3767
2a241e764894 6941923: RFE: Handling large log files produced by long running Java Applications
minqi
parents: 2420
diff changeset
430 _file_name = NULL;
2a241e764894 6941923: RFE: Handling large log files produced by long running Java Applications
minqi
parents: 2420
diff changeset
431 }
2a241e764894 6941923: RFE: Handling large log files produced by long running Java Applications
minqi
parents: 2420
diff changeset
432 }
2a241e764894 6941923: RFE: Handling large log files produced by long running Java Applications
minqi
parents: 2420
diff changeset
433
2a241e764894 6941923: RFE: Handling large log files produced by long running Java Applications
minqi
parents: 2420
diff changeset
434 rotatingFileStream::rotatingFileStream(const char* file_name) {
2a241e764894 6941923: RFE: Handling large log files produced by long running Java Applications
minqi
parents: 2420
diff changeset
435 _cur_file_num = 0;
2a241e764894 6941923: RFE: Handling large log files produced by long running Java Applications
minqi
parents: 2420
diff changeset
436 _bytes_writen = 0L;
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 4717
diff changeset
437 _file_name = NEW_C_HEAP_ARRAY(char, strlen(file_name)+10, mtInternal);
3767
2a241e764894 6941923: RFE: Handling large log files produced by long running Java Applications
minqi
parents: 2420
diff changeset
438 jio_snprintf(_file_name, strlen(file_name)+10, "%s.%d", file_name, _cur_file_num);
2a241e764894 6941923: RFE: Handling large log files produced by long running Java Applications
minqi
parents: 2420
diff changeset
439 _file = fopen(_file_name, "w");
2a241e764894 6941923: RFE: Handling large log files produced by long running Java Applications
minqi
parents: 2420
diff changeset
440 _need_close = true;
2a241e764894 6941923: RFE: Handling large log files produced by long running Java Applications
minqi
parents: 2420
diff changeset
441 }
2a241e764894 6941923: RFE: Handling large log files produced by long running Java Applications
minqi
parents: 2420
diff changeset
442
2a241e764894 6941923: RFE: Handling large log files produced by long running Java Applications
minqi
parents: 2420
diff changeset
443 rotatingFileStream::rotatingFileStream(const char* file_name, const char* opentype) {
2a241e764894 6941923: RFE: Handling large log files produced by long running Java Applications
minqi
parents: 2420
diff changeset
444 _cur_file_num = 0;
2a241e764894 6941923: RFE: Handling large log files produced by long running Java Applications
minqi
parents: 2420
diff changeset
445 _bytes_writen = 0L;
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 4717
diff changeset
446 _file_name = NEW_C_HEAP_ARRAY(char, strlen(file_name)+10, mtInternal);
3767
2a241e764894 6941923: RFE: Handling large log files produced by long running Java Applications
minqi
parents: 2420
diff changeset
447 jio_snprintf(_file_name, strlen(file_name)+10, "%s.%d", file_name, _cur_file_num);
2a241e764894 6941923: RFE: Handling large log files produced by long running Java Applications
minqi
parents: 2420
diff changeset
448 _file = fopen(_file_name, opentype);
2a241e764894 6941923: RFE: Handling large log files produced by long running Java Applications
minqi
parents: 2420
diff changeset
449 _need_close = true;
2a241e764894 6941923: RFE: Handling large log files produced by long running Java Applications
minqi
parents: 2420
diff changeset
450 }
2a241e764894 6941923: RFE: Handling large log files produced by long running Java Applications
minqi
parents: 2420
diff changeset
451
2a241e764894 6941923: RFE: Handling large log files produced by long running Java Applications
minqi
parents: 2420
diff changeset
452 void rotatingFileStream::write(const char* s, size_t len) {
2a241e764894 6941923: RFE: Handling large log files produced by long running Java Applications
minqi
parents: 2420
diff changeset
453 if (_file != NULL) {
2a241e764894 6941923: RFE: Handling large log files produced by long running Java Applications
minqi
parents: 2420
diff changeset
454 // Make an unused local variable to avoid warning from gcc 4.x compiler.
2a241e764894 6941923: RFE: Handling large log files produced by long running Java Applications
minqi
parents: 2420
diff changeset
455 size_t count = fwrite(s, 1, len, _file);
2a241e764894 6941923: RFE: Handling large log files produced by long running Java Applications
minqi
parents: 2420
diff changeset
456 Atomic::add((jlong)count, &_bytes_writen);
2a241e764894 6941923: RFE: Handling large log files produced by long running Java Applications
minqi
parents: 2420
diff changeset
457 }
2a241e764894 6941923: RFE: Handling large log files produced by long running Java Applications
minqi
parents: 2420
diff changeset
458 update_position(s, len);
2a241e764894 6941923: RFE: Handling large log files produced by long running Java Applications
minqi
parents: 2420
diff changeset
459 }
2a241e764894 6941923: RFE: Handling large log files produced by long running Java Applications
minqi
parents: 2420
diff changeset
460
2a241e764894 6941923: RFE: Handling large log files produced by long running Java Applications
minqi
parents: 2420
diff changeset
461 // rotate_log must be called from VMThread at safepoint. In case need change parameters
2a241e764894 6941923: RFE: Handling large log files produced by long running Java Applications
minqi
parents: 2420
diff changeset
462 // for gc log rotation from thread other than VMThread, a sub type of VM_Operation
2a241e764894 6941923: RFE: Handling large log files produced by long running Java Applications
minqi
parents: 2420
diff changeset
463 // should be created and be submitted to VMThread's operation queue. DO NOT call this
2a241e764894 6941923: RFE: Handling large log files produced by long running Java Applications
minqi
parents: 2420
diff changeset
464 // function directly. Currently, it is safe to rotate log at safepoint through VMThread.
2a241e764894 6941923: RFE: Handling large log files produced by long running Java Applications
minqi
parents: 2420
diff changeset
465 // That is, no mutator threads and concurrent GC threads run parallel with VMThread to
2a241e764894 6941923: RFE: Handling large log files produced by long running Java Applications
minqi
parents: 2420
diff changeset
466 // write to gc log file at safepoint. If in future, changes made for mutator threads or
2a241e764894 6941923: RFE: Handling large log files produced by long running Java Applications
minqi
parents: 2420
diff changeset
467 // concurrent GC threads to run parallel with VMThread at safepoint, write and rotate_log
2a241e764894 6941923: RFE: Handling large log files produced by long running Java Applications
minqi
parents: 2420
diff changeset
468 // must be synchronized.
2a241e764894 6941923: RFE: Handling large log files produced by long running Java Applications
minqi
parents: 2420
diff changeset
469 void rotatingFileStream::rotate_log() {
2a241e764894 6941923: RFE: Handling large log files produced by long running Java Applications
minqi
parents: 2420
diff changeset
470 if (_bytes_writen < (jlong)GCLogFileSize) return;
2a241e764894 6941923: RFE: Handling large log files produced by long running Java Applications
minqi
parents: 2420
diff changeset
471 #ifdef ASSERT
2a241e764894 6941923: RFE: Handling large log files produced by long running Java Applications
minqi
parents: 2420
diff changeset
472 Thread *thread = Thread::current();
2a241e764894 6941923: RFE: Handling large log files produced by long running Java Applications
minqi
parents: 2420
diff changeset
473 assert(thread == NULL ||
2a241e764894 6941923: RFE: Handling large log files produced by long running Java Applications
minqi
parents: 2420
diff changeset
474 (thread->is_VM_thread() && SafepointSynchronize::is_at_safepoint()),
2a241e764894 6941923: RFE: Handling large log files produced by long running Java Applications
minqi
parents: 2420
diff changeset
475 "Must be VMThread at safepoint");
2a241e764894 6941923: RFE: Handling large log files produced by long running Java Applications
minqi
parents: 2420
diff changeset
476 #endif
2a241e764894 6941923: RFE: Handling large log files produced by long running Java Applications
minqi
parents: 2420
diff changeset
477 if (NumberOfGCLogFiles == 1) {
2a241e764894 6941923: RFE: Handling large log files produced by long running Java Applications
minqi
parents: 2420
diff changeset
478 // rotate in same file
2a241e764894 6941923: RFE: Handling large log files produced by long running Java Applications
minqi
parents: 2420
diff changeset
479 rewind();
2a241e764894 6941923: RFE: Handling large log files produced by long running Java Applications
minqi
parents: 2420
diff changeset
480 _bytes_writen = 0L;
2a241e764894 6941923: RFE: Handling large log files produced by long running Java Applications
minqi
parents: 2420
diff changeset
481 return;
2a241e764894 6941923: RFE: Handling large log files produced by long running Java Applications
minqi
parents: 2420
diff changeset
482 }
2a241e764894 6941923: RFE: Handling large log files produced by long running Java Applications
minqi
parents: 2420
diff changeset
483
2a241e764894 6941923: RFE: Handling large log files produced by long running Java Applications
minqi
parents: 2420
diff changeset
484 // rotate file in names file.0, file.1, file.2, ..., file.<MaxGCLogFileNumbers-1>
2a241e764894 6941923: RFE: Handling large log files produced by long running Java Applications
minqi
parents: 2420
diff changeset
485 // close current file, rotate to next file
2a241e764894 6941923: RFE: Handling large log files produced by long running Java Applications
minqi
parents: 2420
diff changeset
486 if (_file != NULL) {
2a241e764894 6941923: RFE: Handling large log files produced by long running Java Applications
minqi
parents: 2420
diff changeset
487 _cur_file_num ++;
2a241e764894 6941923: RFE: Handling large log files produced by long running Java Applications
minqi
parents: 2420
diff changeset
488 if (_cur_file_num >= NumberOfGCLogFiles) _cur_file_num = 0;
2a241e764894 6941923: RFE: Handling large log files produced by long running Java Applications
minqi
parents: 2420
diff changeset
489 jio_snprintf(_file_name, strlen(Arguments::gc_log_filename()) + 10, "%s.%d",
2a241e764894 6941923: RFE: Handling large log files produced by long running Java Applications
minqi
parents: 2420
diff changeset
490 Arguments::gc_log_filename(), _cur_file_num);
2a241e764894 6941923: RFE: Handling large log files produced by long running Java Applications
minqi
parents: 2420
diff changeset
491 fclose(_file);
2a241e764894 6941923: RFE: Handling large log files produced by long running Java Applications
minqi
parents: 2420
diff changeset
492 _file = NULL;
2a241e764894 6941923: RFE: Handling large log files produced by long running Java Applications
minqi
parents: 2420
diff changeset
493 }
2a241e764894 6941923: RFE: Handling large log files produced by long running Java Applications
minqi
parents: 2420
diff changeset
494 _file = fopen(_file_name, "w");
2a241e764894 6941923: RFE: Handling large log files produced by long running Java Applications
minqi
parents: 2420
diff changeset
495 if (_file != NULL) {
2a241e764894 6941923: RFE: Handling large log files produced by long running Java Applications
minqi
parents: 2420
diff changeset
496 _bytes_writen = 0L;
2a241e764894 6941923: RFE: Handling large log files produced by long running Java Applications
minqi
parents: 2420
diff changeset
497 _need_close = true;
2a241e764894 6941923: RFE: Handling large log files produced by long running Java Applications
minqi
parents: 2420
diff changeset
498 } else {
2a241e764894 6941923: RFE: Handling large log files produced by long running Java Applications
minqi
parents: 2420
diff changeset
499 tty->print_cr("failed to open rotation log file %s due to %s\n",
2a241e764894 6941923: RFE: Handling large log files produced by long running Java Applications
minqi
parents: 2420
diff changeset
500 _file_name, strerror(errno));
2a241e764894 6941923: RFE: Handling large log files produced by long running Java Applications
minqi
parents: 2420
diff changeset
501 _need_close = false;
2a241e764894 6941923: RFE: Handling large log files produced by long running Java Applications
minqi
parents: 2420
diff changeset
502 }
2a241e764894 6941923: RFE: Handling large log files produced by long running Java Applications
minqi
parents: 2420
diff changeset
503 }
2a241e764894 6941923: RFE: Handling large log files produced by long running Java Applications
minqi
parents: 2420
diff changeset
504
0
a61af66fc99e Initial load
duke
parents:
diff changeset
505 defaultStream* defaultStream::instance = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
506 int defaultStream::_output_fd = 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
507 int defaultStream::_error_fd = 2;
a61af66fc99e Initial load
duke
parents:
diff changeset
508 FILE* defaultStream::_output_stream = stdout;
a61af66fc99e Initial load
duke
parents:
diff changeset
509 FILE* defaultStream::_error_stream = stderr;
a61af66fc99e Initial load
duke
parents:
diff changeset
510
a61af66fc99e Initial load
duke
parents:
diff changeset
511 #define LOG_MAJOR_VERSION 160
a61af66fc99e Initial load
duke
parents:
diff changeset
512 #define LOG_MINOR_VERSION 1
a61af66fc99e Initial load
duke
parents:
diff changeset
513
a61af66fc99e Initial load
duke
parents:
diff changeset
514 void defaultStream::init() {
a61af66fc99e Initial load
duke
parents:
diff changeset
515 _inited = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
516 if (LogVMOutput || LogCompilation) {
a61af66fc99e Initial load
duke
parents:
diff changeset
517 init_log();
a61af66fc99e Initial load
duke
parents:
diff changeset
518 }
a61af66fc99e Initial load
duke
parents:
diff changeset
519 }
a61af66fc99e Initial load
duke
parents:
diff changeset
520
a61af66fc99e Initial load
duke
parents:
diff changeset
521 bool defaultStream::has_log_file() {
a61af66fc99e Initial load
duke
parents:
diff changeset
522 // lazily create log file (at startup, LogVMOutput is false even
a61af66fc99e Initial load
duke
parents:
diff changeset
523 // if +LogVMOutput is used, because the flags haven't been parsed yet)
a61af66fc99e Initial load
duke
parents:
diff changeset
524 // For safer printing during fatal error handling, do not init logfile
a61af66fc99e Initial load
duke
parents:
diff changeset
525 // if a VM error has been reported.
a61af66fc99e Initial load
duke
parents:
diff changeset
526 if (!_inited && !is_error_reported()) init();
a61af66fc99e Initial load
duke
parents:
diff changeset
527 return _log_file != NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
528 }
a61af66fc99e Initial load
duke
parents:
diff changeset
529
1353
a2ea687fdc7c 6938627: Make temporary directory use property java.io.tmpdir when specified
coleenp
parents: 579
diff changeset
530 static const char* make_log_name(const char* log_name, const char* force_directory) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
531 const char* basename = log_name;
a61af66fc99e Initial load
duke
parents:
diff changeset
532 char file_sep = os::file_separator()[0];
a61af66fc99e Initial load
duke
parents:
diff changeset
533 const char* cp;
a61af66fc99e Initial load
duke
parents:
diff changeset
534 for (cp = log_name; *cp != '\0'; cp++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
535 if (*cp == '/' || *cp == file_sep) {
a61af66fc99e Initial load
duke
parents:
diff changeset
536 basename = cp+1;
a61af66fc99e Initial load
duke
parents:
diff changeset
537 }
a61af66fc99e Initial load
duke
parents:
diff changeset
538 }
a61af66fc99e Initial load
duke
parents:
diff changeset
539 const char* nametail = log_name;
a61af66fc99e Initial load
duke
parents:
diff changeset
540
1353
a2ea687fdc7c 6938627: Make temporary directory use property java.io.tmpdir when specified
coleenp
parents: 579
diff changeset
541 // Compute buffer length
a2ea687fdc7c 6938627: Make temporary directory use property java.io.tmpdir when specified
coleenp
parents: 579
diff changeset
542 size_t buffer_length;
a2ea687fdc7c 6938627: Make temporary directory use property java.io.tmpdir when specified
coleenp
parents: 579
diff changeset
543 if (force_directory != NULL) {
a2ea687fdc7c 6938627: Make temporary directory use property java.io.tmpdir when specified
coleenp
parents: 579
diff changeset
544 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
545 strlen(basename) + 1;
a2ea687fdc7c 6938627: Make temporary directory use property java.io.tmpdir when specified
coleenp
parents: 579
diff changeset
546 } else {
a2ea687fdc7c 6938627: Make temporary directory use property java.io.tmpdir when specified
coleenp
parents: 579
diff changeset
547 buffer_length = strlen(log_name) + 1;
a2ea687fdc7c 6938627: Make temporary directory use property java.io.tmpdir when specified
coleenp
parents: 579
diff changeset
548 }
a2ea687fdc7c 6938627: Make temporary directory use property java.io.tmpdir when specified
coleenp
parents: 579
diff changeset
549
a2ea687fdc7c 6938627: Make temporary directory use property java.io.tmpdir when specified
coleenp
parents: 579
diff changeset
550 const char* star = strchr(basename, '*');
a2ea687fdc7c 6938627: Make temporary directory use property java.io.tmpdir when specified
coleenp
parents: 579
diff changeset
551 int star_pos = (star == NULL) ? -1 : (star - nametail);
2400
29524004ce17 7022204: LogFile wildcarding should use %p instead of star
never
parents: 2263
diff changeset
552 int skip = 1;
29524004ce17 7022204: LogFile wildcarding should use %p instead of star
never
parents: 2263
diff changeset
553 if (star == NULL) {
29524004ce17 7022204: LogFile wildcarding should use %p instead of star
never
parents: 2263
diff changeset
554 // Try %p
29524004ce17 7022204: LogFile wildcarding should use %p instead of star
never
parents: 2263
diff changeset
555 star = strstr(basename, "%p");
29524004ce17 7022204: LogFile wildcarding should use %p instead of star
never
parents: 2263
diff changeset
556 if (star != NULL) {
29524004ce17 7022204: LogFile wildcarding should use %p instead of star
never
parents: 2263
diff changeset
557 skip = 2;
29524004ce17 7022204: LogFile wildcarding should use %p instead of star
never
parents: 2263
diff changeset
558 }
29524004ce17 7022204: LogFile wildcarding should use %p instead of star
never
parents: 2263
diff changeset
559 }
29524004ce17 7022204: LogFile wildcarding should use %p instead of star
never
parents: 2263
diff changeset
560 star_pos = (star == NULL) ? -1 : (star - nametail);
1353
a2ea687fdc7c 6938627: Make temporary directory use property java.io.tmpdir when specified
coleenp
parents: 579
diff changeset
561
a2ea687fdc7c 6938627: Make temporary directory use property java.io.tmpdir when specified
coleenp
parents: 579
diff changeset
562 char pid[32];
a2ea687fdc7c 6938627: Make temporary directory use property java.io.tmpdir when specified
coleenp
parents: 579
diff changeset
563 if (star_pos >= 0) {
a2ea687fdc7c 6938627: Make temporary directory use property java.io.tmpdir when specified
coleenp
parents: 579
diff changeset
564 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
565 buffer_length += strlen(pid);
a2ea687fdc7c 6938627: Make temporary directory use property java.io.tmpdir when specified
coleenp
parents: 579
diff changeset
566 }
a2ea687fdc7c 6938627: Make temporary directory use property java.io.tmpdir when specified
coleenp
parents: 579
diff changeset
567
a2ea687fdc7c 6938627: Make temporary directory use property java.io.tmpdir when specified
coleenp
parents: 579
diff changeset
568 // Create big enough buffer.
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 4717
diff changeset
569 char *buf = NEW_C_HEAP_ARRAY(char, buffer_length, mtInternal);
1353
a2ea687fdc7c 6938627: Make temporary directory use property java.io.tmpdir when specified
coleenp
parents: 579
diff changeset
570
0
a61af66fc99e Initial load
duke
parents:
diff changeset
571 strcpy(buf, "");
a61af66fc99e Initial load
duke
parents:
diff changeset
572 if (force_directory != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
573 strcat(buf, force_directory);
a61af66fc99e Initial load
duke
parents:
diff changeset
574 strcat(buf, os::file_separator());
a61af66fc99e Initial load
duke
parents:
diff changeset
575 nametail = basename; // completely skip directory prefix
a61af66fc99e Initial load
duke
parents:
diff changeset
576 }
a61af66fc99e Initial load
duke
parents:
diff changeset
577
a61af66fc99e Initial load
duke
parents:
diff changeset
578 if (star_pos >= 0) {
2400
29524004ce17 7022204: LogFile wildcarding should use %p instead of star
never
parents: 2263
diff changeset
579 // convert foo*bar.log or foo%pbar.log to foo123bar.log
0
a61af66fc99e Initial load
duke
parents:
diff changeset
580 int buf_pos = (int) strlen(buf);
a61af66fc99e Initial load
duke
parents:
diff changeset
581 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
582 strcpy(&buf[buf_pos + star_pos], pid);
2400
29524004ce17 7022204: LogFile wildcarding should use %p instead of star
never
parents: 2263
diff changeset
583 nametail += star_pos + skip; // skip prefix and pid format
0
a61af66fc99e Initial load
duke
parents:
diff changeset
584 }
a61af66fc99e Initial load
duke
parents:
diff changeset
585
a61af66fc99e Initial load
duke
parents:
diff changeset
586 strcat(buf, nametail); // append rest of name, or all of name
a61af66fc99e Initial load
duke
parents:
diff changeset
587 return buf;
a61af66fc99e Initial load
duke
parents:
diff changeset
588 }
a61af66fc99e Initial load
duke
parents:
diff changeset
589
a61af66fc99e Initial load
duke
parents:
diff changeset
590 void defaultStream::init_log() {
a61af66fc99e Initial load
duke
parents:
diff changeset
591 // %%% Need a MutexLocker?
a61af66fc99e Initial load
duke
parents:
diff changeset
592 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
593 const char* try_name = make_log_name(log_name, NULL);
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 4717
diff changeset
594 fileStream* file = new(ResourceObj::C_HEAP, mtInternal) fileStream(try_name);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
595 if (!file->is_open()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
596 // Try again to open the file.
a61af66fc99e Initial load
duke
parents:
diff changeset
597 char warnbuf[O_BUFLEN*2];
1353
a2ea687fdc7c 6938627: Make temporary directory use property java.io.tmpdir when specified
coleenp
parents: 579
diff changeset
598 jio_snprintf(warnbuf, sizeof(warnbuf),
a2ea687fdc7c 6938627: Make temporary directory use property java.io.tmpdir when specified
coleenp
parents: 579
diff changeset
599 "Warning: Cannot open log file: %s\n", try_name);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
600 // Note: This feature is for maintainer use only. No need for L10N.
a61af66fc99e Initial load
duke
parents:
diff changeset
601 jio_print(warnbuf);
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 4717
diff changeset
602 FREE_C_HEAP_ARRAY(char, try_name, mtInternal);
2400
29524004ce17 7022204: LogFile wildcarding should use %p instead of star
never
parents: 2263
diff changeset
603 try_name = make_log_name("hs_pid%p.log", os::get_temp_directory());
1353
a2ea687fdc7c 6938627: Make temporary directory use property java.io.tmpdir when specified
coleenp
parents: 579
diff changeset
604 jio_snprintf(warnbuf, sizeof(warnbuf),
a2ea687fdc7c 6938627: Make temporary directory use property java.io.tmpdir when specified
coleenp
parents: 579
diff changeset
605 "Warning: Forcing option -XX:LogFile=%s\n", try_name);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
606 jio_print(warnbuf);
a61af66fc99e Initial load
duke
parents:
diff changeset
607 delete file;
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 4717
diff changeset
608 file = new(ResourceObj::C_HEAP, mtInternal) fileStream(try_name);
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 4717
diff changeset
609 FREE_C_HEAP_ARRAY(char, try_name, mtInternal);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
610 }
a61af66fc99e Initial load
duke
parents:
diff changeset
611 if (file->is_open()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
612 _log_file = file;
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 4717
diff changeset
613 xmlStream* xs = new(ResourceObj::C_HEAP, mtInternal) xmlStream(file);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
614 _outer_xmlStream = xs;
a61af66fc99e Initial load
duke
parents:
diff changeset
615 if (this == tty) xtty = xs;
a61af66fc99e Initial load
duke
parents:
diff changeset
616 // Write XML header.
a61af66fc99e Initial load
duke
parents:
diff changeset
617 xs->print_cr("<?xml version='1.0' encoding='UTF-8'?>");
a61af66fc99e Initial load
duke
parents:
diff changeset
618 // (For now, don't bother to issue a DTD for this private format.)
a61af66fc99e Initial load
duke
parents:
diff changeset
619 jlong time_ms = os::javaTimeMillis() - tty->time_stamp().milliseconds();
a61af66fc99e Initial load
duke
parents:
diff changeset
620 // %%% Should be: jlong time_ms = os::start_time_milliseconds(), if
a61af66fc99e Initial load
duke
parents:
diff changeset
621 // we ever get round to introduce that method on the os class
a61af66fc99e Initial load
duke
parents:
diff changeset
622 xs->head("hotspot_log version='%d %d'"
a61af66fc99e Initial load
duke
parents:
diff changeset
623 " process='%d' time_ms='"INT64_FORMAT"'",
a61af66fc99e Initial load
duke
parents:
diff changeset
624 LOG_MAJOR_VERSION, LOG_MINOR_VERSION,
a61af66fc99e Initial load
duke
parents:
diff changeset
625 os::current_process_id(), time_ms);
a61af66fc99e Initial load
duke
parents:
diff changeset
626 // Write VM version header immediately.
a61af66fc99e Initial load
duke
parents:
diff changeset
627 xs->head("vm_version");
a61af66fc99e Initial load
duke
parents:
diff changeset
628 xs->head("name"); xs->text("%s", VM_Version::vm_name()); xs->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
629 xs->tail("name");
a61af66fc99e Initial load
duke
parents:
diff changeset
630 xs->head("release"); xs->text("%s", VM_Version::vm_release()); xs->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
631 xs->tail("release");
a61af66fc99e Initial load
duke
parents:
diff changeset
632 xs->head("info"); xs->text("%s", VM_Version::internal_vm_info_string()); xs->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
633 xs->tail("info");
a61af66fc99e Initial load
duke
parents:
diff changeset
634 xs->tail("vm_version");
a61af66fc99e Initial load
duke
parents:
diff changeset
635 // Record information about the command-line invocation.
a61af66fc99e Initial load
duke
parents:
diff changeset
636 xs->head("vm_arguments"); // Cf. Arguments::print_on()
a61af66fc99e Initial load
duke
parents:
diff changeset
637 if (Arguments::num_jvm_flags() > 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
638 xs->head("flags");
a61af66fc99e Initial load
duke
parents:
diff changeset
639 Arguments::print_jvm_flags_on(xs->text());
a61af66fc99e Initial load
duke
parents:
diff changeset
640 xs->tail("flags");
a61af66fc99e Initial load
duke
parents:
diff changeset
641 }
a61af66fc99e Initial load
duke
parents:
diff changeset
642 if (Arguments::num_jvm_args() > 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
643 xs->head("args");
a61af66fc99e Initial load
duke
parents:
diff changeset
644 Arguments::print_jvm_args_on(xs->text());
a61af66fc99e Initial load
duke
parents:
diff changeset
645 xs->tail("args");
a61af66fc99e Initial load
duke
parents:
diff changeset
646 }
a61af66fc99e Initial load
duke
parents:
diff changeset
647 if (Arguments::java_command() != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
648 xs->head("command"); xs->text()->print_cr("%s", Arguments::java_command());
a61af66fc99e Initial load
duke
parents:
diff changeset
649 xs->tail("command");
a61af66fc99e Initial load
duke
parents:
diff changeset
650 }
a61af66fc99e Initial load
duke
parents:
diff changeset
651 if (Arguments::sun_java_launcher() != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
652 xs->head("launcher"); xs->text()->print_cr("%s", Arguments::sun_java_launcher());
a61af66fc99e Initial load
duke
parents:
diff changeset
653 xs->tail("launcher");
a61af66fc99e Initial load
duke
parents:
diff changeset
654 }
a61af66fc99e Initial load
duke
parents:
diff changeset
655 if (Arguments::system_properties() != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
656 xs->head("properties");
a61af66fc99e Initial load
duke
parents:
diff changeset
657 // Print it as a java-style property list.
a61af66fc99e Initial load
duke
parents:
diff changeset
658 // System properties don't generally contain newlines, so don't bother with unparsing.
a61af66fc99e Initial load
duke
parents:
diff changeset
659 for (SystemProperty* p = Arguments::system_properties(); p != NULL; p = p->next()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
660 xs->text()->print_cr("%s=%s", p->key(), p->value());
a61af66fc99e Initial load
duke
parents:
diff changeset
661 }
a61af66fc99e Initial load
duke
parents:
diff changeset
662 xs->tail("properties");
a61af66fc99e Initial load
duke
parents:
diff changeset
663 }
a61af66fc99e Initial load
duke
parents:
diff changeset
664 xs->tail("vm_arguments");
a61af66fc99e Initial load
duke
parents:
diff changeset
665 // tty output per se is grouped under the <tty>...</tty> element.
a61af66fc99e Initial load
duke
parents:
diff changeset
666 xs->head("tty");
a61af66fc99e Initial load
duke
parents:
diff changeset
667 // All further non-markup text gets copied to the tty:
a61af66fc99e Initial load
duke
parents:
diff changeset
668 xs->_text = this; // requires friend declaration!
a61af66fc99e Initial load
duke
parents:
diff changeset
669 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
670 delete(file);
a61af66fc99e Initial load
duke
parents:
diff changeset
671 // and leave xtty as NULL
a61af66fc99e Initial load
duke
parents:
diff changeset
672 LogVMOutput = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
673 DisplayVMOutput = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
674 LogCompilation = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
675 }
a61af66fc99e Initial load
duke
parents:
diff changeset
676 }
a61af66fc99e Initial load
duke
parents:
diff changeset
677
a61af66fc99e Initial load
duke
parents:
diff changeset
678 // finish_log() is called during normal VM shutdown. finish_log_on_error() is
a61af66fc99e Initial load
duke
parents:
diff changeset
679 // called by ostream_abort() after a fatal error.
a61af66fc99e Initial load
duke
parents:
diff changeset
680 //
a61af66fc99e Initial load
duke
parents:
diff changeset
681 void defaultStream::finish_log() {
a61af66fc99e Initial load
duke
parents:
diff changeset
682 xmlStream* xs = _outer_xmlStream;
a61af66fc99e Initial load
duke
parents:
diff changeset
683 xs->done("tty");
a61af66fc99e Initial load
duke
parents:
diff changeset
684
a61af66fc99e Initial load
duke
parents:
diff changeset
685 // Other log forks are appended here, at the End of Time:
a61af66fc99e Initial load
duke
parents:
diff changeset
686 CompileLog::finish_log(xs->out()); // write compile logging, if any, now
a61af66fc99e Initial load
duke
parents:
diff changeset
687
a61af66fc99e Initial load
duke
parents:
diff changeset
688 xs->done("hotspot_log");
a61af66fc99e Initial load
duke
parents:
diff changeset
689 xs->flush();
a61af66fc99e Initial load
duke
parents:
diff changeset
690
a61af66fc99e Initial load
duke
parents:
diff changeset
691 fileStream* file = _log_file;
a61af66fc99e Initial load
duke
parents:
diff changeset
692 _log_file = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
693
a61af66fc99e Initial load
duke
parents:
diff changeset
694 delete _outer_xmlStream;
a61af66fc99e Initial load
duke
parents:
diff changeset
695 _outer_xmlStream = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
696
a61af66fc99e Initial load
duke
parents:
diff changeset
697 file->flush();
a61af66fc99e Initial load
duke
parents:
diff changeset
698 delete file;
a61af66fc99e Initial load
duke
parents:
diff changeset
699 }
a61af66fc99e Initial load
duke
parents:
diff changeset
700
a61af66fc99e Initial load
duke
parents:
diff changeset
701 void defaultStream::finish_log_on_error(char *buf, int buflen) {
a61af66fc99e Initial load
duke
parents:
diff changeset
702 xmlStream* xs = _outer_xmlStream;
a61af66fc99e Initial load
duke
parents:
diff changeset
703
a61af66fc99e Initial load
duke
parents:
diff changeset
704 if (xs && xs->out()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
705
a61af66fc99e Initial load
duke
parents:
diff changeset
706 xs->done_raw("tty");
a61af66fc99e Initial load
duke
parents:
diff changeset
707
a61af66fc99e Initial load
duke
parents:
diff changeset
708 // Other log forks are appended here, at the End of Time:
a61af66fc99e Initial load
duke
parents:
diff changeset
709 CompileLog::finish_log_on_error(xs->out(), buf, buflen); // write compile logging, if any, now
a61af66fc99e Initial load
duke
parents:
diff changeset
710
a61af66fc99e Initial load
duke
parents:
diff changeset
711 xs->done_raw("hotspot_log");
a61af66fc99e Initial load
duke
parents:
diff changeset
712 xs->flush();
a61af66fc99e Initial load
duke
parents:
diff changeset
713
a61af66fc99e Initial load
duke
parents:
diff changeset
714 fileStream* file = _log_file;
a61af66fc99e Initial load
duke
parents:
diff changeset
715 _log_file = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
716 _outer_xmlStream = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
717
a61af66fc99e Initial load
duke
parents:
diff changeset
718 if (file) {
a61af66fc99e Initial load
duke
parents:
diff changeset
719 file->flush();
a61af66fc99e Initial load
duke
parents:
diff changeset
720
a61af66fc99e Initial load
duke
parents:
diff changeset
721 // Can't delete or close the file because delete and fclose aren't
a61af66fc99e Initial load
duke
parents:
diff changeset
722 // async-safe. We are about to die, so leave it to the kernel.
a61af66fc99e Initial load
duke
parents:
diff changeset
723 // delete file;
a61af66fc99e Initial load
duke
parents:
diff changeset
724 }
a61af66fc99e Initial load
duke
parents:
diff changeset
725 }
a61af66fc99e Initial load
duke
parents:
diff changeset
726 }
a61af66fc99e Initial load
duke
parents:
diff changeset
727
a61af66fc99e Initial load
duke
parents:
diff changeset
728 intx defaultStream::hold(intx writer_id) {
a61af66fc99e Initial load
duke
parents:
diff changeset
729 bool has_log = has_log_file(); // check before locking
a61af66fc99e Initial load
duke
parents:
diff changeset
730 if (// impossible, but who knows?
a61af66fc99e Initial load
duke
parents:
diff changeset
731 writer_id == NO_WRITER ||
a61af66fc99e Initial load
duke
parents:
diff changeset
732
a61af66fc99e Initial load
duke
parents:
diff changeset
733 // bootstrap problem
a61af66fc99e Initial load
duke
parents:
diff changeset
734 tty_lock == NULL ||
a61af66fc99e Initial load
duke
parents:
diff changeset
735
a61af66fc99e Initial load
duke
parents:
diff changeset
736 // can't grab a lock or call Thread::current() if TLS isn't initialized
a61af66fc99e Initial load
duke
parents:
diff changeset
737 ThreadLocalStorage::thread() == NULL ||
a61af66fc99e Initial load
duke
parents:
diff changeset
738
a61af66fc99e Initial load
duke
parents:
diff changeset
739 // developer hook
a61af66fc99e Initial load
duke
parents:
diff changeset
740 !SerializeVMOutput ||
a61af66fc99e Initial load
duke
parents:
diff changeset
741
a61af66fc99e Initial load
duke
parents:
diff changeset
742 // VM already unhealthy
a61af66fc99e Initial load
duke
parents:
diff changeset
743 is_error_reported() ||
a61af66fc99e Initial load
duke
parents:
diff changeset
744
a61af66fc99e Initial load
duke
parents:
diff changeset
745 // safepoint == global lock (for VM only)
a61af66fc99e Initial load
duke
parents:
diff changeset
746 (SafepointSynchronize::is_synchronizing() &&
a61af66fc99e Initial load
duke
parents:
diff changeset
747 Thread::current()->is_VM_thread())
a61af66fc99e Initial load
duke
parents:
diff changeset
748 ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
749 // do not attempt to lock unless we know the thread and the VM is healthy
a61af66fc99e Initial load
duke
parents:
diff changeset
750 return NO_WRITER;
a61af66fc99e Initial load
duke
parents:
diff changeset
751 }
a61af66fc99e Initial load
duke
parents:
diff changeset
752 if (_writer == writer_id) {
a61af66fc99e Initial load
duke
parents:
diff changeset
753 // already held, no need to re-grab the lock
a61af66fc99e Initial load
duke
parents:
diff changeset
754 return NO_WRITER;
a61af66fc99e Initial load
duke
parents:
diff changeset
755 }
a61af66fc99e Initial load
duke
parents:
diff changeset
756 tty_lock->lock_without_safepoint_check();
a61af66fc99e Initial load
duke
parents:
diff changeset
757 // got the lock
a61af66fc99e Initial load
duke
parents:
diff changeset
758 if (writer_id != _last_writer) {
a61af66fc99e Initial load
duke
parents:
diff changeset
759 if (has_log) {
a61af66fc99e Initial load
duke
parents:
diff changeset
760 _log_file->bol();
a61af66fc99e Initial load
duke
parents:
diff changeset
761 // output a hint where this output is coming from:
a61af66fc99e Initial load
duke
parents:
diff changeset
762 _log_file->print_cr("<writer thread='"INTX_FORMAT"'/>", writer_id);
a61af66fc99e Initial load
duke
parents:
diff changeset
763 }
a61af66fc99e Initial load
duke
parents:
diff changeset
764 _last_writer = writer_id;
a61af66fc99e Initial load
duke
parents:
diff changeset
765 }
a61af66fc99e Initial load
duke
parents:
diff changeset
766 _writer = writer_id;
a61af66fc99e Initial load
duke
parents:
diff changeset
767 return writer_id;
a61af66fc99e Initial load
duke
parents:
diff changeset
768 }
a61af66fc99e Initial load
duke
parents:
diff changeset
769
a61af66fc99e Initial load
duke
parents:
diff changeset
770 void defaultStream::release(intx holder) {
a61af66fc99e Initial load
duke
parents:
diff changeset
771 if (holder == NO_WRITER) {
a61af66fc99e Initial load
duke
parents:
diff changeset
772 // nothing to release: either a recursive lock, or we scribbled (too bad)
a61af66fc99e Initial load
duke
parents:
diff changeset
773 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
774 }
a61af66fc99e Initial load
duke
parents:
diff changeset
775 if (_writer != holder) {
a61af66fc99e Initial load
duke
parents:
diff changeset
776 return; // already unlocked, perhaps via break_tty_lock_for_safepoint
a61af66fc99e Initial load
duke
parents:
diff changeset
777 }
a61af66fc99e Initial load
duke
parents:
diff changeset
778 _writer = NO_WRITER;
a61af66fc99e Initial load
duke
parents:
diff changeset
779 tty_lock->unlock();
a61af66fc99e Initial load
duke
parents:
diff changeset
780 }
a61af66fc99e Initial load
duke
parents:
diff changeset
781
a61af66fc99e Initial load
duke
parents:
diff changeset
782
a61af66fc99e Initial load
duke
parents:
diff changeset
783 // Yuck: jio_print does not accept char*/len.
a61af66fc99e Initial load
duke
parents:
diff changeset
784 static void call_jio_print(const char* s, size_t len) {
a61af66fc99e Initial load
duke
parents:
diff changeset
785 char buffer[O_BUFLEN+100];
a61af66fc99e Initial load
duke
parents:
diff changeset
786 if (len > sizeof(buffer)-1) {
a61af66fc99e Initial load
duke
parents:
diff changeset
787 warning("increase O_BUFLEN in ostream.cpp -- output truncated");
a61af66fc99e Initial load
duke
parents:
diff changeset
788 len = sizeof(buffer)-1;
a61af66fc99e Initial load
duke
parents:
diff changeset
789 }
a61af66fc99e Initial load
duke
parents:
diff changeset
790 strncpy(buffer, s, len);
a61af66fc99e Initial load
duke
parents:
diff changeset
791 buffer[len] = '\0';
a61af66fc99e Initial load
duke
parents:
diff changeset
792 jio_print(buffer);
a61af66fc99e Initial load
duke
parents:
diff changeset
793 }
a61af66fc99e Initial load
duke
parents:
diff changeset
794
a61af66fc99e Initial load
duke
parents:
diff changeset
795
a61af66fc99e Initial load
duke
parents:
diff changeset
796 void defaultStream::write(const char* s, size_t len) {
a61af66fc99e Initial load
duke
parents:
diff changeset
797 intx thread_id = os::current_thread_id();
a61af66fc99e Initial load
duke
parents:
diff changeset
798 intx holder = hold(thread_id);
a61af66fc99e Initial load
duke
parents:
diff changeset
799
a61af66fc99e Initial load
duke
parents:
diff changeset
800 if (DisplayVMOutput &&
a61af66fc99e Initial load
duke
parents:
diff changeset
801 (_outer_xmlStream == NULL || !_outer_xmlStream->inside_attrs())) {
a61af66fc99e Initial load
duke
parents:
diff changeset
802 // print to output stream. It can be redirected by a vfprintf hook
a61af66fc99e Initial load
duke
parents:
diff changeset
803 if (s[len] == '\0') {
a61af66fc99e Initial load
duke
parents:
diff changeset
804 jio_print(s);
a61af66fc99e Initial load
duke
parents:
diff changeset
805 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
806 call_jio_print(s, len);
a61af66fc99e Initial load
duke
parents:
diff changeset
807 }
a61af66fc99e Initial load
duke
parents:
diff changeset
808 }
a61af66fc99e Initial load
duke
parents:
diff changeset
809
a61af66fc99e Initial load
duke
parents:
diff changeset
810 // print to log file
a61af66fc99e Initial load
duke
parents:
diff changeset
811 if (has_log_file()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
812 int nl0 = _newlines;
a61af66fc99e Initial load
duke
parents:
diff changeset
813 xmlTextStream::write(s, len);
a61af66fc99e Initial load
duke
parents:
diff changeset
814 // flush the log file too, if there were any newlines
a61af66fc99e Initial load
duke
parents:
diff changeset
815 if (nl0 != _newlines){
a61af66fc99e Initial load
duke
parents:
diff changeset
816 flush();
a61af66fc99e Initial load
duke
parents:
diff changeset
817 }
a61af66fc99e Initial load
duke
parents:
diff changeset
818 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
819 update_position(s, len);
a61af66fc99e Initial load
duke
parents:
diff changeset
820 }
a61af66fc99e Initial load
duke
parents:
diff changeset
821
a61af66fc99e Initial load
duke
parents:
diff changeset
822 release(holder);
a61af66fc99e Initial load
duke
parents:
diff changeset
823 }
a61af66fc99e Initial load
duke
parents:
diff changeset
824
a61af66fc99e Initial load
duke
parents:
diff changeset
825 intx ttyLocker::hold_tty() {
a61af66fc99e Initial load
duke
parents:
diff changeset
826 if (defaultStream::instance == NULL) return defaultStream::NO_WRITER;
a61af66fc99e Initial load
duke
parents:
diff changeset
827 intx thread_id = os::current_thread_id();
a61af66fc99e Initial load
duke
parents:
diff changeset
828 return defaultStream::instance->hold(thread_id);
a61af66fc99e Initial load
duke
parents:
diff changeset
829 }
a61af66fc99e Initial load
duke
parents:
diff changeset
830
a61af66fc99e Initial load
duke
parents:
diff changeset
831 void ttyLocker::release_tty(intx holder) {
a61af66fc99e Initial load
duke
parents:
diff changeset
832 if (holder == defaultStream::NO_WRITER) return;
a61af66fc99e Initial load
duke
parents:
diff changeset
833 defaultStream::instance->release(holder);
a61af66fc99e Initial load
duke
parents:
diff changeset
834 }
a61af66fc99e Initial load
duke
parents:
diff changeset
835
2263
5841dc1964f0 7021531: lock ordering problems after fix for 6354181
never
parents: 2199
diff changeset
836 bool ttyLocker::release_tty_if_locked() {
5841dc1964f0 7021531: lock ordering problems after fix for 6354181
never
parents: 2199
diff changeset
837 intx thread_id = os::current_thread_id();
5841dc1964f0 7021531: lock ordering problems after fix for 6354181
never
parents: 2199
diff changeset
838 if (defaultStream::instance->writer() == thread_id) {
5841dc1964f0 7021531: lock ordering problems after fix for 6354181
never
parents: 2199
diff changeset
839 // release the lock and return true so callers know if was
5841dc1964f0 7021531: lock ordering problems after fix for 6354181
never
parents: 2199
diff changeset
840 // previously held.
5841dc1964f0 7021531: lock ordering problems after fix for 6354181
never
parents: 2199
diff changeset
841 release_tty(thread_id);
5841dc1964f0 7021531: lock ordering problems after fix for 6354181
never
parents: 2199
diff changeset
842 return true;
5841dc1964f0 7021531: lock ordering problems after fix for 6354181
never
parents: 2199
diff changeset
843 }
5841dc1964f0 7021531: lock ordering problems after fix for 6354181
never
parents: 2199
diff changeset
844 return false;
5841dc1964f0 7021531: lock ordering problems after fix for 6354181
never
parents: 2199
diff changeset
845 }
5841dc1964f0 7021531: lock ordering problems after fix for 6354181
never
parents: 2199
diff changeset
846
0
a61af66fc99e Initial load
duke
parents:
diff changeset
847 void ttyLocker::break_tty_lock_for_safepoint(intx holder) {
a61af66fc99e Initial load
duke
parents:
diff changeset
848 if (defaultStream::instance != NULL &&
a61af66fc99e Initial load
duke
parents:
diff changeset
849 defaultStream::instance->writer() == holder) {
a61af66fc99e Initial load
duke
parents:
diff changeset
850 if (xtty != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
851 xtty->print_cr("<!-- safepoint while printing -->");
a61af66fc99e Initial load
duke
parents:
diff changeset
852 }
a61af66fc99e Initial load
duke
parents:
diff changeset
853 defaultStream::instance->release(holder);
a61af66fc99e Initial load
duke
parents:
diff changeset
854 }
a61af66fc99e Initial load
duke
parents:
diff changeset
855 // (else there was no lock to break)
a61af66fc99e Initial load
duke
parents:
diff changeset
856 }
a61af66fc99e Initial load
duke
parents:
diff changeset
857
a61af66fc99e Initial load
duke
parents:
diff changeset
858 void ostream_init() {
a61af66fc99e Initial load
duke
parents:
diff changeset
859 if (defaultStream::instance == NULL) {
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 4717
diff changeset
860 defaultStream::instance = new(ResourceObj::C_HEAP, mtInternal) defaultStream();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
861 tty = defaultStream::instance;
a61af66fc99e Initial load
duke
parents:
diff changeset
862
a61af66fc99e Initial load
duke
parents:
diff changeset
863 // We want to ensure that time stamps in GC logs consider time 0
a61af66fc99e Initial load
duke
parents:
diff changeset
864 // the time when the JVM is initialized, not the first time we ask
a61af66fc99e Initial load
duke
parents:
diff changeset
865 // for a time stamp. So, here, we explicitly update the time stamp
a61af66fc99e Initial load
duke
parents:
diff changeset
866 // of tty.
a61af66fc99e Initial load
duke
parents:
diff changeset
867 tty->time_stamp().update_to(1);
a61af66fc99e Initial load
duke
parents:
diff changeset
868 }
a61af66fc99e Initial load
duke
parents:
diff changeset
869 }
a61af66fc99e Initial load
duke
parents:
diff changeset
870
a61af66fc99e Initial load
duke
parents:
diff changeset
871 void ostream_init_log() {
a61af66fc99e Initial load
duke
parents:
diff changeset
872 // For -Xloggc:<file> option - called in runtime/thread.cpp
a61af66fc99e Initial load
duke
parents:
diff changeset
873 // Note : this must be called AFTER ostream_init()
a61af66fc99e Initial load
duke
parents:
diff changeset
874
a61af66fc99e Initial load
duke
parents:
diff changeset
875 gclog_or_tty = tty; // default to tty
a61af66fc99e Initial load
duke
parents:
diff changeset
876 if (Arguments::gc_log_filename() != NULL) {
3767
2a241e764894 6941923: RFE: Handling large log files produced by long running Java Applications
minqi
parents: 2420
diff changeset
877 fileStream * gclog = UseGCLogFileRotation ?
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 4717
diff changeset
878 new(ResourceObj::C_HEAP, mtInternal)
3767
2a241e764894 6941923: RFE: Handling large log files produced by long running Java Applications
minqi
parents: 2420
diff changeset
879 rotatingFileStream(Arguments::gc_log_filename()) :
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 4717
diff changeset
880 new(ResourceObj::C_HEAP, mtInternal)
3767
2a241e764894 6941923: RFE: Handling large log files produced by long running Java Applications
minqi
parents: 2420
diff changeset
881 fileStream(Arguments::gc_log_filename());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
882 if (gclog->is_open()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
883 // now we update the time stamp of the GC log to be synced up
a61af66fc99e Initial load
duke
parents:
diff changeset
884 // with tty.
a61af66fc99e Initial load
duke
parents:
diff changeset
885 gclog->time_stamp().update_to(tty->time_stamp().ticks());
a61af66fc99e Initial load
duke
parents:
diff changeset
886 }
3767
2a241e764894 6941923: RFE: Handling large log files produced by long running Java Applications
minqi
parents: 2420
diff changeset
887 gclog_or_tty = gclog;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
888 }
a61af66fc99e Initial load
duke
parents:
diff changeset
889
a61af66fc99e Initial load
duke
parents:
diff changeset
890 // If we haven't lazily initialized the logfile yet, do it now,
a61af66fc99e Initial load
duke
parents:
diff changeset
891 // to avoid the possibility of lazy initialization during a VM
a61af66fc99e Initial load
duke
parents:
diff changeset
892 // crash, which can affect the stability of the fatal error handler.
a61af66fc99e Initial load
duke
parents:
diff changeset
893 defaultStream::instance->has_log_file();
a61af66fc99e Initial load
duke
parents:
diff changeset
894 }
a61af66fc99e Initial load
duke
parents:
diff changeset
895
a61af66fc99e Initial load
duke
parents:
diff changeset
896 // ostream_exit() is called during normal VM exit to finish log files, flush
a61af66fc99e Initial load
duke
parents:
diff changeset
897 // output and free resource.
a61af66fc99e Initial load
duke
parents:
diff changeset
898 void ostream_exit() {
a61af66fc99e Initial load
duke
parents:
diff changeset
899 static bool ostream_exit_called = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
900 if (ostream_exit_called) return;
a61af66fc99e Initial load
duke
parents:
diff changeset
901 ostream_exit_called = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
902 if (gclog_or_tty != tty) {
a61af66fc99e Initial load
duke
parents:
diff changeset
903 delete gclog_or_tty;
a61af66fc99e Initial load
duke
parents:
diff changeset
904 }
a61af66fc99e Initial load
duke
parents:
diff changeset
905 {
a61af66fc99e Initial load
duke
parents:
diff changeset
906 // we temporaly disable PrintMallocFree here
a61af66fc99e Initial load
duke
parents:
diff changeset
907 // as otherwise it'll lead to using of almost deleted
a61af66fc99e Initial load
duke
parents:
diff changeset
908 // tty or defaultStream::instance in logging facility
a61af66fc99e Initial load
duke
parents:
diff changeset
909 // of HeapFree(), see 6391258
a61af66fc99e Initial load
duke
parents:
diff changeset
910 DEBUG_ONLY(FlagSetting fs(PrintMallocFree, false);)
a61af66fc99e Initial load
duke
parents:
diff changeset
911 if (tty != defaultStream::instance) {
a61af66fc99e Initial load
duke
parents:
diff changeset
912 delete tty;
a61af66fc99e Initial load
duke
parents:
diff changeset
913 }
a61af66fc99e Initial load
duke
parents:
diff changeset
914 if (defaultStream::instance != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
915 delete defaultStream::instance;
a61af66fc99e Initial load
duke
parents:
diff changeset
916 }
a61af66fc99e Initial load
duke
parents:
diff changeset
917 }
a61af66fc99e Initial load
duke
parents:
diff changeset
918 tty = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
919 xtty = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
920 gclog_or_tty = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
921 defaultStream::instance = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
922 }
a61af66fc99e Initial load
duke
parents:
diff changeset
923
a61af66fc99e Initial load
duke
parents:
diff changeset
924 // ostream_abort() is called by os::abort() when VM is about to die.
a61af66fc99e Initial load
duke
parents:
diff changeset
925 void ostream_abort() {
a61af66fc99e Initial load
duke
parents:
diff changeset
926 // Here we can't delete gclog_or_tty and tty, just flush their output
a61af66fc99e Initial load
duke
parents:
diff changeset
927 if (gclog_or_tty) gclog_or_tty->flush();
a61af66fc99e Initial load
duke
parents:
diff changeset
928 if (tty) tty->flush();
a61af66fc99e Initial load
duke
parents:
diff changeset
929
a61af66fc99e Initial load
duke
parents:
diff changeset
930 if (defaultStream::instance != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
931 static char buf[4096];
a61af66fc99e Initial load
duke
parents:
diff changeset
932 defaultStream::instance->finish_log_on_error(buf, sizeof(buf));
a61af66fc99e Initial load
duke
parents:
diff changeset
933 }
a61af66fc99e Initial load
duke
parents:
diff changeset
934 }
a61af66fc99e Initial load
duke
parents:
diff changeset
935
a61af66fc99e Initial load
duke
parents:
diff changeset
936 staticBufferStream::staticBufferStream(char* buffer, size_t buflen,
a61af66fc99e Initial load
duke
parents:
diff changeset
937 outputStream *outer_stream) {
a61af66fc99e Initial load
duke
parents:
diff changeset
938 _buffer = buffer;
a61af66fc99e Initial load
duke
parents:
diff changeset
939 _buflen = buflen;
a61af66fc99e Initial load
duke
parents:
diff changeset
940 _outer_stream = outer_stream;
2420
8010c8c623ac 7032849: 7022998 changes broke hs_err compile task print
kvn
parents: 2400
diff changeset
941 // compile task prints time stamp relative to VM start
8010c8c623ac 7032849: 7022998 changes broke hs_err compile task print
kvn
parents: 2400
diff changeset
942 _stamp.update_to(1);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
943 }
a61af66fc99e Initial load
duke
parents:
diff changeset
944
a61af66fc99e Initial load
duke
parents:
diff changeset
945 void staticBufferStream::write(const char* c, size_t len) {
a61af66fc99e Initial load
duke
parents:
diff changeset
946 _outer_stream->print_raw(c, (int)len);
a61af66fc99e Initial load
duke
parents:
diff changeset
947 }
a61af66fc99e Initial load
duke
parents:
diff changeset
948
a61af66fc99e Initial load
duke
parents:
diff changeset
949 void staticBufferStream::flush() {
a61af66fc99e Initial load
duke
parents:
diff changeset
950 _outer_stream->flush();
a61af66fc99e Initial load
duke
parents:
diff changeset
951 }
a61af66fc99e Initial load
duke
parents:
diff changeset
952
a61af66fc99e Initial load
duke
parents:
diff changeset
953 void staticBufferStream::print(const char* format, ...) {
a61af66fc99e Initial load
duke
parents:
diff changeset
954 va_list ap;
a61af66fc99e Initial load
duke
parents:
diff changeset
955 va_start(ap, format);
a61af66fc99e Initial load
duke
parents:
diff changeset
956 size_t len;
a61af66fc99e Initial load
duke
parents:
diff changeset
957 const char* str = do_vsnprintf(_buffer, _buflen, format, ap, false, len);
a61af66fc99e Initial load
duke
parents:
diff changeset
958 write(str, len);
a61af66fc99e Initial load
duke
parents:
diff changeset
959 va_end(ap);
a61af66fc99e Initial load
duke
parents:
diff changeset
960 }
a61af66fc99e Initial load
duke
parents:
diff changeset
961
a61af66fc99e Initial load
duke
parents:
diff changeset
962 void staticBufferStream::print_cr(const char* format, ...) {
a61af66fc99e Initial load
duke
parents:
diff changeset
963 va_list ap;
a61af66fc99e Initial load
duke
parents:
diff changeset
964 va_start(ap, format);
a61af66fc99e Initial load
duke
parents:
diff changeset
965 size_t len;
a61af66fc99e Initial load
duke
parents:
diff changeset
966 const char* str = do_vsnprintf(_buffer, _buflen, format, ap, true, len);
a61af66fc99e Initial load
duke
parents:
diff changeset
967 write(str, len);
a61af66fc99e Initial load
duke
parents:
diff changeset
968 va_end(ap);
a61af66fc99e Initial load
duke
parents:
diff changeset
969 }
a61af66fc99e Initial load
duke
parents:
diff changeset
970
a61af66fc99e Initial load
duke
parents:
diff changeset
971 void staticBufferStream::vprint(const char *format, va_list argptr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
972 size_t len;
a61af66fc99e Initial load
duke
parents:
diff changeset
973 const char* str = do_vsnprintf(_buffer, _buflen, format, argptr, false, len);
a61af66fc99e Initial load
duke
parents:
diff changeset
974 write(str, len);
a61af66fc99e Initial load
duke
parents:
diff changeset
975 }
a61af66fc99e Initial load
duke
parents:
diff changeset
976
a61af66fc99e Initial load
duke
parents:
diff changeset
977 void staticBufferStream::vprint_cr(const char* format, va_list argptr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
978 size_t len;
a61af66fc99e Initial load
duke
parents:
diff changeset
979 const char* str = do_vsnprintf(_buffer, _buflen, format, argptr, true, len);
a61af66fc99e Initial load
duke
parents:
diff changeset
980 write(str, len);
a61af66fc99e Initial load
duke
parents:
diff changeset
981 }
a61af66fc99e Initial load
duke
parents:
diff changeset
982
222
2a1a77d3458f 6718676: putback for 6604014 is incomplete
never
parents: 102
diff changeset
983 bufferedStream::bufferedStream(size_t initial_size, size_t bufmax) : outputStream() {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
984 buffer_length = initial_size;
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 4717
diff changeset
985 buffer = NEW_C_HEAP_ARRAY(char, buffer_length, mtInternal);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
986 buffer_pos = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
987 buffer_fixed = false;
222
2a1a77d3458f 6718676: putback for 6604014 is incomplete
never
parents: 102
diff changeset
988 buffer_max = bufmax;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
989 }
a61af66fc99e Initial load
duke
parents:
diff changeset
990
222
2a1a77d3458f 6718676: putback for 6604014 is incomplete
never
parents: 102
diff changeset
991 bufferedStream::bufferedStream(char* fixed_buffer, size_t fixed_buffer_size, size_t bufmax) : outputStream() {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
992 buffer_length = fixed_buffer_size;
a61af66fc99e Initial load
duke
parents:
diff changeset
993 buffer = fixed_buffer;
a61af66fc99e Initial load
duke
parents:
diff changeset
994 buffer_pos = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
995 buffer_fixed = true;
222
2a1a77d3458f 6718676: putback for 6604014 is incomplete
never
parents: 102
diff changeset
996 buffer_max = bufmax;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
997 }
a61af66fc99e Initial load
duke
parents:
diff changeset
998
a61af66fc99e Initial load
duke
parents:
diff changeset
999 void bufferedStream::write(const char* s, size_t len) {
222
2a1a77d3458f 6718676: putback for 6604014 is incomplete
never
parents: 102
diff changeset
1000
2a1a77d3458f 6718676: putback for 6604014 is incomplete
never
parents: 102
diff changeset
1001 if(buffer_pos + len > buffer_max) {
2a1a77d3458f 6718676: putback for 6604014 is incomplete
never
parents: 102
diff changeset
1002 flush();
2a1a77d3458f 6718676: putback for 6604014 is incomplete
never
parents: 102
diff changeset
1003 }
2a1a77d3458f 6718676: putback for 6604014 is incomplete
never
parents: 102
diff changeset
1004
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1005 size_t end = buffer_pos + len;
a61af66fc99e Initial load
duke
parents:
diff changeset
1006 if (end >= buffer_length) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1007 if (buffer_fixed) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1008 // if buffer cannot resize, silently truncate
a61af66fc99e Initial load
duke
parents:
diff changeset
1009 len = buffer_length - buffer_pos - 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
1010 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1011 // For small overruns, double the buffer. For larger ones,
a61af66fc99e Initial load
duke
parents:
diff changeset
1012 // increase to the requested size.
a61af66fc99e Initial load
duke
parents:
diff changeset
1013 if (end < buffer_length * 2) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1014 end = buffer_length * 2;
a61af66fc99e Initial load
duke
parents:
diff changeset
1015 }
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 4717
diff changeset
1016 buffer = REALLOC_C_HEAP_ARRAY(char, buffer, end, mtInternal);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1017 buffer_length = end;
a61af66fc99e Initial load
duke
parents:
diff changeset
1018 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1019 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1020 memcpy(buffer + buffer_pos, s, len);
a61af66fc99e Initial load
duke
parents:
diff changeset
1021 buffer_pos += len;
a61af66fc99e Initial load
duke
parents:
diff changeset
1022 update_position(s, len);
a61af66fc99e Initial load
duke
parents:
diff changeset
1023 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1024
a61af66fc99e Initial load
duke
parents:
diff changeset
1025 char* bufferedStream::as_string() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1026 char* copy = NEW_RESOURCE_ARRAY(char, buffer_pos+1);
a61af66fc99e Initial load
duke
parents:
diff changeset
1027 strncpy(copy, buffer, buffer_pos);
a61af66fc99e Initial load
duke
parents:
diff changeset
1028 copy[buffer_pos] = 0; // terminating null
a61af66fc99e Initial load
duke
parents:
diff changeset
1029 return copy;
a61af66fc99e Initial load
duke
parents:
diff changeset
1030 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1031
a61af66fc99e Initial load
duke
parents:
diff changeset
1032 bufferedStream::~bufferedStream() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1033 if (!buffer_fixed) {
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 4717
diff changeset
1034 FREE_C_HEAP_ARRAY(char, buffer, mtInternal);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1035 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1036 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1037
a61af66fc99e Initial load
duke
parents:
diff changeset
1038 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
1039
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents: 3767
diff changeset
1040 #if defined(SOLARIS) || defined(LINUX) || defined(_ALLBSD_SOURCE)
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1041 #include <sys/types.h>
a61af66fc99e Initial load
duke
parents:
diff changeset
1042 #include <sys/socket.h>
a61af66fc99e Initial load
duke
parents:
diff changeset
1043 #include <netinet/in.h>
a61af66fc99e Initial load
duke
parents:
diff changeset
1044 #include <arpa/inet.h>
a61af66fc99e Initial load
duke
parents:
diff changeset
1045 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
1046
a61af66fc99e Initial load
duke
parents:
diff changeset
1047 // Network access
222
2a1a77d3458f 6718676: putback for 6604014 is incomplete
never
parents: 102
diff changeset
1048 networkStream::networkStream() : bufferedStream(1024*10, 1024*10) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1049
a61af66fc99e Initial load
duke
parents:
diff changeset
1050 _socket = -1;
a61af66fc99e Initial load
duke
parents:
diff changeset
1051
1980
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
1052 int result = os::socket(AF_INET, SOCK_STREAM, 0);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1053 if (result <= 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1054 assert(false, "Socket could not be created!");
a61af66fc99e Initial load
duke
parents:
diff changeset
1055 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1056 _socket = result;
a61af66fc99e Initial load
duke
parents:
diff changeset
1057 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1058 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1059
a61af66fc99e Initial load
duke
parents:
diff changeset
1060 int networkStream::read(char *buf, size_t len) {
1980
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
1061 return os::recv(_socket, buf, (int)len, 0);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1062 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1063
a61af66fc99e Initial load
duke
parents:
diff changeset
1064 void networkStream::flush() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1065 if (size() != 0) {
4717
11c26bfcf8c7 7091417: recvfrom's 6th input should be of type socklen_t
phh
parents: 3960
diff changeset
1066 int result = os::raw_send(_socket, (char *)base(), size(), 0);
222
2a1a77d3458f 6718676: putback for 6604014 is incomplete
never
parents: 102
diff changeset
1067 assert(result != -1, "connection error");
2a1a77d3458f 6718676: putback for 6604014 is incomplete
never
parents: 102
diff changeset
1068 assert(result == (int)size(), "didn't send enough data");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1069 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1070 reset();
a61af66fc99e Initial load
duke
parents:
diff changeset
1071 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1072
a61af66fc99e Initial load
duke
parents:
diff changeset
1073 networkStream::~networkStream() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1074 close();
a61af66fc99e Initial load
duke
parents:
diff changeset
1075 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1076
a61af66fc99e Initial load
duke
parents:
diff changeset
1077 void networkStream::close() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1078 if (_socket != -1) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1079 flush();
1980
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
1080 os::socket_close(_socket);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1081 _socket = -1;
a61af66fc99e Initial load
duke
parents:
diff changeset
1082 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1083 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1084
a61af66fc99e Initial load
duke
parents:
diff changeset
1085 bool networkStream::connect(const char *ip, short port) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1086
a61af66fc99e Initial load
duke
parents:
diff changeset
1087 struct sockaddr_in server;
a61af66fc99e Initial load
duke
parents:
diff changeset
1088 server.sin_family = AF_INET;
a61af66fc99e Initial load
duke
parents:
diff changeset
1089 server.sin_port = htons(port);
a61af66fc99e Initial load
duke
parents:
diff changeset
1090
a61af66fc99e Initial load
duke
parents:
diff changeset
1091 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
1092 if (server.sin_addr.s_addr == (uint32_t)-1) {
1980
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
1093 struct hostent* host = os::get_host_by_name((char*)ip);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1094 if (host != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1095 memcpy(&server.sin_addr, host->h_addr_list[0], host->h_length);
a61af66fc99e Initial load
duke
parents:
diff changeset
1096 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1097 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
1098 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1099 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1100
a61af66fc99e Initial load
duke
parents:
diff changeset
1101
1980
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
1102 int result = os::connect(_socket, (struct sockaddr*)&server, sizeof(struct sockaddr_in));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1103 return (result >= 0);
a61af66fc99e Initial load
duke
parents:
diff changeset
1104 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1105
a61af66fc99e Initial load
duke
parents:
diff changeset
1106 #endif