| Index: src/log-utils.h
|
| diff --git a/src/log-utils.h b/src/log-utils.h
|
| index 719d37030e12d85ae521792f793973a2a489d45f..ffea9282cbac225499b2c8fb186b4c6a00f73639 100644
|
| --- a/src/log-utils.h
|
| +++ b/src/log-utils.h
|
| @@ -176,6 +176,50 @@ class Log : public AllStatic {
|
|
|
| friend class Logger;
|
| friend class LogMessageBuilder;
|
| + friend class LogRecordCompressor;
|
| +};
|
| +
|
| +
|
| +// An utility class for performing backward reference compression
|
| +// of string ends. It operates using a window of previous strings.
|
| +class LogRecordCompressor {
|
| + public:
|
| + // 'window_size' is the size of backward lookup window.
|
| + explicit LogRecordCompressor(int window_size)
|
| + : buffer_(window_size + kNoCompressionWindowSize),
|
| + kMaxBackwardReferenceSize(
|
| + GetBackwardReferenceSize(window_size, Log::kMessageBufferSize)),
|
| + curr_(-1), prev_(-1) {
|
| + }
|
| +
|
| + ~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:
|
| + // The minimum size of a buffer: a place needed for the current and
|
| + // the previous record. Since there is no place for precedessors of a previous
|
| + // record, it can't be compressed at all.
|
| + static const int kNoCompressionWindowSize = 2;
|
| +
|
| + // Formatting strings for back references.
|
| + static const char* kLineBackwardReferenceFormat;
|
| + static const char* kBackwardReferenceFormat;
|
| +
|
| + static int GetBackwardReferenceSize(int distance, int pos);
|
| +
|
| + static void PrintBackwardReference(Vector<char> dest, int distance, int pos);
|
| +
|
| + ScopedVector< Vector<const char> > buffer_;
|
| + const int kMaxBackwardReferenceSize;
|
| + int curr_;
|
| + int prev_;
|
| };
|
|
|
|
|
| @@ -200,14 +244,32 @@ class LogMessageBuilder BASE_EMBEDDED {
|
| // Append a heap string.
|
| void Append(String* str);
|
|
|
| - // Appends an address.
|
| + // Appends an address, compressing it if needed by offsetting
|
| + // from Logger::last_address_.
|
| void AppendAddress(Address addr);
|
|
|
| + // Appends an address, compressing it if needed.
|
| + void AppendAddress(Address addr, Address bias);
|
| +
|
| void AppendDetailed(String* str, bool show_impl_info);
|
|
|
| // Append a portion of a string.
|
| void AppendStringPart(const char* str, int len);
|
|
|
| + // Stores log message into compressor, returns true if the message
|
| + // was stored (i.e. doesn't repeat the previous one).
|
| + bool StoreInCompressor(LogRecordCompressor* compressor);
|
| +
|
| + // Sets log message to a previous version of compressed message.
|
| + // Returns false, if there is no previous message.
|
| + bool RetrieveCompressedPrevious(LogRecordCompressor* compressor) {
|
| + return RetrieveCompressedPrevious(compressor, "");
|
| + }
|
| +
|
| + // Does the same at the version without arguments, and sets a prefix.
|
| + bool RetrieveCompressedPrevious(LogRecordCompressor* compressor,
|
| + const char* prefix);
|
| +
|
| // Write the log message to the log file currently opened.
|
| void WriteToLogFile();
|
|
|
|
|