src/share/vm/utilities/ostream.hpp

Thu, 20 Nov 2008 16:56:09 -0800

author
ysr
date
Thu, 20 Nov 2008 16:56:09 -0800
changeset 888
c96030fff130
parent 791
1ee8caae33af
child 1907
c18cbe5936b8
permissions
-rw-r--r--

6684579: SoftReference processing can be made more efficient
Summary: For current soft-ref clearing policies, we can decide at marking time if a soft-reference will definitely not be cleared, postponing the decision of whether it will definitely be cleared to the final reference processing phase. This can be especially beneficial in the case of concurrent collectors where the marking is usually concurrent but reference processing is usually not.
Reviewed-by: jmasa

duke@435 1 /*
xdono@631 2 * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved.
duke@435 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
duke@435 4 *
duke@435 5 * This code is free software; you can redistribute it and/or modify it
duke@435 6 * under the terms of the GNU General Public License version 2 only, as
duke@435 7 * published by the Free Software Foundation.
duke@435 8 *
duke@435 9 * This code is distributed in the hope that it will be useful, but WITHOUT
duke@435 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
duke@435 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
duke@435 12 * version 2 for more details (a copy is included in the LICENSE file that
duke@435 13 * accompanied this code).
duke@435 14 *
duke@435 15 * You should have received a copy of the GNU General Public License version
duke@435 16 * 2 along with this work; if not, write to the Free Software Foundation,
duke@435 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
duke@435 18 *
duke@435 19 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
duke@435 20 * CA 95054 USA or visit www.sun.com if you need additional information or
duke@435 21 * have any questions.
duke@435 22 *
duke@435 23 */
duke@435 24
duke@435 25 // Output streams for printing
duke@435 26 //
duke@435 27 // Printing guidelines:
duke@435 28 // Where possible, please use tty->print() and tty->print_cr().
duke@435 29 // For product mode VM warnings use warning() which internally uses tty.
duke@435 30 // In places where tty is not initialized yet or too much overhead,
duke@435 31 // we may use jio_printf:
duke@435 32 // jio_fprintf(defaultStream::output_stream(), "Message");
duke@435 33 // This allows for redirection via -XX:+DisplayVMOutputToStdout and
duke@435 34 // -XX:+DisplayVMOutputToStderr
duke@435 35 class outputStream : public ResourceObj {
duke@435 36 protected:
duke@435 37 int _indentation; // current indentation
duke@435 38 int _width; // width of the page
duke@435 39 int _position; // position on the current line
duke@435 40 int _newlines; // number of '\n' output so far
duke@435 41 julong _precount; // number of chars output, less _position
duke@435 42 TimeStamp _stamp; // for time stamps
duke@435 43
duke@435 44 void update_position(const char* s, size_t len);
duke@435 45 static const char* do_vsnprintf(char* buffer, size_t buflen,
duke@435 46 const char* format, va_list ap,
duke@435 47 bool add_cr,
duke@435 48 size_t& result_len);
duke@435 49
duke@435 50 public:
duke@435 51 // creation
duke@435 52 outputStream(int width = 80);
duke@435 53 outputStream(int width, bool has_time_stamps);
duke@435 54
duke@435 55 // indentation
duke@435 56 void indent();
duke@435 57 void inc() { _indentation++; };
duke@435 58 void dec() { _indentation--; };
duke@435 59 int indentation() const { return _indentation; }
duke@435 60 void set_indentation(int i) { _indentation = i; }
duke@435 61 void fill_to(int col);
jrose@535 62 void move_to(int col, int slop = 6, int min_space = 2);
duke@435 63
duke@435 64 // sizing
duke@435 65 int width() const { return _width; }
duke@435 66 int position() const { return _position; }
duke@435 67 int newlines() const { return _newlines; }
duke@435 68 julong count() const { return _precount + _position; }
duke@435 69 void set_count(julong count) { _precount = count - _position; }
duke@435 70 void set_position(int pos) { _position = pos; }
duke@435 71
duke@435 72 // printing
duke@435 73 void print(const char* format, ...);
duke@435 74 void print_cr(const char* format, ...);
duke@435 75 void vprint(const char *format, va_list argptr);
duke@435 76 void vprint_cr(const char* format, va_list argptr);
duke@435 77 void print_raw(const char* str) { write(str, strlen(str)); }
duke@435 78 void print_raw(const char* str, int len) { write(str, len); }
duke@435 79 void print_raw_cr(const char* str) { write(str, strlen(str)); cr(); }
duke@435 80 void print_raw_cr(const char* str, int len){ write(str, len); cr(); }
duke@435 81 void put(char ch);
jrose@535 82 void sp(int count = 1);
duke@435 83 void cr();
duke@435 84 void bol() { if (_position > 0) cr(); }
duke@435 85
duke@435 86 // Time stamp
duke@435 87 TimeStamp& time_stamp() { return _stamp; }
duke@435 88 void stamp();
ysr@777 89 void stamp(bool guard, const char* prefix, const char* suffix);
ysr@777 90 void stamp(bool guard) {
ysr@777 91 stamp(guard, "", ": ");
ysr@777 92 }
duke@435 93 // Date stamp
duke@435 94 void date_stamp(bool guard, const char* prefix, const char* suffix);
duke@435 95 // A simplified call that includes a suffix of ": "
duke@435 96 void date_stamp(bool guard) {
duke@435 97 date_stamp(guard, "", ": ");
duke@435 98 }
duke@435 99
duke@435 100 // portable printing of 64 bit integers
duke@435 101 void print_jlong(jlong value);
duke@435 102 void print_julong(julong value);
duke@435 103
duke@435 104 // flushing
duke@435 105 virtual void flush() {}
duke@435 106 virtual void write(const char* str, size_t len) = 0;
duke@435 107 virtual ~outputStream() {} // close properly on deletion
duke@435 108
duke@435 109 void dec_cr() { dec(); cr(); }
duke@435 110 void inc_cr() { inc(); cr(); }
duke@435 111 };
duke@435 112
duke@435 113 // standard output
duke@435 114 // ANSI C++ name collision
duke@435 115 extern outputStream* tty; // tty output
duke@435 116 extern outputStream* gclog_or_tty; // stream for gc log if -Xloggc:<f>, or tty
duke@435 117
duke@435 118 // advisory locking for the shared tty stream:
duke@435 119 class ttyLocker: StackObj {
duke@435 120 private:
duke@435 121 intx _holder;
duke@435 122
duke@435 123 public:
duke@435 124 static intx hold_tty(); // returns a "holder" token
duke@435 125 static void release_tty(intx holder); // must witness same token
duke@435 126 static void break_tty_lock_for_safepoint(intx holder);
duke@435 127
duke@435 128 ttyLocker() { _holder = hold_tty(); }
duke@435 129 ~ttyLocker() { release_tty(_holder); }
duke@435 130 };
duke@435 131
duke@435 132 // for writing to strings; buffer will expand automatically
duke@435 133 class stringStream : public outputStream {
duke@435 134 protected:
duke@435 135 char* buffer;
duke@435 136 size_t buffer_pos;
duke@435 137 size_t buffer_length;
duke@435 138 bool buffer_fixed;
duke@435 139 public:
duke@435 140 stringStream(size_t initial_bufsize = 256);
duke@435 141 stringStream(char* fixed_buffer, size_t fixed_buffer_size);
duke@435 142 ~stringStream();
duke@435 143 virtual void write(const char* c, size_t len);
duke@435 144 size_t size() { return buffer_pos; }
duke@435 145 const char* base() { return buffer; }
duke@435 146 void reset() { buffer_pos = 0; _precount = 0; _position = 0; }
duke@435 147 char* as_string();
duke@435 148 };
duke@435 149
duke@435 150 class fileStream : public outputStream {
duke@435 151 protected:
duke@435 152 FILE* _file;
duke@435 153 bool _need_close;
duke@435 154 public:
duke@435 155 fileStream(const char* file_name);
duke@435 156 fileStream(FILE* file) { _file = file; _need_close = false; }
duke@435 157 ~fileStream();
duke@435 158 bool is_open() const { return _file != NULL; }
duke@435 159 virtual void write(const char* c, size_t len);
duke@435 160 void flush();
duke@435 161 };
duke@435 162
duke@435 163 // unlike fileStream, fdStream does unbuffered I/O by calling
duke@435 164 // open() and write() directly. It is async-safe, but output
duke@435 165 // from multiple thread may be mixed together. Used by fatal
duke@435 166 // error handler.
duke@435 167 class fdStream : public outputStream {
duke@435 168 protected:
duke@435 169 int _fd;
duke@435 170 bool _need_close;
duke@435 171 public:
duke@435 172 fdStream(const char* file_name);
duke@435 173 fdStream(int fd = -1) { _fd = fd; _need_close = false; }
duke@435 174 ~fdStream();
duke@435 175 bool is_open() const { return _fd != -1; }
duke@435 176 void set_fd(int fd) { _fd = fd; _need_close = false; }
duke@435 177 int fd() const { return _fd; }
duke@435 178 virtual void write(const char* c, size_t len);
duke@435 179 void flush() {};
duke@435 180 };
duke@435 181
duke@435 182 void ostream_init();
duke@435 183 void ostream_init_log();
duke@435 184 void ostream_exit();
duke@435 185 void ostream_abort();
duke@435 186
duke@435 187 // staticBufferStream uses a user-supplied buffer for all formatting.
duke@435 188 // Used for safe formatting during fatal error handling. Not MT safe.
duke@435 189 // Do not share the stream between multiple threads.
duke@435 190 class staticBufferStream : public outputStream {
duke@435 191 private:
duke@435 192 char* _buffer;
duke@435 193 size_t _buflen;
duke@435 194 outputStream* _outer_stream;
duke@435 195 public:
duke@435 196 staticBufferStream(char* buffer, size_t buflen,
duke@435 197 outputStream *outer_stream);
duke@435 198 ~staticBufferStream() {};
duke@435 199 virtual void write(const char* c, size_t len);
duke@435 200 void flush();
duke@435 201 void print(const char* format, ...);
duke@435 202 void print_cr(const char* format, ...);
duke@435 203 void vprint(const char *format, va_list argptr);
duke@435 204 void vprint_cr(const char* format, va_list argptr);
duke@435 205 };
duke@435 206
duke@435 207 // In the non-fixed buffer case an underlying buffer will be created and
duke@435 208 // managed in C heap. Not MT-safe.
duke@435 209 class bufferedStream : public outputStream {
duke@435 210 protected:
duke@435 211 char* buffer;
duke@435 212 size_t buffer_pos;
never@657 213 size_t buffer_max;
duke@435 214 size_t buffer_length;
duke@435 215 bool buffer_fixed;
duke@435 216 public:
never@657 217 bufferedStream(size_t initial_bufsize = 256, size_t bufmax = 1024*1024*10);
never@657 218 bufferedStream(char* fixed_buffer, size_t fixed_buffer_size, size_t bufmax = 1024*1024*10);
duke@435 219 ~bufferedStream();
duke@435 220 virtual void write(const char* c, size_t len);
duke@435 221 size_t size() { return buffer_pos; }
duke@435 222 const char* base() { return buffer; }
duke@435 223 void reset() { buffer_pos = 0; _precount = 0; _position = 0; }
duke@435 224 char* as_string();
duke@435 225 };
duke@435 226
duke@435 227 #define O_BUFLEN 2000 // max size of output of individual print() methods
duke@435 228
duke@435 229 #ifndef PRODUCT
duke@435 230
duke@435 231 class networkStream : public bufferedStream {
duke@435 232
duke@435 233 private:
duke@435 234 int _socket;
duke@435 235
duke@435 236 public:
duke@435 237 networkStream();
duke@435 238 ~networkStream();
duke@435 239
duke@435 240 bool connect(const char *host, short port);
duke@435 241 bool is_open() const { return _socket != -1; }
duke@435 242 int read(char *buf, size_t len);
duke@435 243 void close();
duke@435 244 virtual void flush();
duke@435 245 };
duke@435 246
duke@435 247 #endif

mercurial