| OLD | NEW |
| 1 // Copyright 2006-2008 the V8 project authors. All rights reserved. | 1 // Copyright 2006-2008 the V8 project authors. All rights reserved. |
| 2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
| 3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
| 4 // met: | 4 // met: |
| 5 // | 5 // |
| 6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
| 7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
| 8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
| 9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
| 10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
| (...skipping 10 matching lines...) Expand all Loading... |
| 21 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | 21 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
| 22 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | 22 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
| 23 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | 23 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
| 24 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | 24 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
| 25 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | 25 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
| 26 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 26 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| 27 | 27 |
| 28 #ifndef V8_LOG_H_ | 28 #ifndef V8_LOG_H_ |
| 29 #define V8_LOG_H_ | 29 #define V8_LOG_H_ |
| 30 | 30 |
| 31 namespace v8 { namespace internal { | 31 namespace v8 { |
| 32 namespace internal { |
| 32 | 33 |
| 33 // Logger is used for collecting logging information from V8 during | 34 // Logger is used for collecting logging information from V8 during |
| 34 // execution. The result is dumped to a file. | 35 // execution. The result is dumped to a file. |
| 35 // | 36 // |
| 36 // Available command line flags: | 37 // Available command line flags: |
| 37 // | 38 // |
| 38 // --log | 39 // --log |
| 39 // Minimal logging (no API, code, or GC sample events), default is off. | 40 // Minimal logging (no API, code, or GC sample events), default is off. |
| 40 // | 41 // |
| 41 // --log-all | 42 // --log-all |
| (...skipping 26 matching lines...) Expand all Loading... |
| 68 class Ticker; | 69 class Ticker; |
| 69 class Profiler; | 70 class Profiler; |
| 70 class Semaphore; | 71 class Semaphore; |
| 71 class SlidingStateWindow; | 72 class SlidingStateWindow; |
| 72 class LogMessageBuilder; | 73 class LogMessageBuilder; |
| 73 | 74 |
| 74 #undef LOG | 75 #undef LOG |
| 75 #ifdef ENABLE_LOGGING_AND_PROFILING | 76 #ifdef ENABLE_LOGGING_AND_PROFILING |
| 76 #define LOG(Call) \ | 77 #define LOG(Call) \ |
| 77 do { \ | 78 do { \ |
| 78 if (v8::internal::Logger::is_enabled()) \ | 79 if (v8::internal::Logger::IsEnabled()) \ |
| 79 v8::internal::Logger::Call; \ | 80 v8::internal::Logger::Call; \ |
| 80 } while (false) | 81 } while (false) |
| 81 #else | 82 #else |
| 82 #define LOG(Call) ((void) 0) | 83 #define LOG(Call) ((void) 0) |
| 83 #endif | 84 #endif |
| 84 | 85 |
| 85 | 86 |
| 86 class VMState BASE_EMBEDDED { | 87 class VMState BASE_EMBEDDED { |
| 87 #ifdef ENABLE_LOGGING_AND_PROFILING | 88 #ifdef ENABLE_LOGGING_AND_PROFILING |
| 88 public: | 89 public: |
| 89 explicit VMState(StateTag state); | 90 explicit VMState(StateTag state); |
| 90 ~VMState(); | 91 ~VMState(); |
| 91 | 92 |
| 92 StateTag state() { return state_; } | 93 StateTag state() { return state_; } |
| 93 | 94 |
| 94 private: | 95 private: |
| 95 StateTag state_; | 96 StateTag state_; |
| 96 VMState* previous_; | 97 VMState* previous_; |
| 97 #else | 98 #else |
| 98 public: | 99 public: |
| 99 explicit VMState(StateTag state) {} | 100 explicit VMState(StateTag state) {} |
| 100 #endif | 101 #endif |
| 101 }; | 102 }; |
| 102 | 103 |
| 103 | 104 |
| 104 class Logger { | 105 class Logger { |
| 105 public: | 106 public: |
| 106 // Opens the file for logging if the right flags are set. | 107 // Acquires resources for logging if the right flags are set. |
| 107 static bool Setup(); | 108 static bool Setup(); |
| 108 | 109 |
| 109 // Closes file opened in Setup. | 110 // Frees resources acquired in Setup. |
| 110 static void TearDown(); | 111 static void TearDown(); |
| 111 | 112 |
| 112 // Enable the computation of a sliding window of states. | 113 // Enable the computation of a sliding window of states. |
| 113 static void EnableSlidingStateWindow(); | 114 static void EnableSlidingStateWindow(); |
| 114 | 115 |
| 115 // Write a raw string to the log to be used as a preamble. | 116 // Write a raw string to the log to be used as a preamble. |
| 116 // No check is made that the 'preamble' is actually at the beginning | 117 // No check is made that the 'preamble' is actually at the beginning |
| 117 // of the log. The preample is used to write code events saved in the | 118 // of the log. The preample is used to write code events saved in the |
| 118 // snapshot. | 119 // snapshot. |
| 119 static void Preamble(const char* content); | 120 static void Preamble(const char* content); |
| (...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 199 static void RegExpCompileEvent(Handle<JSRegExp> regexp, bool in_cache); | 200 static void RegExpCompileEvent(Handle<JSRegExp> regexp, bool in_cache); |
| 200 | 201 |
| 201 // Log an event reported from generated code | 202 // Log an event reported from generated code |
| 202 static void LogRuntime(Vector<const char> format, JSArray* args); | 203 static void LogRuntime(Vector<const char> format, JSArray* args); |
| 203 | 204 |
| 204 #ifdef ENABLE_LOGGING_AND_PROFILING | 205 #ifdef ENABLE_LOGGING_AND_PROFILING |
| 205 static StateTag state() { | 206 static StateTag state() { |
| 206 return current_state_ ? current_state_->state() : OTHER; | 207 return current_state_ ? current_state_->state() : OTHER; |
| 207 } | 208 } |
| 208 | 209 |
| 209 static bool is_enabled() { return logfile_ != NULL; } | 210 static bool IsEnabled(); |
| 210 | 211 |
| 211 // Pause/Resume collection of profiling data. | 212 // Pause/Resume collection of profiling data. |
| 212 // When data collection is paused, Tick events are discarded until | 213 // When data collection is paused, Tick events are discarded until |
| 213 // data collection is Resumed. | 214 // data collection is Resumed. |
| 214 static bool IsProfilerPaused(); | 215 static bool IsProfilerPaused(); |
| 215 static void PauseProfiler(); | 216 static void PauseProfiler(); |
| 216 static void ResumeProfiler(); | 217 static void ResumeProfiler(); |
| 217 | 218 |
| 219 // If logging is performed into a memory buffer, allows to |
| 220 // retrieve previously written messages. See v8.h. |
| 221 static int GetLogLines(int from_pos, char* dest_buf, int max_size); |
| 222 |
| 218 private: | 223 private: |
| 219 | 224 |
| 220 // Emits the source code of a regexp. Used by regexp events. | 225 // Emits the source code of a regexp. Used by regexp events. |
| 221 static void LogRegExpSource(Handle<JSRegExp> regexp); | 226 static void LogRegExpSource(Handle<JSRegExp> regexp); |
| 222 | 227 |
| 223 // Emits a profiler tick event. Used by the profiler thread. | 228 // Emits a profiler tick event. Used by the profiler thread. |
| 224 static void TickEvent(TickSample* sample, bool overflow); | 229 static void TickEvent(TickSample* sample, bool overflow); |
| 225 | 230 |
| 226 static void ApiEvent(const char* name, ...); | 231 static void ApiEvent(const char* name, ...); |
| 227 | 232 |
| 228 // Logs a StringEvent regardless of whether FLAG_log is true. | 233 // Logs a StringEvent regardless of whether FLAG_log is true. |
| 229 static void UncheckedStringEvent(const char* name, const char* value); | 234 static void UncheckedStringEvent(const char* name, const char* value); |
| 230 | 235 |
| 231 // Size of buffer used for formatting log messages. | |
| 232 static const int kMessageBufferSize = 2048; | |
| 233 | |
| 234 // Buffer used for formatting log messages. This is a singleton buffer and | |
| 235 // mutex_ should be acquired before using it. | |
| 236 static char* message_buffer_; | |
| 237 | |
| 238 // When logging is active, logfile_ refers the file events are written to. | |
| 239 // mutex_ should be acquired before using logfile_. | |
| 240 static FILE* logfile_; | |
| 241 | |
| 242 // The sampler used by the profiler and the sliding state window. | 236 // The sampler used by the profiler and the sliding state window. |
| 243 static Ticker* ticker_; | 237 static Ticker* ticker_; |
| 244 | 238 |
| 245 // When the statistical profile is active, profiler_ | 239 // When the statistical profile is active, profiler_ |
| 246 // points to a Profiler, that handles collection | 240 // points to a Profiler, that handles collection |
| 247 // of samples. | 241 // of samples. |
| 248 static Profiler* profiler_; | 242 static Profiler* profiler_; |
| 249 | 243 |
| 250 // mutex_ is a Mutex used for enforcing exclusive | |
| 251 // access to the formatting buffer and the log file. | |
| 252 static Mutex* mutex_; | |
| 253 | |
| 254 // A stack of VM states. | 244 // A stack of VM states. |
| 255 static VMState* current_state_; | 245 static VMState* current_state_; |
| 256 | 246 |
| 257 // Singleton bottom or default vm state. | 247 // Singleton bottom or default vm state. |
| 258 static VMState bottom_state_; | 248 static VMState bottom_state_; |
| 259 | 249 |
| 260 // SlidingStateWindow instance keeping a sliding window of the most | 250 // SlidingStateWindow instance keeping a sliding window of the most |
| 261 // recent VM states. | 251 // recent VM states. |
| 262 static SlidingStateWindow* sliding_state_window_; | 252 static SlidingStateWindow* sliding_state_window_; |
| 263 | 253 |
| 264 // Internal implementation classes with access to | 254 // Internal implementation classes with access to |
| 265 // private members. | 255 // private members. |
| 266 friend class LogMessageBuilder; | |
| 267 friend class EventLog; | 256 friend class EventLog; |
| 268 friend class TimeLog; | 257 friend class TimeLog; |
| 269 friend class Profiler; | 258 friend class Profiler; |
| 270 friend class SlidingStateWindow; | 259 friend class SlidingStateWindow; |
| 271 friend class VMState; | 260 friend class VMState; |
| 272 #else | 261 #else |
| 273 static bool is_enabled() { return false; } | 262 static bool is_enabled() { return false; } |
| 274 #endif | 263 #endif |
| 275 }; | 264 }; |
| 276 | 265 |
| 277 | 266 |
| 278 // Class that extracts stack trace, used for profiling. | 267 // Class that extracts stack trace, used for profiling. |
| 279 class StackTracer BASE_EMBEDDED { | 268 class StackTracer BASE_EMBEDDED { |
| 280 public: | 269 public: |
| 281 explicit StackTracer(unsigned int low_stack_bound) | 270 explicit StackTracer(unsigned int low_stack_bound) |
| 282 : low_stack_bound_(low_stack_bound) { } | 271 : low_stack_bound_(low_stack_bound) { } |
| 283 void Trace(TickSample* sample); | 272 void Trace(TickSample* sample); |
| 284 private: | 273 private: |
| 285 | 274 |
| 286 unsigned int low_stack_bound_; | 275 unsigned int low_stack_bound_; |
| 287 }; | 276 }; |
| 288 | 277 |
| 289 | 278 } // namespace internal |
| 290 } } // namespace v8::internal | 279 } // namespace v8 |
| 291 | 280 |
| 292 #endif // V8_LOG_H_ | 281 #endif // V8_LOG_H_ |
| OLD | NEW |