Home | History | Annotate | Download | only in src
      1 // Copyright 2006-2009 the V8 project authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #ifndef V8_LOG_UTILS_H_
      6 #define V8_LOG_UTILS_H_
      7 
      8 #include <stdio.h>
      9 
     10 #include <cstdarg>
     11 
     12 #include "src/allocation.h"
     13 #include "src/base/compiler-specific.h"
     14 #include "src/base/platform/mutex.h"
     15 #include "src/flags.h"
     16 
     17 namespace v8 {
     18 namespace internal {
     19 
     20 class Logger;
     21 
     22 // Functions and data for performing output of log messages.
     23 class Log {
     24  public:
     25   // Performs process-wide initialization.
     26   void Initialize(const char* log_file_name);
     27 
     28   // Disables logging, but preserves acquired resources.
     29   void stop() { is_stopped_ = true; }
     30 
     31   static bool InitLogAtStart() {
     32     return FLAG_log || FLAG_log_api || FLAG_log_code || FLAG_log_gc ||
     33            FLAG_log_handles || FLAG_log_suspect || FLAG_ll_prof ||
     34            FLAG_perf_basic_prof || FLAG_perf_prof ||
     35            FLAG_log_internal_timer_events || FLAG_prof_cpp || FLAG_trace_ic;
     36   }
     37 
     38   // Frees all resources acquired in Initialize and Open... functions.
     39   // When a temporary file is used for the log, returns its stream descriptor,
     40   // leaving the file open.
     41   FILE* Close();
     42 
     43   // Returns whether logging is enabled.
     44   bool IsEnabled() {
     45     return !is_stopped_ && output_handle_ != NULL;
     46   }
     47 
     48   // Size of buffer used for formatting log messages.
     49   static const int kMessageBufferSize = 2048;
     50 
     51   // This mode is only used in tests, as temporary files are automatically
     52   // deleted on close and thus can't be accessed afterwards.
     53   static const char* const kLogToTemporaryFile;
     54   static const char* const kLogToConsole;
     55 
     56   // Utility class for formatting log messages. It fills the message into the
     57   // static buffer in Log.
     58   class MessageBuilder BASE_EMBEDDED {
     59    public:
     60     // Create a message builder starting from position 0.
     61     // This acquires the mutex in the log as well.
     62     explicit MessageBuilder(Log* log);
     63     ~MessageBuilder() { }
     64 
     65     // Append string data to the log message.
     66     void PRINTF_FORMAT(2, 3) Append(const char* format, ...);
     67 
     68     // Append string data to the log message.
     69     void PRINTF_FORMAT(2, 0) AppendVA(const char* format, va_list args);
     70 
     71     // Append a character to the log message.
     72     void Append(const char c);
     73 
     74     // Append double quoted string to the log message.
     75     void AppendDoubleQuotedString(const char* string);
     76 
     77     // Append a heap string.
     78     void Append(String* str);
     79 
     80     // Appends an address.
     81     void AppendAddress(Address addr);
     82 
     83     void AppendSymbolName(Symbol* symbol);
     84 
     85     void AppendDetailed(String* str, bool show_impl_info);
     86 
     87     // Append a portion of a string.
     88     void AppendStringPart(const char* str, int len);
     89 
     90     // Write the log message to the log file currently opened.
     91     void WriteToLogFile();
     92 
     93    private:
     94     Log* log_;
     95     base::LockGuard<base::Mutex> lock_guard_;
     96     int pos_;
     97   };
     98 
     99  private:
    100   explicit Log(Logger* logger);
    101 
    102   // Opens stdout for logging.
    103   void OpenStdout();
    104 
    105   // Opens file for logging.
    106   void OpenFile(const char* name);
    107 
    108   // Opens a temporary file for logging.
    109   void OpenTemporaryFile();
    110 
    111   // Implementation of writing to a log file.
    112   int WriteToFile(const char* msg, int length) {
    113     DCHECK_NOT_NULL(output_handle_);
    114     size_t rv = fwrite(msg, 1, length, output_handle_);
    115     DCHECK_EQ(length, rv);
    116     USE(rv);
    117     fflush(output_handle_);
    118     return length;
    119   }
    120 
    121   // Whether logging is stopped (e.g. due to insufficient resources).
    122   bool is_stopped_;
    123 
    124   // When logging is active output_handle_ is used to store a pointer to log
    125   // destination.  mutex_ should be acquired before using output_handle_.
    126   FILE* output_handle_;
    127 
    128   // mutex_ is a Mutex used for enforcing exclusive
    129   // access to the formatting buffer and the log file or log memory buffer.
    130   base::Mutex mutex_;
    131 
    132   // Buffer used for formatting log messages. This is a singleton buffer and
    133   // mutex_ should be acquired before using it.
    134   char* message_buffer_;
    135 
    136   Logger* logger_;
    137 
    138   friend class Logger;
    139 };
    140 
    141 
    142 }  // namespace internal
    143 }  // namespace v8
    144 
    145 #endif  // V8_LOG_UTILS_H_
    146