• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright (c) 2011 The Chromium 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 // Trace events to track application performance.  Events consist of a name
6 // a type (BEGIN, END or INSTANT), a tracking id and extra string data.
7 // In addition, the current process id, thread id, a timestamp down to the
8 // microsecond and a file and line number of the calling location.
9 //
10 // The current implementation logs these events into a log file of the form
11 // trace_<pid>.log where it's designed to be post-processed to generate a
12 // trace report.  In the future, it may use another mechansim to facilitate
13 // real-time analysis.
14 
15 #ifndef BASE_DEBUG_TRACE_EVENT_H_
16 #define BASE_DEBUG_TRACE_EVENT_H_
17 #pragma once
18 
19 #include "build/build_config.h"
20 
21 #if defined(OS_WIN)
22 // On Windows we always pull in an alternative implementation
23 // which logs to Event Tracing for Windows.
24 //
25 // Note that the Windows implementation is always enabled, irrespective the
26 // value of the CHROMIUM_ENABLE_TRACE_EVENT define. The Windows implementation
27 // is controlled by Event Tracing for Windows, which will turn tracing on only
28 // if there is someone listening for the events it generates.
29 #include "base/debug/trace_event_win.h"
30 #else  // defined(OS_WIN)
31 
32 #include <string>
33 
34 #include "base/memory/scoped_ptr.h"
35 #include "base/memory/singleton.h"
36 #include "base/synchronization/lock.h"
37 #include "base/time.h"
38 #include "base/timer.h"
39 
40 #ifndef CHROMIUM_ENABLE_TRACE_EVENT
41 #define TRACE_EVENT_BEGIN(name, id, extra) ((void) 0)
42 #define TRACE_EVENT_END(name, id, extra) ((void) 0)
43 #define TRACE_EVENT_INSTANT(name, id, extra) ((void) 0)
44 
45 #else  // CHROMIUM_ENABLE_TRACE_EVENT
46 // Use the following macros rather than using the TraceLog class directly as the
47 // underlying implementation may change in the future.  Here's a sample usage:
48 // TRACE_EVENT_BEGIN("v8.run", documentId, scriptLocation);
49 // RunScript(script);
50 // TRACE_EVENT_END("v8.run", documentId, scriptLocation);
51 
52 // Record that an event (of name, id) has begun.  All BEGIN events should have
53 // corresponding END events with a matching (name, id).
54 #define TRACE_EVENT_BEGIN(name, id, extra) \
55   base::debug::TraceLog::GetInstance()->Trace( \
56       name, \
57       base::debug::TraceLog::EVENT_BEGIN, \
58       reinterpret_cast<const void*>(id), \
59       extra, \
60       __FILE__, \
61       __LINE__)
62 
63 // Record that an event (of name, id) has ended.  All END events should have
64 // corresponding BEGIN events with a matching (name, id).
65 #define TRACE_EVENT_END(name, id, extra) \
66   base::debug::TraceLog::GetInstance()->Trace( \
67       name, \
68       base::debug::TraceLog::EVENT_END, \
69       reinterpret_cast<const void*>(id), \
70       extra, \
71       __FILE__, \
72       __LINE__)
73 
74 // Record that an event (of name, id) with no duration has happened.
75 #define TRACE_EVENT_INSTANT(name, id, extra) \
76   base::debug::TraceLog::GetInstance()->Trace( \
77       name, \
78       base::debug::TraceLog::EVENT_INSTANT, \
79       reinterpret_cast<const void*>(id), \
80       extra, \
81       __FILE__, \
82       __LINE__)
83 #endif  // CHROMIUM_ENABLE_TRACE_EVENT
84 
85 namespace base {
86 
87 class ProcessMetrics;
88 
89 namespace debug {
90 
91 class TraceLog {
92  public:
93   enum EventType {
94     EVENT_BEGIN,
95     EVENT_END,
96     EVENT_INSTANT
97   };
98 
99   static TraceLog* GetInstance();
100 
101   // Is tracing currently enabled.
102   static bool IsTracing();
103   // Start logging trace events.
104   static bool StartTracing();
105   // Stop logging trace events.
106   static void StopTracing();
107 
108   // Log a trace event of (name, type, id) with the optional extra string.
109   void Trace(const std::string& name,
110              EventType type,
111              const void* id,
112              const std::wstring& extra,
113              const char* file,
114              int line);
115   void Trace(const std::string& name,
116              EventType type,
117              const void* id,
118              const std::string& extra,
119              const char* file,
120              int line);
121 
122  private:
123   // This allows constructor and destructor to be private and usable only
124   // by the Singleton class.
125   friend struct DefaultSingletonTraits<TraceLog>;
126 
127   TraceLog();
128   ~TraceLog();
129   bool OpenLogFile();
130   void CloseLogFile();
131   bool Start();
132   void Stop();
133   void Heartbeat();
134   void Log(const std::string& msg);
135 
136   bool enabled_;
137   FILE* log_file_;
138   base::Lock file_lock_;
139   TimeTicks trace_start_time_;
140 #ifndef ANDROID
141   scoped_ptr<base::ProcessMetrics> process_metrics_;
142 #endif
143   RepeatingTimer<TraceLog> timer_;
144 };
145 
146 }  // namespace debug
147 }  // namespace base
148 
149 #endif  // defined(OS_WIN)
150 
151 #endif  // BASE_DEBUG_TRACE_EVENT_H_
152