382 |
382 |
383 rotatingFileStream::~rotatingFileStream() { |
383 rotatingFileStream::~rotatingFileStream() { |
384 if (_file != NULL) { |
384 if (_file != NULL) { |
385 if (_need_close) fclose(_file); |
385 if (_need_close) fclose(_file); |
386 _file = NULL; |
386 _file = NULL; |
387 FREE_C_HEAP_ARRAY(char, _file_name); |
387 FREE_C_HEAP_ARRAY(char, _file_name, mtInternal); |
388 _file_name = NULL; |
388 _file_name = NULL; |
389 } |
389 } |
390 } |
390 } |
391 |
391 |
392 rotatingFileStream::rotatingFileStream(const char* file_name) { |
392 rotatingFileStream::rotatingFileStream(const char* file_name) { |
393 _cur_file_num = 0; |
393 _cur_file_num = 0; |
394 _bytes_writen = 0L; |
394 _bytes_writen = 0L; |
395 _file_name = NEW_C_HEAP_ARRAY(char, strlen(file_name)+10); |
395 _file_name = NEW_C_HEAP_ARRAY(char, strlen(file_name)+10, mtInternal); |
396 jio_snprintf(_file_name, strlen(file_name)+10, "%s.%d", file_name, _cur_file_num); |
396 jio_snprintf(_file_name, strlen(file_name)+10, "%s.%d", file_name, _cur_file_num); |
397 _file = fopen(_file_name, "w"); |
397 _file = fopen(_file_name, "w"); |
398 _need_close = true; |
398 _need_close = true; |
399 } |
399 } |
400 |
400 |
401 rotatingFileStream::rotatingFileStream(const char* file_name, const char* opentype) { |
401 rotatingFileStream::rotatingFileStream(const char* file_name, const char* opentype) { |
402 _cur_file_num = 0; |
402 _cur_file_num = 0; |
403 _bytes_writen = 0L; |
403 _bytes_writen = 0L; |
404 _file_name = NEW_C_HEAP_ARRAY(char, strlen(file_name)+10); |
404 _file_name = NEW_C_HEAP_ARRAY(char, strlen(file_name)+10, mtInternal); |
405 jio_snprintf(_file_name, strlen(file_name)+10, "%s.%d", file_name, _cur_file_num); |
405 jio_snprintf(_file_name, strlen(file_name)+10, "%s.%d", file_name, _cur_file_num); |
406 _file = fopen(_file_name, opentype); |
406 _file = fopen(_file_name, opentype); |
407 _need_close = true; |
407 _need_close = true; |
408 } |
408 } |
409 |
409 |
522 jio_snprintf(pid, sizeof(pid), "%u", os::current_process_id()); |
522 jio_snprintf(pid, sizeof(pid), "%u", os::current_process_id()); |
523 buffer_length += strlen(pid); |
523 buffer_length += strlen(pid); |
524 } |
524 } |
525 |
525 |
526 // Create big enough buffer. |
526 // Create big enough buffer. |
527 char *buf = NEW_C_HEAP_ARRAY(char, buffer_length); |
527 char *buf = NEW_C_HEAP_ARRAY(char, buffer_length, mtInternal); |
528 |
528 |
529 strcpy(buf, ""); |
529 strcpy(buf, ""); |
530 if (force_directory != NULL) { |
530 if (force_directory != NULL) { |
531 strcat(buf, force_directory); |
531 strcat(buf, force_directory); |
532 strcat(buf, os::file_separator()); |
532 strcat(buf, os::file_separator()); |
547 |
547 |
548 void defaultStream::init_log() { |
548 void defaultStream::init_log() { |
549 // %%% Need a MutexLocker? |
549 // %%% Need a MutexLocker? |
550 const char* log_name = LogFile != NULL ? LogFile : "hotspot.log"; |
550 const char* log_name = LogFile != NULL ? LogFile : "hotspot.log"; |
551 const char* try_name = make_log_name(log_name, NULL); |
551 const char* try_name = make_log_name(log_name, NULL); |
552 fileStream* file = new(ResourceObj::C_HEAP) fileStream(try_name); |
552 fileStream* file = new(ResourceObj::C_HEAP, mtInternal) fileStream(try_name); |
553 if (!file->is_open()) { |
553 if (!file->is_open()) { |
554 // Try again to open the file. |
554 // Try again to open the file. |
555 char warnbuf[O_BUFLEN*2]; |
555 char warnbuf[O_BUFLEN*2]; |
556 jio_snprintf(warnbuf, sizeof(warnbuf), |
556 jio_snprintf(warnbuf, sizeof(warnbuf), |
557 "Warning: Cannot open log file: %s\n", try_name); |
557 "Warning: Cannot open log file: %s\n", try_name); |
558 // Note: This feature is for maintainer use only. No need for L10N. |
558 // Note: This feature is for maintainer use only. No need for L10N. |
559 jio_print(warnbuf); |
559 jio_print(warnbuf); |
560 FREE_C_HEAP_ARRAY(char, try_name); |
560 FREE_C_HEAP_ARRAY(char, try_name, mtInternal); |
561 try_name = make_log_name("hs_pid%p.log", os::get_temp_directory()); |
561 try_name = make_log_name("hs_pid%p.log", os::get_temp_directory()); |
562 jio_snprintf(warnbuf, sizeof(warnbuf), |
562 jio_snprintf(warnbuf, sizeof(warnbuf), |
563 "Warning: Forcing option -XX:LogFile=%s\n", try_name); |
563 "Warning: Forcing option -XX:LogFile=%s\n", try_name); |
564 jio_print(warnbuf); |
564 jio_print(warnbuf); |
565 delete file; |
565 delete file; |
566 file = new(ResourceObj::C_HEAP) fileStream(try_name); |
566 file = new(ResourceObj::C_HEAP, mtInternal) fileStream(try_name); |
567 FREE_C_HEAP_ARRAY(char, try_name); |
567 FREE_C_HEAP_ARRAY(char, try_name, mtInternal); |
568 } |
568 } |
569 if (file->is_open()) { |
569 if (file->is_open()) { |
570 _log_file = file; |
570 _log_file = file; |
571 xmlStream* xs = new(ResourceObj::C_HEAP) xmlStream(file); |
571 xmlStream* xs = new(ResourceObj::C_HEAP, mtInternal) xmlStream(file); |
572 _outer_xmlStream = xs; |
572 _outer_xmlStream = xs; |
573 if (this == tty) xtty = xs; |
573 if (this == tty) xtty = xs; |
574 // Write XML header. |
574 // Write XML header. |
575 xs->print_cr("<?xml version='1.0' encoding='UTF-8'?>"); |
575 xs->print_cr("<?xml version='1.0' encoding='UTF-8'?>"); |
576 // (For now, don't bother to issue a DTD for this private format.) |
576 // (For now, don't bother to issue a DTD for this private format.) |
813 // (else there was no lock to break) |
813 // (else there was no lock to break) |
814 } |
814 } |
815 |
815 |
816 void ostream_init() { |
816 void ostream_init() { |
817 if (defaultStream::instance == NULL) { |
817 if (defaultStream::instance == NULL) { |
818 defaultStream::instance = new(ResourceObj::C_HEAP) defaultStream(); |
818 defaultStream::instance = new(ResourceObj::C_HEAP, mtInternal) defaultStream(); |
819 tty = defaultStream::instance; |
819 tty = defaultStream::instance; |
820 |
820 |
821 // We want to ensure that time stamps in GC logs consider time 0 |
821 // We want to ensure that time stamps in GC logs consider time 0 |
822 // the time when the JVM is initialized, not the first time we ask |
822 // the time when the JVM is initialized, not the first time we ask |
823 // for a time stamp. So, here, we explicitly update the time stamp |
823 // for a time stamp. So, here, we explicitly update the time stamp |
831 // Note : this must be called AFTER ostream_init() |
831 // Note : this must be called AFTER ostream_init() |
832 |
832 |
833 gclog_or_tty = tty; // default to tty |
833 gclog_or_tty = tty; // default to tty |
834 if (Arguments::gc_log_filename() != NULL) { |
834 if (Arguments::gc_log_filename() != NULL) { |
835 fileStream * gclog = UseGCLogFileRotation ? |
835 fileStream * gclog = UseGCLogFileRotation ? |
836 new(ResourceObj::C_HEAP) |
836 new(ResourceObj::C_HEAP, mtInternal) |
837 rotatingFileStream(Arguments::gc_log_filename()) : |
837 rotatingFileStream(Arguments::gc_log_filename()) : |
838 new(ResourceObj::C_HEAP) |
838 new(ResourceObj::C_HEAP, mtInternal) |
839 fileStream(Arguments::gc_log_filename()); |
839 fileStream(Arguments::gc_log_filename()); |
840 if (gclog->is_open()) { |
840 if (gclog->is_open()) { |
841 // now we update the time stamp of the GC log to be synced up |
841 // now we update the time stamp of the GC log to be synced up |
842 // with tty. |
842 // with tty. |
843 gclog->time_stamp().update_to(tty->time_stamp().ticks()); |
843 gclog->time_stamp().update_to(tty->time_stamp().ticks()); |
969 // For small overruns, double the buffer. For larger ones, |
969 // For small overruns, double the buffer. For larger ones, |
970 // increase to the requested size. |
970 // increase to the requested size. |
971 if (end < buffer_length * 2) { |
971 if (end < buffer_length * 2) { |
972 end = buffer_length * 2; |
972 end = buffer_length * 2; |
973 } |
973 } |
974 buffer = REALLOC_C_HEAP_ARRAY(char, buffer, end); |
974 buffer = REALLOC_C_HEAP_ARRAY(char, buffer, end, mtInternal); |
975 buffer_length = end; |
975 buffer_length = end; |
976 } |
976 } |
977 } |
977 } |
978 memcpy(buffer + buffer_pos, s, len); |
978 memcpy(buffer + buffer_pos, s, len); |
979 buffer_pos += len; |
979 buffer_pos += len; |