Index: src/log.cc |
diff --git a/src/log.cc b/src/log.cc |
index d9e304d606ce61a9289f1bb8f38f22d6426633dd..951256ec82458b39fe74f89bf39514333b6734d3 100644 |
--- a/src/log.cc |
+++ b/src/log.cc |
@@ -36,7 +36,8 @@ |
#include "serialize.h" |
#include "string-stream.h" |
-namespace v8 { namespace internal { |
+namespace v8 { |
+namespace internal { |
#ifdef ENABLE_LOGGING_AND_PROFILING |
@@ -285,8 +286,186 @@ void Profiler::Run() { |
#ifdef ENABLE_LOGGING_AND_PROFILING |
+ |
+// Functions and data for performing output of log messages. |
+class Log : public AllStatic { |
+ public: |
+ // Opens stdout for logging. |
+ static void OpenStdout(); |
+ |
+ // Opens file for logging. |
+ static void OpenFile(const char* name); |
+ |
+ // Opens memory buffer for logging. |
+ static void OpenMemoryBuffer(); |
+ |
+ // Frees all resources acquired in Open... functions. |
+ static void Close(); |
+ |
+ // See description in include/v8.h. |
+ static int GetLogLines(int from_pos, char* dest_buf, int max_size); |
+ |
+ // Returns whether logging is enabled. |
+ static bool is_enabled() { |
+ return output_handle_ != NULL || output_buffer_ != NULL; |
+ } |
+ |
+ private: |
+ typedef int (*WritePtr)(const char* msg, int length); |
+ |
+ // Initialization function called from Open... functions. |
+ static void Init(); |
+ |
+ // Write functions assume that mutex_ is acquired by the caller. |
+ static WritePtr Write; |
+ |
+ // Implementation of writing to a log file. |
+ static int WriteToFile(const char* msg, int length) { |
+ ASSERT(output_handle_ != NULL); |
+ int rv = fwrite(msg, 1, length, output_handle_); |
+ ASSERT(length == rv); |
+ return rv; |
+ } |
+ |
+ // Implementation of writing to a memory buffer. |
+ static int WriteToMemory(const char* msg, int length) { |
+ ASSERT(output_buffer_ != NULL); |
+ ASSERT(output_buffer_write_pos_ >= output_buffer_); |
+ if (output_buffer_write_pos_ + length |
+ <= output_buffer_ + kOutputBufferSize) { |
+ memcpy(output_buffer_write_pos_, msg, length); |
+ output_buffer_write_pos_ += length; |
+ return length; |
+ } else { |
+ // Memory buffer is full, ignore write. |
+ return 0; |
+ } |
+ } |
+ |
+ // When logging is active, either output_handle_ or output_buffer_ is used |
+ // to store a pointer to log destination. If logging was opened via OpenStdout |
+ // or OpenFile, then output_handle_ is used. If logging was opened |
+ // via OpenMemoryBuffer, then output_buffer_ is used. |
+ // mutex_ should be acquired before using output_handle_ or output_buffer_. |
+ static FILE* output_handle_; |
+ |
+ static char* output_buffer_; |
+ |
+ // mutex_ is a Mutex used for enforcing exclusive |
+ // access to the formatting buffer and the log file or log memory buffer. |
+ static Mutex* mutex_; |
+ |
+ // Size of buffer used for memory logging. |
+ static const int kOutputBufferSize = 2 * 1024 * 1024; |
+ |
+ // Writing position in a memory buffer. |
+ static char* output_buffer_write_pos_; |
+ |
+ // Size of buffer used for formatting log messages. |
+ static const int kMessageBufferSize = 2048; |
+ |
+ // Buffer used for formatting log messages. This is a singleton buffer and |
+ // mutex_ should be acquired before using it. |
+ static char* message_buffer_; |
+ |
+ friend class LogMessageBuilder; |
+}; |
+ |
+ |
+Log::WritePtr Log::Write = NULL; |
+FILE* Log::output_handle_ = NULL; |
+char* Log::output_buffer_ = NULL; |
+Mutex* Log::mutex_ = NULL; |
+char* Log::output_buffer_write_pos_ = NULL; |
+char* Log::message_buffer_ = NULL; |
+ |
+ |
+void Log::Init() { |
+ mutex_ = OS::CreateMutex(); |
+ message_buffer_ = NewArray<char>(kMessageBufferSize); |
+} |
+ |
+ |
+void Log::OpenStdout() { |
+ ASSERT(!is_enabled()); |
+ output_handle_ = stdout; |
+ Write = WriteToFile; |
+ Init(); |
+} |
+ |
+ |
+void Log::OpenFile(const char* name) { |
+ ASSERT(!is_enabled()); |
+ output_handle_ = OS::FOpen(name, OS::LogFileOpenMode); |
+ Write = WriteToFile; |
+ Init(); |
+} |
+ |
+ |
+void Log::OpenMemoryBuffer() { |
+ ASSERT(!is_enabled()); |
+ output_buffer_ = NewArray<char>(kOutputBufferSize); |
+ output_buffer_write_pos_ = output_buffer_; |
+ Write = WriteToMemory; |
+ Init(); |
+} |
+ |
+ |
+void Log::Close() { |
+ if (Write == WriteToFile) { |
+ fclose(output_handle_); |
+ output_handle_ = NULL; |
+ } else if (Write == WriteToMemory) { |
+ DeleteArray(output_buffer_); |
+ output_buffer_ = NULL; |
+ } else { |
+ ASSERT(Write == NULL); |
+ } |
+ Write = NULL; |
+ |
+ delete mutex_; |
+ mutex_ = NULL; |
+ |
+ DeleteArray(message_buffer_); |
+ message_buffer_ = NULL; |
+} |
+ |
+ |
+int Log::GetLogLines(int from_pos, char* dest_buf, int max_size) { |
+ ASSERT(output_buffer_ != NULL); |
+ ASSERT(output_buffer_write_pos_ >= output_buffer_); |
+ ASSERT(from_pos >= 0); |
+ ASSERT(max_size >= 0); |
+ int actual_size = max_size; |
+ char* buffer_read_pos = output_buffer_ + from_pos; |
+ ScopedLock sl(mutex_); |
+ if (actual_size == 0 |
+ || output_buffer_write_pos_ == output_buffer_ |
+ || buffer_read_pos >= output_buffer_write_pos_) { |
+ // No data requested or can be returned. |
+ return 0; |
+ } |
+ if (buffer_read_pos + actual_size > output_buffer_write_pos_) { |
+ // Requested size overlaps with current writing position and |
+ // needs to be truncated. |
+ actual_size = output_buffer_write_pos_ - buffer_read_pos; |
+ ASSERT(actual_size == 0 || buffer_read_pos[actual_size - 1] == '\n'); |
+ } else { |
+ // Find previous log line boundary. |
+ char* end_pos = buffer_read_pos + actual_size - 1; |
+ while (end_pos >= buffer_read_pos && *end_pos != '\n') --end_pos; |
+ actual_size = end_pos - buffer_read_pos + 1; |
+ } |
+ ASSERT(actual_size <= max_size); |
+ if (actual_size > 0) { |
+ memcpy(dest_buf, buffer_read_pos, actual_size); |
+ } |
+ return actual_size; |
+} |
+ |
+ |
// Utility class for formatting log messages. It fills the message into the |
-// static buffer in Logger. |
+// static buffer in Log. |
class LogMessageBuilder BASE_EMBEDDED { |
public: |
explicit LogMessageBuilder(); |
@@ -309,45 +488,45 @@ class LogMessageBuilder BASE_EMBEDDED { |
// Create a message builder starting from position 0. This acquires the mutex |
// in the logger as well. |
-LogMessageBuilder::LogMessageBuilder(): sl(Logger::mutex_), pos_(0) { |
- ASSERT(Logger::message_buffer_ != NULL); |
+LogMessageBuilder::LogMessageBuilder(): sl(Log::mutex_), pos_(0) { |
+ ASSERT(Log::message_buffer_ != NULL); |
} |
// Append string data to the log message. |
void LogMessageBuilder::Append(const char* format, ...) { |
- Vector<char> buf(Logger::message_buffer_ + pos_, |
- Logger::kMessageBufferSize - pos_); |
+ Vector<char> buf(Log::message_buffer_ + pos_, |
+ Log::kMessageBufferSize - pos_); |
va_list args; |
va_start(args, format); |
Append(format, args); |
va_end(args); |
- ASSERT(pos_ <= Logger::kMessageBufferSize); |
+ ASSERT(pos_ <= Log::kMessageBufferSize); |
} |
// Append string data to the log message. |
void LogMessageBuilder::Append(const char* format, va_list args) { |
- Vector<char> buf(Logger::message_buffer_ + pos_, |
- Logger::kMessageBufferSize - pos_); |
+ Vector<char> buf(Log::message_buffer_ + pos_, |
+ Log::kMessageBufferSize - pos_); |
int result = v8::internal::OS::VSNPrintF(buf, format, args); |
// Result is -1 if output was truncated. |
if (result >= 0) { |
pos_ += result; |
} else { |
- pos_ = Logger::kMessageBufferSize; |
+ pos_ = Log::kMessageBufferSize; |
} |
- ASSERT(pos_ <= Logger::kMessageBufferSize); |
+ ASSERT(pos_ <= Log::kMessageBufferSize); |
} |
// Append a character to the log message. |
void LogMessageBuilder::Append(const char c) { |
- if (pos_ < Logger::kMessageBufferSize) { |
- Logger::message_buffer_[pos_++] = c; |
+ if (pos_ < Log::kMessageBufferSize) { |
+ Log::message_buffer_[pos_++] = c; |
} |
- ASSERT(pos_ <= Logger::kMessageBufferSize); |
+ ASSERT(pos_ <= Log::kMessageBufferSize); |
} |
@@ -391,18 +570,14 @@ void LogMessageBuilder::AppendDetailed(String* str, bool show_impl_info) { |
// Write the log message to the log file currently opened. |
void LogMessageBuilder::WriteToLogFile() { |
- ASSERT(pos_ <= Logger::kMessageBufferSize); |
- size_t rv = fwrite(Logger::message_buffer_, 1, pos_, Logger::logfile_); |
- ASSERT(rv == static_cast<size_t>(pos_)); |
- USE(rv); |
+ ASSERT(pos_ <= Log::kMessageBufferSize); |
+ Log::Write(Log::message_buffer_, pos_); |
} |
// Write a null-terminated string to to the log file currently opened. |
void LogMessageBuilder::WriteCStringToLogFile(const char* str) { |
- size_t len = strlen(str); |
- size_t rv = fwrite(str, 1, len, Logger::logfile_); |
- ASSERT(rv == len); |
- USE(rv); |
+ int len = strlen(str); |
+ Log::Write(str, len); |
} |
#endif |
@@ -411,20 +586,22 @@ void LogMessageBuilder::WriteCStringToLogFile(const char* str) { |
// Logger class implementation. |
// |
Ticker* Logger::ticker_ = NULL; |
-char* Logger::message_buffer_ = NULL; |
-FILE* Logger::logfile_ = NULL; |
Profiler* Logger::profiler_ = NULL; |
-Mutex* Logger::mutex_ = NULL; |
VMState* Logger::current_state_ = NULL; |
VMState Logger::bottom_state_(EXTERNAL); |
SlidingStateWindow* Logger::sliding_state_window_ = NULL; |
+ |
+bool Logger::IsEnabled() { |
+ return Log::is_enabled(); |
+} |
+ |
#endif // ENABLE_LOGGING_AND_PROFILING |
void Logger::Preamble(const char* content) { |
#ifdef ENABLE_LOGGING_AND_PROFILING |
- if (logfile_ == NULL || !FLAG_log_code) return; |
+ if (!Log::is_enabled() || !FLAG_log_code) return; |
LogMessageBuilder msg; |
msg.WriteCStringToLogFile(content); |
#endif |
@@ -440,7 +617,7 @@ void Logger::StringEvent(const char* name, const char* value) { |
#ifdef ENABLE_LOGGING_AND_PROFILING |
void Logger::UncheckedStringEvent(const char* name, const char* value) { |
- if (logfile_ == NULL) return; |
+ if (!Log::is_enabled()) return; |
LogMessageBuilder msg; |
msg.Append("%s,\"%s\"\n", name, value); |
msg.WriteToLogFile(); |
@@ -450,7 +627,7 @@ void Logger::UncheckedStringEvent(const char* name, const char* value) { |
void Logger::IntEvent(const char* name, int value) { |
#ifdef ENABLE_LOGGING_AND_PROFILING |
- if (logfile_ == NULL || !FLAG_log) return; |
+ if (!Log::is_enabled() || !FLAG_log) return; |
LogMessageBuilder msg; |
msg.Append("%s,%d\n", name, value); |
msg.WriteToLogFile(); |
@@ -460,7 +637,7 @@ void Logger::IntEvent(const char* name, int value) { |
void Logger::HandleEvent(const char* name, Object** location) { |
#ifdef ENABLE_LOGGING_AND_PROFILING |
- if (logfile_ == NULL || !FLAG_log_handles) return; |
+ if (!Log::is_enabled() || !FLAG_log_handles) return; |
LogMessageBuilder msg; |
msg.Append("%s,0x%x\n", name, |
reinterpret_cast<unsigned int>(location)); |
@@ -471,10 +648,10 @@ void Logger::HandleEvent(const char* name, Object** location) { |
#ifdef ENABLE_LOGGING_AND_PROFILING |
// ApiEvent is private so all the calls come from the Logger class. It is the |
-// caller's responsibility to ensure that logfile_ is not NULL and that |
+// caller's responsibility to ensure that log is enabled and that |
// FLAG_log_api is true. |
void Logger::ApiEvent(const char* format, ...) { |
- ASSERT(logfile_ != NULL && FLAG_log_api); |
+ ASSERT(Log::is_enabled() && FLAG_log_api); |
LogMessageBuilder msg; |
va_list ap; |
va_start(ap, format); |
@@ -487,7 +664,7 @@ void Logger::ApiEvent(const char* format, ...) { |
void Logger::ApiNamedSecurityCheck(Object* key) { |
#ifdef ENABLE_LOGGING_AND_PROFILING |
- if (logfile_ == NULL || !FLAG_log_api) return; |
+ if (!Log::is_enabled() || !FLAG_log_api) return; |
if (key->IsString()) { |
SmartPointer<char> str = |
String::cast(key)->ToCString(DISALLOW_NULLS, ROBUST_STRING_TRAVERSAL); |
@@ -505,7 +682,7 @@ void Logger::SharedLibraryEvent(const char* library_path, |
unsigned start, |
unsigned end) { |
#ifdef ENABLE_LOGGING_AND_PROFILING |
- if (logfile_ == NULL || !FLAG_prof) return; |
+ if (!Log::is_enabled() || !FLAG_prof) return; |
LogMessageBuilder msg; |
msg.Append("shared-library,\"%s\",0x%08x,0x%08x\n", library_path, |
start, end); |
@@ -518,7 +695,7 @@ void Logger::SharedLibraryEvent(const wchar_t* library_path, |
unsigned start, |
unsigned end) { |
#ifdef ENABLE_LOGGING_AND_PROFILING |
- if (logfile_ == NULL || !FLAG_prof) return; |
+ if (!Log::is_enabled() || !FLAG_prof) return; |
LogMessageBuilder msg; |
msg.Append("shared-library,\"%ls\",0x%08x,0x%08x\n", library_path, |
start, end); |
@@ -573,7 +750,7 @@ void Logger::LogRegExpSource(Handle<JSRegExp> regexp) { |
void Logger::RegExpCompileEvent(Handle<JSRegExp> regexp, bool in_cache) { |
#ifdef ENABLE_LOGGING_AND_PROFILING |
- if (logfile_ == NULL || !FLAG_log_regexp) return; |
+ if (!Log::is_enabled() || !FLAG_log_regexp) return; |
LogMessageBuilder msg; |
msg.Append("regexp-compile,"); |
LogRegExpSource(regexp); |
@@ -585,7 +762,7 @@ void Logger::RegExpCompileEvent(Handle<JSRegExp> regexp, bool in_cache) { |
void Logger::LogRuntime(Vector<const char> format, JSArray* args) { |
#ifdef ENABLE_LOGGING_AND_PROFILING |
- if (logfile_ == NULL || !FLAG_log_runtime) return; |
+ if (!Log::is_enabled() || !FLAG_log_runtime) return; |
HandleScope scope; |
LogMessageBuilder msg; |
for (int i = 0; i < format.length(); i++) { |
@@ -626,7 +803,7 @@ void Logger::LogRuntime(Vector<const char> format, JSArray* args) { |
void Logger::ApiIndexedSecurityCheck(uint32_t index) { |
#ifdef ENABLE_LOGGING_AND_PROFILING |
- if (logfile_ == NULL || !FLAG_log_api) return; |
+ if (!Log::is_enabled() || !FLAG_log_api) return; |
ApiEvent("api,check-security,%u\n", index); |
#endif |
} |
@@ -637,7 +814,7 @@ void Logger::ApiNamedPropertyAccess(const char* tag, |
Object* name) { |
#ifdef ENABLE_LOGGING_AND_PROFILING |
ASSERT(name->IsString()); |
- if (logfile_ == NULL || !FLAG_log_api) return; |
+ if (!Log::is_enabled() || !FLAG_log_api) return; |
String* class_name_obj = holder->class_name(); |
SmartPointer<char> class_name = |
class_name_obj->ToCString(DISALLOW_NULLS, ROBUST_STRING_TRAVERSAL); |
@@ -651,7 +828,7 @@ void Logger::ApiIndexedPropertyAccess(const char* tag, |
JSObject* holder, |
uint32_t index) { |
#ifdef ENABLE_LOGGING_AND_PROFILING |
- if (logfile_ == NULL || !FLAG_log_api) return; |
+ if (!Log::is_enabled() || !FLAG_log_api) return; |
String* class_name_obj = holder->class_name(); |
SmartPointer<char> class_name = |
class_name_obj->ToCString(DISALLOW_NULLS, ROBUST_STRING_TRAVERSAL); |
@@ -661,7 +838,7 @@ void Logger::ApiIndexedPropertyAccess(const char* tag, |
void Logger::ApiObjectAccess(const char* tag, JSObject* object) { |
#ifdef ENABLE_LOGGING_AND_PROFILING |
- if (logfile_ == NULL || !FLAG_log_api) return; |
+ if (!Log::is_enabled() || !FLAG_log_api) return; |
String* class_name_obj = object->class_name(); |
SmartPointer<char> class_name = |
class_name_obj->ToCString(DISALLOW_NULLS, ROBUST_STRING_TRAVERSAL); |
@@ -672,7 +849,7 @@ void Logger::ApiObjectAccess(const char* tag, JSObject* object) { |
void Logger::ApiEntryCall(const char* name) { |
#ifdef ENABLE_LOGGING_AND_PROFILING |
- if (logfile_ == NULL || !FLAG_log_api) return; |
+ if (!Log::is_enabled() || !FLAG_log_api) return; |
Logger::ApiEvent("api,%s\n", name); |
#endif |
} |
@@ -680,7 +857,7 @@ void Logger::ApiEntryCall(const char* name) { |
void Logger::NewEvent(const char* name, void* object, size_t size) { |
#ifdef ENABLE_LOGGING_AND_PROFILING |
- if (logfile_ == NULL || !FLAG_log) return; |
+ if (!Log::is_enabled() || !FLAG_log) return; |
LogMessageBuilder msg; |
msg.Append("new,%s,0x%x,%u\n", name, |
reinterpret_cast<unsigned int>(object), |
@@ -692,7 +869,7 @@ void Logger::NewEvent(const char* name, void* object, size_t size) { |
void Logger::DeleteEvent(const char* name, void* object) { |
#ifdef ENABLE_LOGGING_AND_PROFILING |
- if (logfile_ == NULL || !FLAG_log) return; |
+ if (!Log::is_enabled() || !FLAG_log) return; |
LogMessageBuilder msg; |
msg.Append("delete,%s,0x%x\n", name, |
reinterpret_cast<unsigned int>(object)); |
@@ -703,7 +880,7 @@ void Logger::DeleteEvent(const char* name, void* object) { |
void Logger::CodeCreateEvent(const char* tag, Code* code, const char* comment) { |
#ifdef ENABLE_LOGGING_AND_PROFILING |
- if (logfile_ == NULL || !FLAG_log_code) return; |
+ if (!Log::is_enabled() || !FLAG_log_code) return; |
LogMessageBuilder msg; |
msg.Append("code-creation,%s,0x%x,%d,\"", tag, |
reinterpret_cast<unsigned int>(code->address()), |
@@ -723,7 +900,7 @@ void Logger::CodeCreateEvent(const char* tag, Code* code, const char* comment) { |
void Logger::CodeCreateEvent(const char* tag, Code* code, String* name) { |
#ifdef ENABLE_LOGGING_AND_PROFILING |
- if (logfile_ == NULL || !FLAG_log_code) return; |
+ if (!Log::is_enabled() || !FLAG_log_code) return; |
LogMessageBuilder msg; |
SmartPointer<char> str = |
name->ToCString(DISALLOW_NULLS, ROBUST_STRING_TRAVERSAL); |
@@ -738,7 +915,7 @@ void Logger::CodeCreateEvent(const char* tag, Code* code, String* name) { |
void Logger::CodeCreateEvent(const char* tag, Code* code, String* name, |
String* source, int line) { |
#ifdef ENABLE_LOGGING_AND_PROFILING |
- if (logfile_ == NULL || !FLAG_log_code) return; |
+ if (!Log::is_enabled() || !FLAG_log_code) return; |
LogMessageBuilder msg; |
SmartPointer<char> str = |
name->ToCString(DISALLOW_NULLS, ROBUST_STRING_TRAVERSAL); |
@@ -755,7 +932,7 @@ void Logger::CodeCreateEvent(const char* tag, Code* code, String* name, |
void Logger::CodeCreateEvent(const char* tag, Code* code, int args_count) { |
#ifdef ENABLE_LOGGING_AND_PROFILING |
- if (logfile_ == NULL || !FLAG_log_code) return; |
+ if (!Log::is_enabled() || !FLAG_log_code) return; |
LogMessageBuilder msg; |
msg.Append("code-creation,%s,0x%x,%d,\"args_count: %d\"\n", tag, |
reinterpret_cast<unsigned int>(code->address()), |
@@ -768,7 +945,7 @@ void Logger::CodeCreateEvent(const char* tag, Code* code, int args_count) { |
void Logger::RegExpCodeCreateEvent(Code* code, String* source) { |
#ifdef ENABLE_LOGGING_AND_PROFILING |
- if (logfile_ == NULL || !FLAG_log_code) return; |
+ if (!Log::is_enabled() || !FLAG_log_code) return; |
LogMessageBuilder msg; |
msg.Append("code-creation,%s,0x%x,%d,\"", "RegExp", |
reinterpret_cast<unsigned int>(code->address()), |
@@ -782,7 +959,7 @@ void Logger::RegExpCodeCreateEvent(Code* code, String* source) { |
void Logger::CodeAllocateEvent(Code* code, Assembler* assem) { |
#ifdef ENABLE_LOGGING_AND_PROFILING |
- if (logfile_ == NULL || !FLAG_log_code) return; |
+ if (!Log::is_enabled() || !FLAG_log_code) return; |
LogMessageBuilder msg; |
msg.Append("code-allocate,0x%x,0x%x\n", |
reinterpret_cast<unsigned int>(code->address()), |
@@ -794,7 +971,7 @@ void Logger::CodeAllocateEvent(Code* code, Assembler* assem) { |
void Logger::CodeMoveEvent(Address from, Address to) { |
#ifdef ENABLE_LOGGING_AND_PROFILING |
- if (logfile_ == NULL || !FLAG_log_code) return; |
+ if (!Log::is_enabled() || !FLAG_log_code) return; |
LogMessageBuilder msg; |
msg.Append("code-move,0x%x,0x%x\n", |
reinterpret_cast<unsigned int>(from), |
@@ -806,7 +983,7 @@ void Logger::CodeMoveEvent(Address from, Address to) { |
void Logger::CodeDeleteEvent(Address from) { |
#ifdef ENABLE_LOGGING_AND_PROFILING |
- if (logfile_ == NULL || !FLAG_log_code) return; |
+ if (!Log::is_enabled() || !FLAG_log_code) return; |
LogMessageBuilder msg; |
msg.Append("code-delete,0x%x\n", reinterpret_cast<unsigned int>(from)); |
msg.WriteToLogFile(); |
@@ -818,7 +995,7 @@ void Logger::BeginCodeRegionEvent(CodeRegion* region, |
Assembler* masm, |
const char* name) { |
#ifdef ENABLE_LOGGING_AND_PROFILING |
- if (logfile_ == NULL || !FLAG_log_code) return; |
+ if (!Log::is_enabled() || !FLAG_log_code) return; |
LogMessageBuilder msg; |
msg.Append("begin-code-region,0x%x,0x%x,0x%x,%s\n", |
reinterpret_cast<unsigned int>(region), |
@@ -832,7 +1009,7 @@ void Logger::BeginCodeRegionEvent(CodeRegion* region, |
void Logger::EndCodeRegionEvent(CodeRegion* region, Assembler* masm) { |
#ifdef ENABLE_LOGGING_AND_PROFILING |
- if (logfile_ == NULL || !FLAG_log_code) return; |
+ if (!Log::is_enabled() || !FLAG_log_code) return; |
LogMessageBuilder msg; |
msg.Append("end-code-region,0x%x,0x%x,0x%x\n", |
reinterpret_cast<unsigned int>(region), |
@@ -845,7 +1022,7 @@ void Logger::EndCodeRegionEvent(CodeRegion* region, Assembler* masm) { |
void Logger::ResourceEvent(const char* name, const char* tag) { |
#ifdef ENABLE_LOGGING_AND_PROFILING |
- if (logfile_ == NULL || !FLAG_log) return; |
+ if (!Log::is_enabled() || !FLAG_log) return; |
LogMessageBuilder msg; |
msg.Append("%s,%s,", name, tag); |
@@ -863,12 +1040,11 @@ void Logger::ResourceEvent(const char* name, const char* tag) { |
void Logger::SuspectReadEvent(String* name, Object* obj) { |
#ifdef ENABLE_LOGGING_AND_PROFILING |
- if (logfile_ == NULL || !FLAG_log_suspect) return; |
+ if (!Log::is_enabled() || !FLAG_log_suspect) return; |
LogMessageBuilder msg; |
String* class_name = obj->IsJSObject() |
? JSObject::cast(obj)->class_name() |
: Heap::empty_string(); |
- ScopedLock sl(mutex_); |
msg.Append("suspect-read,"); |
msg.Append(class_name); |
msg.Append(','); |
@@ -883,7 +1059,7 @@ void Logger::SuspectReadEvent(String* name, Object* obj) { |
void Logger::HeapSampleBeginEvent(const char* space, const char* kind) { |
#ifdef ENABLE_LOGGING_AND_PROFILING |
- if (logfile_ == NULL || !FLAG_log_gc) return; |
+ if (!Log::is_enabled() || !FLAG_log_gc) return; |
LogMessageBuilder msg; |
msg.Append("heap-sample-begin,\"%s\",\"%s\"\n", space, kind); |
msg.WriteToLogFile(); |
@@ -893,7 +1069,7 @@ void Logger::HeapSampleBeginEvent(const char* space, const char* kind) { |
void Logger::HeapSampleEndEvent(const char* space, const char* kind) { |
#ifdef ENABLE_LOGGING_AND_PROFILING |
- if (logfile_ == NULL || !FLAG_log_gc) return; |
+ if (!Log::is_enabled() || !FLAG_log_gc) return; |
LogMessageBuilder msg; |
msg.Append("heap-sample-end,\"%s\",\"%s\"\n", space, kind); |
msg.WriteToLogFile(); |
@@ -903,7 +1079,7 @@ void Logger::HeapSampleEndEvent(const char* space, const char* kind) { |
void Logger::HeapSampleItemEvent(const char* type, int number, int bytes) { |
#ifdef ENABLE_LOGGING_AND_PROFILING |
- if (logfile_ == NULL || !FLAG_log_gc) return; |
+ if (!Log::is_enabled() || !FLAG_log_gc) return; |
LogMessageBuilder msg; |
msg.Append("heap-sample-item,%s,%d,%d\n", type, number, bytes); |
msg.WriteToLogFile(); |
@@ -913,7 +1089,7 @@ void Logger::HeapSampleItemEvent(const char* type, int number, int bytes) { |
void Logger::DebugTag(const char* call_site_tag) { |
#ifdef ENABLE_LOGGING_AND_PROFILING |
- if (logfile_ == NULL || !FLAG_log) return; |
+ if (!Log::is_enabled() || !FLAG_log) return; |
LogMessageBuilder msg; |
msg.Append("debug-tag,%s\n", call_site_tag); |
msg.WriteToLogFile(); |
@@ -923,7 +1099,7 @@ void Logger::DebugTag(const char* call_site_tag) { |
void Logger::DebugEvent(const char* event_type, Vector<uint16_t> parameter) { |
#ifdef ENABLE_LOGGING_AND_PROFILING |
- if (logfile_ == NULL || !FLAG_log) return; |
+ if (!Log::is_enabled() || !FLAG_log) return; |
StringBuilder s(parameter.length() + 1); |
for (int i = 0; i < parameter.length(); ++i) { |
s.AddCharacter(static_cast<char>(parameter[i])); |
@@ -942,7 +1118,7 @@ void Logger::DebugEvent(const char* event_type, Vector<uint16_t> parameter) { |
#ifdef ENABLE_LOGGING_AND_PROFILING |
void Logger::TickEvent(TickSample* sample, bool overflow) { |
- if (logfile_ == NULL || !FLAG_prof) return; |
+ if (!Log::is_enabled() || !FLAG_prof) return; |
LogMessageBuilder msg; |
msg.Append("tick,0x%x,0x%x,%d", sample->pc, sample->sp, |
static_cast<int>(sample->state)); |
@@ -970,6 +1146,12 @@ void Logger::PauseProfiler() { |
void Logger::ResumeProfiler() { |
profiler_->resume(); |
} |
+ |
+ |
+int Logger::GetLogLines(int from_pos, char* dest_buf, int max_size) { |
+ return Log::GetLogLines(from_pos, dest_buf, max_size); |
+} |
+ |
#endif |
@@ -996,7 +1178,9 @@ bool Logger::Setup() { |
// If we're logging anything, we need to open the log file. |
if (open_log_file) { |
if (strcmp(FLAG_logfile, "-") == 0) { |
- logfile_ = stdout; |
+ Log::OpenStdout(); |
+ } else if (strcmp(FLAG_logfile, "*") == 0) { |
+ Log::OpenMemoryBuffer(); |
} else if (strchr(FLAG_logfile, '%') != NULL) { |
// If there's a '%' in the log file name we have to expand |
// placeholders. |
@@ -1032,12 +1216,10 @@ bool Logger::Setup() { |
} |
} |
SmartPointer<const char> expanded = stream.ToCString(); |
- logfile_ = OS::FOpen(*expanded, OS::LogFileOpenMode); |
+ Log::OpenFile(*expanded); |
} else { |
- logfile_ = OS::FOpen(FLAG_logfile, OS::LogFileOpenMode); |
+ Log::OpenFile(FLAG_logfile); |
} |
- message_buffer_ = NewArray<char>(kMessageBufferSize); |
- mutex_ = OS::CreateMutex(); |
} |
current_state_ = &bottom_state_; |
@@ -1079,13 +1261,7 @@ void Logger::TearDown() { |
delete ticker_; |
- if (logfile_ != NULL) { |
- fclose(logfile_); |
- logfile_ = NULL; |
- delete mutex_; |
- mutex_ = NULL; |
- DeleteArray(message_buffer_); |
- } |
+ Log::Close(); |
#endif |
} |
@@ -1190,4 +1366,5 @@ VMState::~VMState() { |
} |
#endif |
-} } // namespace v8::internal |
+} // namespace internal |
+} // namespace v8 |