8013329: File leak in hotspot/src/share/vm/compiler/compileBroker.cpp

Added calling of the destructor of CompileLog so that files are closed. Added/moved memory allocation/deallocation of the string that contains the name of the log file to class CompileLog.

Reviewed-by: kvn, roland
This commit is contained in:
Albert Noll 2013-06-03 08:52:20 +02:00
parent 6ae26f2e94
commit d6efb99686
3 changed files with 30 additions and 28 deletions

View file

@ -1642,42 +1642,37 @@ void CompileBroker::compiler_thread_loop() {
// Set up state required by +LogCompilation. // Set up state required by +LogCompilation.
void CompileBroker::init_compiler_thread_log() { void CompileBroker::init_compiler_thread_log() {
CompilerThread* thread = CompilerThread::current(); CompilerThread* thread = CompilerThread::current();
char fileBuf[4*K]; char file_name[4*K];
FILE* fp = NULL; FILE* fp = NULL;
char* file = NULL;
intx thread_id = os::current_thread_id(); intx thread_id = os::current_thread_id();
for (int try_temp_dir = 1; try_temp_dir >= 0; try_temp_dir--) { for (int try_temp_dir = 1; try_temp_dir >= 0; try_temp_dir--) {
const char* dir = (try_temp_dir ? os::get_temp_directory() : NULL); const char* dir = (try_temp_dir ? os::get_temp_directory() : NULL);
if (dir == NULL) { if (dir == NULL) {
jio_snprintf(fileBuf, sizeof(fileBuf), "hs_c" UINTX_FORMAT "_pid%u.log", jio_snprintf(file_name, sizeof(file_name), "hs_c" UINTX_FORMAT "_pid%u.log",
thread_id, os::current_process_id()); thread_id, os::current_process_id());
} else { } else {
jio_snprintf(fileBuf, sizeof(fileBuf), jio_snprintf(file_name, sizeof(file_name),
"%s%shs_c" UINTX_FORMAT "_pid%u.log", dir, "%s%shs_c" UINTX_FORMAT "_pid%u.log", dir,
os::file_separator(), thread_id, os::current_process_id()); os::file_separator(), thread_id, os::current_process_id());
} }
fp = fopen(fileBuf, "at");
fp = fopen(file_name, "at");
if (fp != NULL) { if (fp != NULL) {
file = NEW_C_HEAP_ARRAY(char, strlen(fileBuf)+1, mtCompiler); if (LogCompilation && Verbose) {
strcpy(file, fileBuf); tty->print_cr("Opening compilation log %s", file_name);
break;
} }
} CompileLog* log = new(ResourceObj::C_HEAP, mtCompiler) CompileLog(file_name, fp, thread_id);
if (fp == NULL) {
warning("Cannot open log file: %s", fileBuf);
} else {
if (LogCompilation && Verbose)
tty->print_cr("Opening compilation log %s", file);
CompileLog* log = new(ResourceObj::C_HEAP, mtCompiler) CompileLog(file, fp, thread_id);
thread->init_log(log); thread->init_log(log);
if (xtty != NULL) { if (xtty != NULL) {
ttyLocker ttyl; ttyLocker ttyl;
// Record any per thread log files // Record any per thread log files
xtty->elem("thread_logfile thread='%d' filename='%s'", thread_id, file); xtty->elem("thread_logfile thread='%d' filename='%s'", thread_id, file_name);
}
return;
} }
} }
warning("Cannot open log file: %s", file_name);
} }
// ------------------------------------------------------------------ // ------------------------------------------------------------------

View file

@ -34,17 +34,18 @@ CompileLog* CompileLog::_first = NULL;
// ------------------------------------------------------------------ // ------------------------------------------------------------------
// CompileLog::CompileLog // CompileLog::CompileLog
CompileLog::CompileLog(const char* file, FILE* fp, intx thread_id) CompileLog::CompileLog(const char* file_name, FILE* fp, intx thread_id)
: _context(_context_buffer, sizeof(_context_buffer)) : _context(_context_buffer, sizeof(_context_buffer))
{ {
initialize(new(ResourceObj::C_HEAP, mtCompiler) fileStream(fp)); initialize(new(ResourceObj::C_HEAP, mtCompiler) fileStream(fp, true));
_file = file;
_file_end = 0; _file_end = 0;
_thread_id = thread_id; _thread_id = thread_id;
_identities_limit = 0; _identities_limit = 0;
_identities_capacity = 400; _identities_capacity = 400;
_identities = NEW_C_HEAP_ARRAY(char, _identities_capacity, mtCompiler); _identities = NEW_C_HEAP_ARRAY(char, _identities_capacity, mtCompiler);
_file = NEW_C_HEAP_ARRAY(char, strlen(file_name)+1, mtCompiler);
strcpy((char*)_file, file_name);
// link into the global list // link into the global list
{ MutexLocker locker(CompileTaskAlloc_lock); { MutexLocker locker(CompileTaskAlloc_lock);
@ -57,6 +58,7 @@ CompileLog::~CompileLog() {
delete _out; delete _out;
_out = NULL; _out = NULL;
FREE_C_HEAP_ARRAY(char, _identities, mtCompiler); FREE_C_HEAP_ARRAY(char, _identities, mtCompiler);
FREE_C_HEAP_ARRAY(char, _file, mtCompiler);
} }
@ -188,7 +190,8 @@ void CompileLog::finish_log_on_error(outputStream* file, char* buf, int buflen)
if (called_exit) return; if (called_exit) return;
called_exit = true; called_exit = true;
for (CompileLog* log = _first; log != NULL; log = log->_next) { CompileLog* log = _first;
while (log != NULL) {
log->flush(); log->flush();
const char* partial_file = log->file(); const char* partial_file = log->file();
int partial_fd = open(partial_file, O_RDONLY); int partial_fd = open(partial_file, O_RDONLY);
@ -267,7 +270,11 @@ void CompileLog::finish_log_on_error(outputStream* file, char* buf, int buflen)
close(partial_fd); close(partial_fd);
unlink(partial_file); unlink(partial_file);
} }
CompileLog* next_log = log->_next;
delete log;
log = next_log;
} }
_first = NULL;
} }
// ------------------------------------------------------------------ // ------------------------------------------------------------------

View file

@ -57,7 +57,7 @@ class CompileLog : public xmlStream {
void va_tag(bool push, const char* format, va_list ap); void va_tag(bool push, const char* format, va_list ap);
public: public:
CompileLog(const char* file, FILE* fp, intx thread_id); CompileLog(const char* file_name, FILE* fp, intx thread_id);
~CompileLog(); ~CompileLog();
intx thread_id() { return _thread_id; } intx thread_id() { return _thread_id; }