1 // Copyright 2016 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 #ifndef BASE_AUTO_OPEN_CLOSE_EVENT_H_
6 #define BASE_AUTO_OPEN_CLOSE_EVENT_H_
7 
8 #include "base/macros.h"
9 #include "base/memory/weak_ptr.h"
10 #include "base/threading/thread_checker.h"
11 #include "base/time/time.h"
12 #include "base/trace_event/trace_event.h"
13 
14 namespace base {
15 namespace trace_event {
16 
17 // Class for tracing events that support "auto-opening" and "auto-closing".
18 // "auto-opening" = if the trace event is started (call Begin() before
19 // tracing is started,the trace event will be opened, with the start time
20 // being the time that the trace event was actually started.
21 // "auto-closing" = if the trace event is started but not ended by the time
22 // tracing ends, then the trace event will be automatically closed at the
23 // end of tracing.
24 class BASE_EXPORT AutoOpenCloseEvent
25     : public TraceLog::AsyncEnabledStateObserver {
26  public:
27   enum Type {
28     ASYNC
29   };
30 
31   // As in the rest of the tracing macros, the const char* arguments here
32   // must be pointers to indefinitely lived strings (e.g. hard-coded string
33   // literals are okay, but not strings created by c_str())
34   AutoOpenCloseEvent(Type type, const char* category, const char* event_name);
35   ~AutoOpenCloseEvent() override;
36 
37   void Begin();
38   void End();
39 
40   // AsyncEnabledStateObserver implementation
41   void OnTraceLogEnabled() override;
42   void OnTraceLogDisabled() override;
43 
44  private:
45   const char* const category_;
46   const char* const event_name_;
47   base::TimeTicks start_time_;
48   base::ThreadChecker thread_checker_;
49   WeakPtrFactory<AutoOpenCloseEvent> weak_factory_;
50 
51   DISALLOW_COPY_AND_ASSIGN(AutoOpenCloseEvent);
52 };
53 
54 }  // namespace trace_event
55 }  // namespace base
56 
57 #endif  // BASE_AUTO_OPEN_CLOSE_EVENT_H_