< prev index next >
src/share/vm/utilities/ostream.cpp
Print this page
*** 25,36 ****
--- 25,38 ----
#include "precompiled.hpp"
#include "compiler/compileLog.hpp"
#include "gc_implementation/shared/gcId.hpp"
#include "oops/oop.inline.hpp"
#include "runtime/arguments.hpp"
+ #include "runtime/mutexLocker.hpp"
#include "runtime/os.hpp"
#include "utilities/defaultStream.hpp"
+ #include "utilities/globalDefinitions.hpp"
#include "utilities/ostream.hpp"
#include "utilities/top.hpp"
#include "utilities/xmlstream.hpp"
#ifdef TARGET_OS_FAMILY_linux
# include "os_linux.inline.hpp"
*** 799,808 ****
--- 801,817 ----
gcLogFileStream::gcLogFileStream(const char* file_name) {
_cur_file_num = 0;
_bytes_written = 0L;
_file_name = make_log_name(file_name, NULL);
+ if (AsyncGCLogging) {
+ //the mutex ranks higher than Mutex::safepoint
+ _lock = new Mutex(Mutex::leaf, "GCLogRingBuffer");
+ _reader = new GCLogEvent("gcLogRingBuf0", GCLogBufferSize);
+ _writer = new GCLogEvent("gcLogRingBuf1", GCLogBufferSize);
+ }
+
if (_file_name == NULL) {
warning("Cannot open file %s: file name is too long.\n", file_name);
_need_close = false;
UseGCLogFileRotation = false;
return;
*** 816,840 ****
} else {
_file = fopen(_file_name, "w");
}
if (_file != NULL) {
_need_close = true;
dump_loggc_header();
} else {
warning("Cannot open file %s due to %s\n", _file_name, strerror(errno));
_need_close = false;
}
}
! void gcLogFileStream::write(const char* s, size_t len) {
if (_file != NULL) {
size_t count = fwrite(s, 1, len, _file);
_bytes_written += count;
}
update_position(s, len);
}
// rotate_log must be called from VMThread at safepoint. In case need change parameters
// for gc log rotation from thread other than VMThread, a sub type of VM_Operation
// should be created and be submitted to VMThread's operation queue. DO NOT call this
// function directly. Currently, it is safe to rotate log at safepoint through VMThread.
// That is, no mutator threads and concurrent GC threads run parallel with VMThread to
--- 825,881 ----
} else {
_file = fopen(_file_name, "w");
}
if (_file != NULL) {
_need_close = true;
+
+ // temporarily disable AsyncGCLogging, because ThreadLocalStorage::thread()
+ // hasn't been initialized yet.
+ FlagSetting saver(AsyncGCLogging, false);
dump_loggc_header();
} else {
warning("Cannot open file %s due to %s\n", _file_name, strerror(errno));
_need_close = false;
}
}
! void gcLogFileStream::flush_log() {
! assert(AsyncGCLogging, "flush_log can only be used when AsyncGCLogging is on!");
!
! _reader->print_log_on(this);
! _reader->reset();
!
! {
! MutexLockerEx ml(_lock, true/*no_safepoint_check*/);
! swap(_reader, _writer);
! }
! }
!
! void gcLogFileStream::write_blocking(const char* s, size_t len) {
! #ifndef PRODUCT
! if (DelayInGCLogging > 0) {
! os::naked_short_sleep((jlong)DelayInGCLogging);
! }
! #endif
!
if (_file != NULL) {
size_t count = fwrite(s, 1, len, _file);
_bytes_written += count;
}
update_position(s, len);
}
+ void gcLogFileStream::write(const char* s, size_t len) {
+ if (AsyncGCLogging) {
+ MutexLockerEx ml(_lock, true/*no_safepoint_check*/);
+ _writer->log(NULL, s, len);
+ }
+ else {
+ write_blocking(s, len);
+ }
+ }
+
// rotate_log must be called from VMThread at safepoint. In case need change parameters
// for gc log rotation from thread other than VMThread, a sub type of VM_Operation
// should be created and be submitted to VMThread's operation queue. DO NOT call this
// function directly. Currently, it is safe to rotate log at safepoint through VMThread.
// That is, no mutator threads and concurrent GC threads run parallel with VMThread to
*** 1547,1552 ****
--- 1588,1599 ----
int result = os::connect(_socket, (struct sockaddr*)&server, sizeof(struct sockaddr_in));
return (result >= 0);
}
+ /////////////// Unit tests ///////////////
+
+ #ifndef PRODUCT
+ void Test_gcLogFileStream() {
+ }
+ #endif
#endif
< prev index next >