log-utils.h revision 257744e915dfc84d6d07a6b2accf8402d9ffc708
1a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Copyright 2006-2009 the V8 project authors. All rights reserved. 2a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Redistribution and use in source and binary forms, with or without 3a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// modification, are permitted provided that the following conditions are 4a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// met: 5a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// 6a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// * Redistributions of source code must retain the above copyright 7a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// notice, this list of conditions and the following disclaimer. 8a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// * Redistributions in binary form must reproduce the above 9a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// copyright notice, this list of conditions and the following 10a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// disclaimer in the documentation and/or other materials provided 11a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// with the distribution. 12a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// * Neither the name of Google Inc. nor the names of its 13a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// contributors may be used to endorse or promote products derived 14a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// from this software without specific prior written permission. 15a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// 16a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 17a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 18a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 19a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 20a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 21a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 22a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 23a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 24a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 25a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 26a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 28a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#ifndef V8_LOG_UTILS_H_ 29a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#define V8_LOG_UTILS_H_ 30a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 31257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch#include "allocation.h" 32257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 33a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blocknamespace v8 { 34a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blocknamespace internal { 35a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 36a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#ifdef ENABLE_LOGGING_AND_PROFILING 37a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3844f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass Logger; 3944f0eee88ff00398ff7f715fab053374d808c90dSteve Block 40a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// A memory buffer that increments its size as you write in it. Size 41a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// is incremented with 'block_size' steps, never exceeding 'max_size'. 42a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// During growth, memory contents are never copied. At the end of the 43a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// buffer an amount of memory specified in 'seal_size' is reserved. 44a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// When writing position reaches max_size - seal_size, buffer auto-seals 45a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// itself with 'seal' and allows no further writes. Data pointed by 46a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// 'seal' must be available during entire LogDynamicBuffer lifetime. 47a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// 48a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// An instance of this class is created dynamically by Log. 49a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockclass LogDynamicBuffer { 50a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 51a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block LogDynamicBuffer( 52a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int block_size, int max_size, const char* seal, int seal_size); 53a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 54a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ~LogDynamicBuffer(); 55a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 56a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Reads contents of the buffer starting from 'from_pos'. Upon 57a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // return, 'dest_buf' is filled with the data. Actual amount of data 58a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // filled is returned, it is <= 'buf_size'. 59a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int Read(int from_pos, char* dest_buf, int buf_size); 60a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 61a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Writes 'data' to the buffer, making it larger if necessary. If 62a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // data is too big to fit in the buffer, it doesn't get written at 63a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // all. In that case, buffer auto-seals itself and stops to accept 64a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // any incoming writes. Returns amount of data written (it is either 65a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // 'data_size', or 0, if 'data' is too big). 66a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int Write(const char* data, int data_size); 67a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 68a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block private: 69a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block void AllocateBlock(int index) { 70a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block blocks_[index] = NewArray<char>(block_size_); 71a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 72a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 73a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int BlockIndex(int pos) const { return pos / block_size_; } 74a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 75a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int BlocksCount() const { return BlockIndex(max_size_) + 1; } 76a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 77a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int PosInBlock(int pos) const { return pos % block_size_; } 78a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 79a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int Seal(); 80a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 81a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int WriteInternal(const char* data, int data_size); 82a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 83a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block const int block_size_; 84a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block const int max_size_; 85a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block const char* seal_; 86a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block const int seal_size_; 87a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ScopedVector<char*> blocks_; 88a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int write_pos_; 89a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int block_index_; 90a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int block_write_pos_; 91a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block bool is_sealed_; 92a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 93a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 94a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 95a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Functions and data for performing output of log messages. 9644f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass Log { 97a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 98a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 9944f0eee88ff00398ff7f715fab053374d808c90dSteve Block // Performs process-wide initialization. 10044f0eee88ff00398ff7f715fab053374d808c90dSteve Block void Initialize(); 101a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 102a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Disables logging, but preserves acquired resources. 10344f0eee88ff00398ff7f715fab053374d808c90dSteve Block void stop() { is_stopped_ = true; } 104a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 10544f0eee88ff00398ff7f715fab053374d808c90dSteve Block // Frees all resources acquired in Initialize and Open... functions. 10644f0eee88ff00398ff7f715fab053374d808c90dSteve Block void Close(); 107a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 108a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // See description in include/v8.h. 10944f0eee88ff00398ff7f715fab053374d808c90dSteve Block int GetLogLines(int from_pos, char* dest_buf, int max_size); 110a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 111a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Returns whether logging is enabled. 11244f0eee88ff00398ff7f715fab053374d808c90dSteve Block bool IsEnabled() { 113a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return !is_stopped_ && (output_handle_ != NULL || output_buffer_ != NULL); 114a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 115a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 116a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Size of buffer used for formatting log messages. 1176ded16be15dd865a9b21ea304d5273c8be299c87Steve Block static const int kMessageBufferSize = v8::V8::kMinimumSizeForLogLinesBuffer; 118a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 119a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block private: 12044f0eee88ff00398ff7f715fab053374d808c90dSteve Block explicit Log(Logger* logger); 12144f0eee88ff00398ff7f715fab053374d808c90dSteve Block 12244f0eee88ff00398ff7f715fab053374d808c90dSteve Block // Opens stdout for logging. 12344f0eee88ff00398ff7f715fab053374d808c90dSteve Block void OpenStdout(); 124a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 12544f0eee88ff00398ff7f715fab053374d808c90dSteve Block // Opens file for logging. 12644f0eee88ff00398ff7f715fab053374d808c90dSteve Block void OpenFile(const char* name); 127a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 12844f0eee88ff00398ff7f715fab053374d808c90dSteve Block // Opens memory buffer for logging. 12944f0eee88ff00398ff7f715fab053374d808c90dSteve Block void OpenMemoryBuffer(); 130a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 131a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Implementation of writing to a log file. 13244f0eee88ff00398ff7f715fab053374d808c90dSteve Block int WriteToFile(const char* msg, int length) { 133a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(output_handle_ != NULL); 134d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block size_t rv = fwrite(msg, 1, length, output_handle_); 135d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block ASSERT(static_cast<size_t>(length) == rv); 136d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block USE(rv); 137f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch fflush(output_handle_); 138d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block return length; 139a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 140a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 141a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Implementation of writing to a memory buffer. 14244f0eee88ff00398ff7f715fab053374d808c90dSteve Block int WriteToMemory(const char* msg, int length) { 143a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(output_buffer_ != NULL); 144a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return output_buffer_->Write(msg, length); 145a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 146a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 14744f0eee88ff00398ff7f715fab053374d808c90dSteve Block bool write_to_file_; 14844f0eee88ff00398ff7f715fab053374d808c90dSteve Block 149a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Whether logging is stopped (e.g. due to insufficient resources). 15044f0eee88ff00398ff7f715fab053374d808c90dSteve Block bool is_stopped_; 151a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 152a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // When logging is active, either output_handle_ or output_buffer_ is used 153a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // to store a pointer to log destination. If logging was opened via OpenStdout 154a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // or OpenFile, then output_handle_ is used. If logging was opened 155a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // via OpenMemoryBuffer, then output_buffer_ is used. 156a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // mutex_ should be acquired before using output_handle_ or output_buffer_. 15744f0eee88ff00398ff7f715fab053374d808c90dSteve Block FILE* output_handle_; 158a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 159257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch // Used when low-level profiling is active. 160257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch FILE* ll_output_handle_; 161f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch 16244f0eee88ff00398ff7f715fab053374d808c90dSteve Block LogDynamicBuffer* output_buffer_; 163a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 164a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Size of dynamic buffer block (and dynamic buffer initial size). 165a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kDynamicBufferBlockSize = 65536; 166a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 167a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Maximum size of dynamic buffer. 168a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kMaxDynamicBufferSize = 50 * 1024 * 1024; 169a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 170a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Message to "seal" dynamic buffer with. 17144f0eee88ff00398ff7f715fab053374d808c90dSteve Block static const char* const kDynamicBufferSeal; 172a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 173a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // mutex_ is a Mutex used for enforcing exclusive 174a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // access to the formatting buffer and the log file or log memory buffer. 17544f0eee88ff00398ff7f715fab053374d808c90dSteve Block Mutex* mutex_; 176a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 177a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Buffer used for formatting log messages. This is a singleton buffer and 178a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // mutex_ should be acquired before using it. 17944f0eee88ff00398ff7f715fab053374d808c90dSteve Block char* message_buffer_; 18044f0eee88ff00398ff7f715fab053374d808c90dSteve Block 18144f0eee88ff00398ff7f715fab053374d808c90dSteve Block Logger* logger_; 182a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 183f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch friend class Logger; 184a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block friend class LogMessageBuilder; 185a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 186a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 187a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 188a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Utility class for formatting log messages. It fills the message into the 189a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// static buffer in Log. 190a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockclass LogMessageBuilder BASE_EMBEDDED { 191a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 192a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Create a message builder starting from position 0. This acquires the mutex 193a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // in the log as well. 19444f0eee88ff00398ff7f715fab053374d808c90dSteve Block explicit LogMessageBuilder(Logger* logger); 195a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ~LogMessageBuilder() { } 196a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 197a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Append string data to the log message. 198a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block void Append(const char* format, ...); 199a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 200a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Append string data to the log message. 201a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block void AppendVA(const char* format, va_list args); 202a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 203a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Append a character to the log message. 204a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block void Append(const char c); 205a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 206a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Append a heap string. 207a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block void Append(String* str); 208a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 209b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // Appends an address. 210a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block void AppendAddress(Address addr); 211a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 212a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block void AppendDetailed(String* str, bool show_impl_info); 213a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 214a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Append a portion of a string. 215a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block void AppendStringPart(const char* str, int len); 216a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 217a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Write the log message to the log file currently opened. 218a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block void WriteToLogFile(); 219a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 220a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block private: 221a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 22244f0eee88ff00398ff7f715fab053374d808c90dSteve Block Log* log_; 223a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ScopedLock sl; 224a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int pos_; 225a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 226a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 227a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#endif // ENABLE_LOGGING_AND_PROFILING 228a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 229a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} } // namespace v8::internal 230a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 231a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#endif // V8_LOG_UTILS_H_ 232