| OLD | NEW |
| 1 // Copyright 2009 the V8 project authors. All rights reserved. | 1 // Copyright 2009 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "src/v8.h" | 5 #include "src/v8.h" |
| 6 | 6 |
| 7 #include "src/log-utils.h" | 7 #include "src/log-utils.h" |
| 8 #include "src/string-stream.h" | 8 #include "src/string-stream.h" |
| 9 | 9 |
| 10 namespace v8 { | 10 namespace v8 { |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 47 } else if (strcmp(log_file_name, kLogToTemporaryFile) == 0) { | 47 } else if (strcmp(log_file_name, kLogToTemporaryFile) == 0) { |
| 48 OpenTemporaryFile(); | 48 OpenTemporaryFile(); |
| 49 } else { | 49 } else { |
| 50 OpenFile(log_file_name); | 50 OpenFile(log_file_name); |
| 51 } | 51 } |
| 52 } | 52 } |
| 53 } | 53 } |
| 54 | 54 |
| 55 | 55 |
| 56 void Log::OpenStdout() { | 56 void Log::OpenStdout() { |
| 57 ASSERT(!IsEnabled()); | 57 DCHECK(!IsEnabled()); |
| 58 output_handle_ = stdout; | 58 output_handle_ = stdout; |
| 59 } | 59 } |
| 60 | 60 |
| 61 | 61 |
| 62 void Log::OpenTemporaryFile() { | 62 void Log::OpenTemporaryFile() { |
| 63 ASSERT(!IsEnabled()); | 63 DCHECK(!IsEnabled()); |
| 64 output_handle_ = base::OS::OpenTemporaryFile(); | 64 output_handle_ = base::OS::OpenTemporaryFile(); |
| 65 } | 65 } |
| 66 | 66 |
| 67 | 67 |
| 68 void Log::OpenFile(const char* name) { | 68 void Log::OpenFile(const char* name) { |
| 69 ASSERT(!IsEnabled()); | 69 DCHECK(!IsEnabled()); |
| 70 output_handle_ = base::OS::FOpen(name, base::OS::LogFileOpenMode); | 70 output_handle_ = base::OS::FOpen(name, base::OS::LogFileOpenMode); |
| 71 } | 71 } |
| 72 | 72 |
| 73 | 73 |
| 74 FILE* Log::Close() { | 74 FILE* Log::Close() { |
| 75 FILE* result = NULL; | 75 FILE* result = NULL; |
| 76 if (output_handle_ != NULL) { | 76 if (output_handle_ != NULL) { |
| 77 if (strcmp(FLAG_logfile, kLogToTemporaryFile) != 0) { | 77 if (strcmp(FLAG_logfile, kLogToTemporaryFile) != 0) { |
| 78 fclose(output_handle_); | 78 fclose(output_handle_); |
| 79 } else { | 79 } else { |
| 80 result = output_handle_; | 80 result = output_handle_; |
| 81 } | 81 } |
| 82 } | 82 } |
| 83 output_handle_ = NULL; | 83 output_handle_ = NULL; |
| 84 | 84 |
| 85 DeleteArray(message_buffer_); | 85 DeleteArray(message_buffer_); |
| 86 message_buffer_ = NULL; | 86 message_buffer_ = NULL; |
| 87 | 87 |
| 88 is_stopped_ = false; | 88 is_stopped_ = false; |
| 89 return result; | 89 return result; |
| 90 } | 90 } |
| 91 | 91 |
| 92 | 92 |
| 93 Log::MessageBuilder::MessageBuilder(Log* log) | 93 Log::MessageBuilder::MessageBuilder(Log* log) |
| 94 : log_(log), | 94 : log_(log), |
| 95 lock_guard_(&log_->mutex_), | 95 lock_guard_(&log_->mutex_), |
| 96 pos_(0) { | 96 pos_(0) { |
| 97 ASSERT(log_->message_buffer_ != NULL); | 97 DCHECK(log_->message_buffer_ != NULL); |
| 98 } | 98 } |
| 99 | 99 |
| 100 | 100 |
| 101 void Log::MessageBuilder::Append(const char* format, ...) { | 101 void Log::MessageBuilder::Append(const char* format, ...) { |
| 102 Vector<char> buf(log_->message_buffer_ + pos_, | 102 Vector<char> buf(log_->message_buffer_ + pos_, |
| 103 Log::kMessageBufferSize - pos_); | 103 Log::kMessageBufferSize - pos_); |
| 104 va_list args; | 104 va_list args; |
| 105 va_start(args, format); | 105 va_start(args, format); |
| 106 AppendVA(format, args); | 106 AppendVA(format, args); |
| 107 va_end(args); | 107 va_end(args); |
| 108 ASSERT(pos_ <= Log::kMessageBufferSize); | 108 DCHECK(pos_ <= Log::kMessageBufferSize); |
| 109 } | 109 } |
| 110 | 110 |
| 111 | 111 |
| 112 void Log::MessageBuilder::AppendVA(const char* format, va_list args) { | 112 void Log::MessageBuilder::AppendVA(const char* format, va_list args) { |
| 113 Vector<char> buf(log_->message_buffer_ + pos_, | 113 Vector<char> buf(log_->message_buffer_ + pos_, |
| 114 Log::kMessageBufferSize - pos_); | 114 Log::kMessageBufferSize - pos_); |
| 115 int result = v8::internal::VSNPrintF(buf, format, args); | 115 int result = v8::internal::VSNPrintF(buf, format, args); |
| 116 | 116 |
| 117 // Result is -1 if output was truncated. | 117 // Result is -1 if output was truncated. |
| 118 if (result >= 0) { | 118 if (result >= 0) { |
| 119 pos_ += result; | 119 pos_ += result; |
| 120 } else { | 120 } else { |
| 121 pos_ = Log::kMessageBufferSize; | 121 pos_ = Log::kMessageBufferSize; |
| 122 } | 122 } |
| 123 ASSERT(pos_ <= Log::kMessageBufferSize); | 123 DCHECK(pos_ <= Log::kMessageBufferSize); |
| 124 } | 124 } |
| 125 | 125 |
| 126 | 126 |
| 127 void Log::MessageBuilder::Append(const char c) { | 127 void Log::MessageBuilder::Append(const char c) { |
| 128 if (pos_ < Log::kMessageBufferSize) { | 128 if (pos_ < Log::kMessageBufferSize) { |
| 129 log_->message_buffer_[pos_++] = c; | 129 log_->message_buffer_[pos_++] = c; |
| 130 } | 130 } |
| 131 ASSERT(pos_ <= Log::kMessageBufferSize); | 131 DCHECK(pos_ <= Log::kMessageBufferSize); |
| 132 } | 132 } |
| 133 | 133 |
| 134 | 134 |
| 135 void Log::MessageBuilder::AppendDoubleQuotedString(const char* string) { | 135 void Log::MessageBuilder::AppendDoubleQuotedString(const char* string) { |
| 136 Append('"'); | 136 Append('"'); |
| 137 for (const char* p = string; *p != '\0'; p++) { | 137 for (const char* p = string; *p != '\0'; p++) { |
| 138 if (*p == '"') { | 138 if (*p == '"') { |
| 139 Append('\\'); | 139 Append('\\'); |
| 140 } | 140 } |
| 141 Append(*p); | 141 Append(*p); |
| (...skipping 10 matching lines...) Expand all Loading... |
| 152 } | 152 } |
| 153 } | 153 } |
| 154 | 154 |
| 155 | 155 |
| 156 void Log::MessageBuilder::AppendAddress(Address addr) { | 156 void Log::MessageBuilder::AppendAddress(Address addr) { |
| 157 Append("0x%" V8PRIxPTR, addr); | 157 Append("0x%" V8PRIxPTR, addr); |
| 158 } | 158 } |
| 159 | 159 |
| 160 | 160 |
| 161 void Log::MessageBuilder::AppendSymbolName(Symbol* symbol) { | 161 void Log::MessageBuilder::AppendSymbolName(Symbol* symbol) { |
| 162 ASSERT(symbol); | 162 DCHECK(symbol); |
| 163 Append("symbol("); | 163 Append("symbol("); |
| 164 if (!symbol->name()->IsUndefined()) { | 164 if (!symbol->name()->IsUndefined()) { |
| 165 Append("\""); | 165 Append("\""); |
| 166 AppendDetailed(String::cast(symbol->name()), false); | 166 AppendDetailed(String::cast(symbol->name()), false); |
| 167 Append("\" "); | 167 Append("\" "); |
| 168 } | 168 } |
| 169 Append("hash %x)", symbol->Hash()); | 169 Append("hash %x)", symbol->Hash()); |
| 170 } | 170 } |
| 171 | 171 |
| 172 | 172 |
| (...skipping 26 matching lines...) Expand all Loading... |
| 199 } else { | 199 } else { |
| 200 Append("%lc", c); | 200 Append("%lc", c); |
| 201 } | 201 } |
| 202 } | 202 } |
| 203 } | 203 } |
| 204 | 204 |
| 205 | 205 |
| 206 void Log::MessageBuilder::AppendStringPart(const char* str, int len) { | 206 void Log::MessageBuilder::AppendStringPart(const char* str, int len) { |
| 207 if (pos_ + len > Log::kMessageBufferSize) { | 207 if (pos_ + len > Log::kMessageBufferSize) { |
| 208 len = Log::kMessageBufferSize - pos_; | 208 len = Log::kMessageBufferSize - pos_; |
| 209 ASSERT(len >= 0); | 209 DCHECK(len >= 0); |
| 210 if (len == 0) return; | 210 if (len == 0) return; |
| 211 } | 211 } |
| 212 Vector<char> buf(log_->message_buffer_ + pos_, | 212 Vector<char> buf(log_->message_buffer_ + pos_, |
| 213 Log::kMessageBufferSize - pos_); | 213 Log::kMessageBufferSize - pos_); |
| 214 StrNCpy(buf, str, len); | 214 StrNCpy(buf, str, len); |
| 215 pos_ += len; | 215 pos_ += len; |
| 216 ASSERT(pos_ <= Log::kMessageBufferSize); | 216 DCHECK(pos_ <= Log::kMessageBufferSize); |
| 217 } | 217 } |
| 218 | 218 |
| 219 | 219 |
| 220 void Log::MessageBuilder::WriteToLogFile() { | 220 void Log::MessageBuilder::WriteToLogFile() { |
| 221 ASSERT(pos_ <= Log::kMessageBufferSize); | 221 DCHECK(pos_ <= Log::kMessageBufferSize); |
| 222 // Assert that we do not already have a new line at the end. | 222 // Assert that we do not already have a new line at the end. |
| 223 ASSERT(pos_ == 0 || log_->message_buffer_[pos_ - 1] != '\n'); | 223 DCHECK(pos_ == 0 || log_->message_buffer_[pos_ - 1] != '\n'); |
| 224 if (pos_ == Log::kMessageBufferSize) pos_--; | 224 if (pos_ == Log::kMessageBufferSize) pos_--; |
| 225 log_->message_buffer_[pos_++] = '\n'; | 225 log_->message_buffer_[pos_++] = '\n'; |
| 226 const int written = log_->WriteToFile(log_->message_buffer_, pos_); | 226 const int written = log_->WriteToFile(log_->message_buffer_, pos_); |
| 227 if (written != pos_) { | 227 if (written != pos_) { |
| 228 log_->stop(); | 228 log_->stop(); |
| 229 log_->logger_->LogFailure(); | 229 log_->logger_->LogFailure(); |
| 230 } | 230 } |
| 231 } | 231 } |
| 232 | 232 |
| 233 | 233 |
| 234 } } // namespace v8::internal | 234 } } // namespace v8::internal |
| OLD | NEW |