| Index: src/log-utils.cc
|
| diff --git a/src/log-utils.cc b/src/log-utils.cc
|
| index 45f1131419a801c4d9b93d5999b3987bb0bc2251..b3b3192b2fb26ed5d82d13b0714ba04e58e773d3 100644
|
| --- a/src/log-utils.cc
|
| +++ b/src/log-utils.cc
|
| @@ -127,18 +127,11 @@ LogDynamicBuffer* Log::output_buffer_ = NULL;
|
| const char* Log::kDynamicBufferSeal = "profiler,\"pause\"\n";
|
| Mutex* Log::mutex_ = NULL;
|
| char* Log::message_buffer_ = NULL;
|
| -LogRecordCompressor* Log::record_compressor_ = NULL;
|
| -// Must be the same as compressed tick event name from Logger.
|
| -const char* Log::kCompressedTickEventName = "t,";
|
|
|
|
|
| void Log::Init() {
|
| mutex_ = OS::CreateMutex();
|
| message_buffer_ = NewArray<char>(kMessageBufferSize);
|
| - if (FLAG_compress_log) {
|
| - record_compressor_ = new LogRecordCompressor(
|
| - kRecordCompressorWindow, strlen(kCompressedTickEventName));
|
| - }
|
| }
|
|
|
|
|
| @@ -180,9 +173,6 @@ void Log::Close() {
|
| }
|
| Write = NULL;
|
|
|
| - delete record_compressor_;
|
| - record_compressor_ = NULL;
|
| -
|
| DeleteArray(message_buffer_);
|
| message_buffer_ = NULL;
|
|
|
| @@ -263,6 +253,27 @@ void LogMessageBuilder::Append(String* str) {
|
| }
|
|
|
|
|
| +void LogMessageBuilder::AppendAddress(Address addr) {
|
| + static Address last_address_ = NULL;
|
| + AppendAddress(addr, last_address_);
|
| + last_address_ = addr;
|
| +}
|
| +
|
| +
|
| +void LogMessageBuilder::AppendAddress(Address addr, Address bias) {
|
| + if (!FLAG_compress_log || bias == NULL) {
|
| + Append("0x%" V8PRIxPTR, addr);
|
| + } else {
|
| + intptr_t delta = addr - bias;
|
| + // To avoid printing negative offsets in an unsigned form,
|
| + // we are printing an absolute value with a sign.
|
| + const char sign = delta >= 0 ? '+' : '-';
|
| + if (sign == '-') { delta = -delta; }
|
| + Append("%c%" V8PRIxPTR, sign, delta);
|
| + }
|
| +}
|
| +
|
| +
|
| void LogMessageBuilder::AppendDetailed(String* str, bool show_impl_info) {
|
| AssertNoAllocation no_heap_allocation; // Ensure string stay valid.
|
| int len = str->length();
|
| @@ -293,24 +304,19 @@ void LogMessageBuilder::AppendDetailed(String* str, bool show_impl_info) {
|
| }
|
|
|
|
|
| -bool LogMessageBuilder::StoreInCompressor() {
|
| - if (!FLAG_compress_log) return true;
|
| - ASSERT(Log::record_compressor_ != NULL);
|
| - return Log::record_compressor_->Store(
|
| - Vector<const char>(Log::message_buffer_, pos_));
|
| +bool LogMessageBuilder::StoreInCompressor(LogRecordCompressor* compressor) {
|
| + return compressor->Store(Vector<const char>(Log::message_buffer_, pos_));
|
| }
|
|
|
|
|
| -bool LogMessageBuilder::RetrieveCompressedPrevious(const char* prefix) {
|
| - if (!FLAG_compress_log) return true;
|
| - ASSERT(Log::record_compressor_ != NULL);
|
| +bool LogMessageBuilder::RetrieveCompressedPrevious(
|
| + LogRecordCompressor* compressor, const char* prefix) {
|
| pos_ = 0;
|
| if (prefix[0] != '\0') Append(prefix);
|
| Vector<char> prev_record(Log::message_buffer_ + pos_,
|
| Log::kMessageBufferSize - pos_);
|
| - const bool has_previous =
|
| - Log::record_compressor_->RetrievePreviousCompressed(&prev_record);
|
| - if (!has_previous) return false;
|
| + const bool has_prev = compressor->RetrievePreviousCompressed(&prev_record);
|
| + if (!has_prev) return false;
|
| pos_ += prev_record.length();
|
| return true;
|
| }
|
| @@ -334,6 +340,10 @@ void LogMessageBuilder::WriteCStringToLogFile(const char* str) {
|
| }
|
|
|
|
|
| +// Formatting string for back references to the whole line. E.g. "#2" means
|
| +// "the second line above".
|
| +const char* LogRecordCompressor::kLineBackwardReferenceFormat = "#%d";
|
| +
|
| // Formatting string for back references. E.g. "#2:10" means
|
| // "the second line above, start from char 10 (0-based)".
|
| const char* LogRecordCompressor::kBackwardReferenceFormat = "#%d:%d";
|
| @@ -346,6 +356,34 @@ LogRecordCompressor::~LogRecordCompressor() {
|
| }
|
|
|
|
|
| +static int GetNumberLength(int number) {
|
| + ASSERT(number >= 0);
|
| + ASSERT(number < 10000);
|
| + if (number < 10) return 1;
|
| + if (number < 100) return 2;
|
| + if (number < 1000) return 3;
|
| + return 4;
|
| +}
|
| +
|
| +
|
| +int LogRecordCompressor::GetBackwardReferenceSize(int distance, int pos) {
|
| + // See kLineBackwardReferenceFormat and kBackwardReferenceFormat.
|
| + return pos == 0 ? GetNumberLength(distance) + 1
|
| + : GetNumberLength(distance) + GetNumberLength(pos) + 2;
|
| +}
|
| +
|
| +
|
| +void LogRecordCompressor::PrintBackwardReference(Vector<char> dest,
|
| + int distance,
|
| + int pos) {
|
| + if (pos == 0) {
|
| + OS::SNPrintF(dest, kLineBackwardReferenceFormat, distance);
|
| + } else {
|
| + OS::SNPrintF(dest, kBackwardReferenceFormat, distance, pos);
|
| + }
|
| +}
|
| +
|
| +
|
| bool LogRecordCompressor::Store(const Vector<const char>& record) {
|
| // Check if the record is the same as the last stored one.
|
| if (curr_ != -1) {
|
| @@ -379,9 +417,10 @@ bool LogRecordCompressor::RetrievePreviousCompressed(
|
| intptr_t truncated_len;
|
| int distance;
|
| int copy_from_pos;
|
| - } best = {-1, 0, 0};
|
| + int backref_size;
|
| + } best = {-1, 0, 0, 0};
|
| Vector<const char>& prev = buffer_[prev_];
|
| - const char* const prev_start = prev.start() + start_pos_;
|
| + const char* const prev_start = prev.start();
|
| const char* const prev_end = prev.start() + prev.length();
|
| do {
|
| // We're moving backwards until we reach the current record.
|
| @@ -402,13 +441,19 @@ bool LogRecordCompressor::RetrievePreviousCompressed(
|
| --data_ptr;
|
| }
|
| const intptr_t truncated_len = prev_end - prev_ptr;
|
| - if (truncated_len < kUncompressibleBound) continue;
|
| + const int copy_from_pos = data_ptr - data.start();
|
| + // Check if the length of compressed tail is enough.
|
| + if (truncated_len <= kMaxBackwardReferenceSize
|
| + && truncated_len <= GetBackwardReferenceSize(distance, copy_from_pos)) {
|
| + continue;
|
| + }
|
|
|
| // Record compression results.
|
| if (truncated_len > best.truncated_len) {
|
| best.truncated_len = truncated_len;
|
| best.distance = distance;
|
| - best.copy_from_pos = data_ptr - data.start();
|
| + best.copy_from_pos = copy_from_pos;
|
| + best.backref_size = GetBackwardReferenceSize(distance, copy_from_pos);
|
| }
|
| } while (true);
|
|
|
| @@ -420,14 +465,15 @@ bool LogRecordCompressor::RetrievePreviousCompressed(
|
| } else {
|
| // Copy the uncompressible part unchanged.
|
| const intptr_t unchanged_len = prev.length() - best.truncated_len;
|
| - ASSERT(prev_record->length() >= unchanged_len + kUncompressibleBound);
|
| + // + 1 for '\0'.
|
| + ASSERT(prev_record->length() >= unchanged_len + best.backref_size + 1);
|
| memcpy(prev_record->start(), prev.start(), unchanged_len);
|
| // Append the backward reference.
|
| - Vector<char> patch(prev_record->start() + unchanged_len,
|
| - kUncompressibleBound);
|
| - OS::SNPrintF(patch, kBackwardReferenceFormat,
|
| - best.distance, best.copy_from_pos);
|
| - prev_record->Truncate(unchanged_len + strlen(patch.start()));
|
| + Vector<char> backref(
|
| + prev_record->start() + unchanged_len, best.backref_size + 1);
|
| + PrintBackwardReference(backref, best.distance, best.copy_from_pos);
|
| + ASSERT(strlen(backref.start()) - best.backref_size == 0);
|
| + prev_record->Truncate(unchanged_len + best.backref_size);
|
| }
|
| return true;
|
| }
|
|
|