Index: src/log-utils.cc |
diff --git a/src/log-utils.cc b/src/log-utils.cc |
index a16b07964334dabb98a5c60277374a82f084d381..8a6989b3140122b28fab806ae3ab762d4bfa3da8 100644 |
--- a/src/log-utils.cc |
+++ b/src/log-utils.cc |
@@ -34,11 +34,14 @@ namespace internal { |
#ifdef ENABLE_LOGGING_AND_PROFILING |
-LogDynamicBuffer::LogDynamicBuffer(int block_size, int max_size) |
+LogDynamicBuffer::LogDynamicBuffer( |
+ int block_size, int max_size, const char* seal, int seal_size) |
: block_size_(block_size), |
max_size_(max_size - (max_size % block_size_)), |
+ seal_(seal), |
+ seal_size_(seal_size), |
blocks_(max_size_ / block_size_ + 1), |
- write_pos_(0), block_index_(0), block_write_pos_(0) { |
+ write_pos_(0), block_index_(0), block_write_pos_(0), is_sealed_(false) { |
ASSERT(BlocksCount() > 0); |
AllocateBlock(0); |
for (int i = 1; i < BlocksCount(); ++i) { |
@@ -78,8 +81,24 @@ int LogDynamicBuffer::Read(int from_pos, char* dest_buf, int buf_size) { |
} |
+int LogDynamicBuffer::Seal() { |
+ WriteInternal(seal_, seal_size_); |
+ is_sealed_ = true; |
+ return 0; |
+} |
+ |
+ |
int LogDynamicBuffer::Write(const char* data, int data_size) { |
- if ((write_pos_ + data_size) > max_size_) return 0; |
+ if (is_sealed_) return 0; |
Søren Thygesen Gjesse
2009/05/28 13:23:35
Please use {} for one line if's.
Mikhail Naganov
2009/05/28 13:52:52
Done.
|
+ if ((write_pos_ + data_size) <= (max_size_ - seal_size_)) { |
+ return WriteInternal(data, data_size); |
+ } else { |
+ return Seal(); |
+ } |
+} |
+ |
+ |
+int LogDynamicBuffer::WriteInternal(const char* data, int data_size) { |
int data_pos = 0; |
while (data_pos < data_size) { |
const int write_size = |
@@ -98,9 +117,12 @@ int LogDynamicBuffer::Write(const char* data, int data_size) { |
} |
+bool Log::is_stopped_ = false; |
Log::WritePtr Log::Write = NULL; |
FILE* Log::output_handle_ = NULL; |
LogDynamicBuffer* Log::output_buffer_ = NULL; |
+// Must be the same message as in Logger::PauseProfiler |
+const char* Log::kDynamicBufferSeal = "profiler,\"pause\"\n"; |
Mutex* Log::mutex_ = NULL; |
char* Log::message_buffer_ = NULL; |
@@ -130,7 +152,8 @@ void Log::OpenFile(const char* name) { |
void Log::OpenMemoryBuffer() { |
ASSERT(!IsEnabled()); |
output_buffer_ = new LogDynamicBuffer( |
- kDynamicBufferBlockSize, kMaxDynamicBufferSize); |
+ kDynamicBufferBlockSize, kMaxDynamicBufferSize, |
+ kDynamicBufferSeal, strlen(kDynamicBufferSeal)); |
Write = WriteToMemory; |
Init(); |
} |
@@ -150,6 +173,8 @@ void Log::Close() { |
delete mutex_; |
mutex_ = NULL; |
+ |
+ is_stopped_ = false; |
} |
@@ -171,6 +196,10 @@ int Log::GetLogLines(int from_pos, char* dest_buf, int max_size) { |
} |
+LogMessageBuilder::WriteFailureHandler |
+ LogMessageBuilder::write_failure_handler = NULL; |
+ |
+ |
LogMessageBuilder::LogMessageBuilder(): sl(Log::mutex_), pos_(0) { |
ASSERT(Log::message_buffer_ != NULL); |
} |
@@ -251,13 +280,17 @@ void LogMessageBuilder::AppendDetailed(String* str, bool show_impl_info) { |
void LogMessageBuilder::WriteToLogFile() { |
ASSERT(pos_ <= Log::kMessageBufferSize); |
- Log::Write(Log::message_buffer_, pos_); |
+ if (pos_ != Log::Write(Log::message_buffer_, pos_)) { |
Søren Thygesen Gjesse
2009/05/28 13:23:35
I would suggest the following:
int written = Log:
Mikhail Naganov
2009/05/28 13:52:52
Done. Thanks for noticing.
|
+ if (write_failure_handler != NULL) write_failure_handler(); |
+ } |
} |
void LogMessageBuilder::WriteCStringToLogFile(const char* str) { |
int len = strlen(str); |
- Log::Write(str, len); |
+ if (len != Log::Write(str, len)) { |
Søren Thygesen Gjesse
2009/05/28 13:23:35
Ditto.
Mikhail Naganov
2009/05/28 13:52:52
Done.
|
+ if (write_failure_handler != NULL) write_failure_handler(); |
+ } |
} |
#endif // ENABLE_LOGGING_AND_PROFILING |