// Output streams for printing // // Printing guidelines: // Where possible, please use tty->print() and tty->print_cr(). // For product mode VM warnings use warning() which internally uses tty. // In places where tty is not initialized yet or too much overhead, // we may use jio_printf: // jio_fprintf(defaultStream::output_stream(), "Message"); // This allows for redirection via -XX:+DisplayVMOutputToStdout and // -XX:+DisplayVMOutputToStderr class outputStream : public CHeapObjBase { private:
NONCOPYABLE(outputStream);
protected:
int _indentation; // current indentation
int _position; // visual position on the current line
uint64_t _precount; // number of chars output, less than _position
TimeStamp _stamp; // for time stamps
char* _scratch; // internal scratch buffer for printf
size_t _scratch_len; // size of internal scratch buffer
// Returns whether a newline was seen or not bool update_position(const char* s, size_t len); staticconst char* do_vsnprintf(char* buffer, size_t buflen, const char* format, va_list ap, bool add_cr,
size_t& result_len) ATTRIBUTE_PRINTF(3, 0);
// calls do_vsnprintf and writes output to stream; uses an on-stack buffer. void do_vsnprintf_and_write_with_automatic_buffer(const char* format, va_list ap, booladd_cr) ATTRIBUTE_PRINTF(2, 0); // calls do_vsnprintf and writes output to stream; uses the user-provided buffer; void do_vsnprintf_and_write_with_scratch_buffer(const char* format, va_list ap, bool add_cr) ATTRIBUTE_PRINTF(2, 0); // calls do_vsnprintf, then writes output to stream. void do_vsnprintf_and_write(const char* format, va_list ap, bool add_cr) ATTRIBUTE_PRINTF(2, 0);
// Caller may specify their own scratch buffer to use for printing; otherwise, // an automatic buffer on the stack (with O_BUFLEN len) is used. void set_scratch_buffer(char* p, size_t len) { _scratch = p; _scratch_len = len; }
// standard output // ANSI C++ name collision
extern outputStream* tty; // tty output
class streamIndentor : public StackObj { private:
outputStream* _str;
int _amount;
public:
streamIndentor(outputStream* str, int amt = 2) : _str(str), _amount(amt) {
_str->inc(_amount);
}
~streamIndentor() { _str->dec(_amount); }
};
// advisory locking for the shared tty stream: class ttyLocker: StackObj {
friend class ttyUnlocker; private:
intx _holder;
public: static intx hold_tty(); // returns a "holder" token staticvoid release_tty(intx holder); // must witness same token staticbool release_tty_if_locked(); // returns true if lock was released staticvoid break_tty_lock_for_safepoint(intx holder);
// Release the tty lock if it's held and reacquire it if it was // locked. Used to avoid lock ordering problems. class ttyUnlocker: StackObj { private: bool _was_locked; public:
ttyUnlocker() {
_was_locked = ttyLocker::release_tty_if_locked();
}
~ttyUnlocker() {
if (_was_locked) {
ttyLocker::hold_tty();
}
}
};
// for writing to strings; buffer will expand automatically. // Buffer will always be zero-terminated. class stringStream : public outputStream {
DEBUG_ONLY(bool _is_frozen = false);
char* _buffer;
size_t _written; // Number of characters written, excluding termin. zero
size_t _capacity; constbool _is_fixed;
char _small_buffer[48];
// Grow backing buffer to desired capacity. void grow(size_t new_capacity);
// zero terminate at buffer_pos. void zero_terminate();
public: // Create a stringStream using an internal buffer of initially initial_bufsize size; // will be enlarged on demand. There is no maximum cap.
stringStream(size_t initial_capacity = 0); // Creates a stringStream using a caller-provided buffer. Will truncate silently if // it overflows.
stringStream(char* fixed_buffer, size_t fixed_buffer_size);
~stringStream(); virtualvoid write(const char* c, size_t len); // Return number of characters written into buffer, excluding terminating zero and // subject to truncation in static buffer mode.
size_t size() const { return _written; } // Returns internal buffer containing the accumulated string. // Returned buffer is only guaranteed to be valid as long as stream is not modified const char* base() const { return _buffer; } // Freezes stringStream (no further modifications possible) and returns pointer to it. // No-op if stream is frozen already. // Returns the internal buffer containing the accumulated string. const char* freeze() NOT_DEBUG(const) {
DEBUG_ONLY(_is_frozen = true); return _buffer;
}; void reset(); // Copy to a resource, or C-heap, array as requested
char* as_string(bool c_heap = false) const;
};
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.