< prev index next >

src/share/vm/utilities/ostream.hpp

Print this page

        

@@ -25,10 +25,11 @@
 #ifndef SHARE_VM_UTILITIES_OSTREAM_HPP
 #define SHARE_VM_UTILITIES_OSTREAM_HPP
 
 #include "memory/allocation.hpp"
 #include "runtime/timer.hpp"
+#include "runtime/task.hpp"
 
 class GCId;
 DEBUG_ONLY(class ResourceMark;)
 
 // Output streams for printing

@@ -233,30 +234,58 @@
   int fd() const { return _fd; }
   virtual void write(const char* c, size_t len);
   void flush() {};
 };
 
+class Mutex;
+class GCLogEvent;
+
 class gcLogFileStream : public fileStream {
  protected:
   const char*  _file_name;
   jlong  _bytes_written;
   uintx  _cur_file_num;             // current logfile rotation number, from 0 to NumberOfGCLogFiles-1
+ private:
+  GCLogEvent* _reader;
+  GCLogEvent* _writer;
+  Mutex* _lock;
+
  public:
   gcLogFileStream(const char* file_name);
   ~gcLogFileStream();
+  // write asynchronously
   virtual void write(const char* c, size_t len);
+  // really write to file system.
+  void write_blocking(const char* c, size_t len);
   virtual void rotate_log(bool force, outputStream* out = NULL);
+  void flush_log();
   void dump_loggc_header();
 
   /* If "force" sets true, force log file rotation from outside JVM */
   bool should_rotate(bool force) {
     return force ||
              ((GCLogFileSize != 0) && ((uintx)_bytes_written >= GCLogFileSize));
   }
 
 };
 
+class GCLogFlusher: public PeriodicTask {
+  gcLogFileStream * _ostream;
+  elapsedTimer _accumulatedTime;
+public:
+  GCLogFlusher(int interval, gcLogFileStream* ostream):PeriodicTask(interval), _ostream(ostream) {}
+
+  virtual void task() {
+    TraceTime t("GCLogFlusher", &_accumulatedTime, true, PrintGCLogFlushTime);
+    _ostream->flush_log();
+  }
+
+  elapsedTimer getAccumulatedTime() {
+    return _accumulatedTime;
+  }
+};
+
 #ifndef PRODUCT
 // unit test for checking -Xloggc:<filename> parsing result
 void test_loggc_filename();
 void test_snprintf();
 #endif
< prev index next >