| Index: src/log-utils.h | 
| diff --git a/src/log-utils.h b/src/log-utils.h | 
| index 2e8b3a36478d7681c12a032f5b603a0bd134ff9e..73ed7cf4aba1758733a3ead609aca3b698ae0260 100644 | 
| --- a/src/log-utils.h | 
| +++ b/src/log-utils.h | 
| @@ -88,6 +88,45 @@ class LogDynamicBuffer { | 
| }; | 
|  | 
|  | 
| +// An utility class for performing backward reference compression | 
| +// of string ends. It operates using a window of previous strings. | 
| +class LogRecordCompressor { | 
| + public: | 
| +  explicit LogRecordCompressor(int window_size_) | 
| +      : buffer_(window_size_), curr_(-1), prev_(-1) { | 
| +    // Must have place for the current record and the previous. | 
| +    ASSERT(window_size_ >= 2); | 
| +  } | 
| +  ~LogRecordCompressor(); | 
| + | 
| +  // Fills vector with a compressed version of the previous record. | 
| +  // Returns false if there is no previous record. | 
| +  bool RetrievePreviousCompressed(Vector<char>* prev_record); | 
| + | 
| +  // Stores a record if it differs from a previous one (or there's no previous). | 
| +  // Returns true, if the record has been stored. | 
| +  bool Store(const Vector<const char>& record); | 
| + | 
| + private: | 
| +  // Record field separator. It is assumed that it can't appear | 
| +  // inside a field (a simplified version of CSV format). | 
| +  static const char kFieldSeparator = ','; | 
| + | 
| +  // Formatting string for back references. | 
| +  static const char* kBackwardReferenceFormat; | 
| + | 
| +  // A boundary value. If current record only differs in | 
| +  // kUncompressibleBound chars, don't compress it. | 
| +  // The value must be greater than the length of maximum | 
| +  // projected backward reference length. | 
| +  static const intptr_t kUncompressibleBound = 10; | 
| + | 
| +  ScopedVector< Vector<const char> > buffer_; | 
| +  int curr_; | 
| +  int prev_; | 
| +}; | 
| + | 
| + | 
| // Functions and data for performing output of log messages. | 
| class Log : public AllStatic { | 
| public: | 
| @@ -169,6 +208,12 @@ class Log : public AllStatic { | 
| // mutex_ should be acquired before using it. | 
| static char* message_buffer_; | 
|  | 
| +  // Size of buffer used for record compression. | 
| +  static const int kRecordCompressorWindow = 6; | 
| + | 
| +  // An utility object for compressing repeated parts of records. | 
| +  static LogRecordCompressor* record_compressor_; | 
| + | 
| friend class LogMessageBuilder; | 
| }; | 
|  | 
| @@ -196,6 +241,19 @@ class LogMessageBuilder BASE_EMBEDDED { | 
|  | 
| void AppendDetailed(String* str, bool show_impl_info); | 
|  | 
| +  // Stores log message into compressor, returns true if the message | 
| +  // was stored (i.e. doesn't repeat the previous one). If log compression is | 
| +  // disabled, does nothing and returns true. | 
| +  bool StoreInCompressor(); | 
| + | 
| +  // Sets log message to a previous version of compressed message. | 
| +  // Returns false, if there is no previous message. If log compression | 
| +  // is disabled, does nothing and retuns true. | 
| +  bool RetrieveCompressedPrevious() { return RetrieveCompressedPrevious(""); } | 
| + | 
| +  // Does the same at the version without arguments, and sets a prefix. | 
| +  bool RetrieveCompressedPrevious(const char* prefix); | 
| + | 
| // Write the log message to the log file currently opened. | 
| void WriteToLogFile(); | 
|  | 
|  |