Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(736)

Unified Diff: src/log-utils.h

Issue 123012: Implement tick events compression in a log file. (Closed)
Patch Set: Created 11 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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();

Powered by Google App Engine
This is Rietveld 408576698