Home | History | Annotate | Download | only in tracing
      1 // Copyright (c) 2013 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 CONTENT_BROWSER_TRACING_TRACING_CONTROLLER_IMPL_H_
      6 #define CONTENT_BROWSER_TRACING_TRACING_CONTROLLER_IMPL_H_
      7 
      8 #include <set>
      9 #include <string>
     10 #include <vector>
     11 
     12 #include "base/lazy_instance.h"
     13 #include "content/public/browser/tracing_controller.h"
     14 
     15 namespace base {
     16 class RefCountedString;
     17 class RefCountedMemory;
     18 }
     19 
     20 namespace content {
     21 
     22 class TraceMessageFilter;
     23 class TracingUI;
     24 
     25 class TracingControllerImpl : public TracingController {
     26  public:
     27   static TracingControllerImpl* GetInstance();
     28 
     29   // TracingController implementation.
     30   virtual bool GetCategories(
     31       const GetCategoriesDoneCallback& callback) OVERRIDE;
     32   virtual bool EnableRecording(
     33       const base::debug::CategoryFilter& category_filter,
     34       const base::debug::TraceOptions& trace_options,
     35       const EnableRecordingDoneCallback& callback) OVERRIDE;
     36   virtual bool DisableRecording(
     37       const scoped_refptr<TraceDataSink>& sink) OVERRIDE;
     38   virtual bool EnableMonitoring(
     39       const base::debug::CategoryFilter& category_filter,
     40       const base::debug::TraceOptions& trace_options,
     41       const EnableMonitoringDoneCallback& callback) OVERRIDE;
     42   virtual bool DisableMonitoring(
     43       const DisableMonitoringDoneCallback& callback) OVERRIDE;
     44   virtual void GetMonitoringStatus(
     45       bool* out_enabled,
     46       base::debug::CategoryFilter* out_category_filter,
     47       base::debug::TraceOptions* out_trace_options) OVERRIDE;
     48   virtual bool CaptureMonitoringSnapshot(
     49       const scoped_refptr<TraceDataSink>& sink) OVERRIDE;
     50   virtual bool GetTraceBufferPercentFull(
     51       const GetTraceBufferPercentFullCallback& callback) OVERRIDE;
     52   virtual bool SetWatchEvent(const std::string& category_name,
     53                              const std::string& event_name,
     54                              const WatchEventCallback& callback) OVERRIDE;
     55   virtual bool CancelWatchEvent() OVERRIDE;
     56 
     57   void RegisterTracingUI(TracingUI* tracing_ui);
     58   void UnregisterTracingUI(TracingUI* tracing_ui);
     59 
     60  private:
     61   typedef std::set<scoped_refptr<TraceMessageFilter> > TraceMessageFilterSet;
     62 
     63   friend struct base::DefaultLazyInstanceTraits<TracingControllerImpl>;
     64   friend class TraceMessageFilter;
     65 
     66   TracingControllerImpl();
     67   virtual ~TracingControllerImpl();
     68 
     69   bool can_enable_recording() const {
     70     return !is_recording_;
     71   }
     72 
     73   bool can_disable_recording() const {
     74     return is_recording_ && !trace_data_sink_.get();
     75   }
     76 
     77   bool can_enable_monitoring() const {
     78     return !is_monitoring_;
     79   }
     80 
     81   bool can_disable_monitoring() const {
     82     return is_monitoring_ && !monitoring_data_sink_.get();
     83   }
     84 
     85   bool can_get_trace_buffer_percent_full() const {
     86     return pending_trace_buffer_percent_full_callback_.is_null();
     87   }
     88 
     89   bool can_cancel_watch_event() const {
     90     return !watch_event_callback_.is_null();
     91   }
     92 
     93   // Methods for use by TraceMessageFilter.
     94   void AddTraceMessageFilter(TraceMessageFilter* trace_message_filter);
     95   void RemoveTraceMessageFilter(TraceMessageFilter* trace_message_filter);
     96 
     97   void OnTraceDataCollected(
     98       const scoped_refptr<base::RefCountedString>& events_str_ptr);
     99   void OnMonitoringTraceDataCollected(
    100       const scoped_refptr<base::RefCountedString>& events_str_ptr);
    101 
    102   // Callback of TraceLog::Flush() for the local trace.
    103   void OnLocalTraceDataCollected(
    104       const scoped_refptr<base::RefCountedString>& events_str_ptr,
    105       bool has_more_events);
    106   // Callback of TraceLog::FlushMonitoring() for the local trace.
    107   void OnLocalMonitoringTraceDataCollected(
    108       const scoped_refptr<base::RefCountedString>& events_str_ptr,
    109       bool has_more_events);
    110 
    111   void OnDisableRecordingAcked(
    112       TraceMessageFilter* trace_message_filter,
    113       const std::vector<std::string>& known_category_groups);
    114 
    115 #if defined(OS_CHROMEOS) || defined(OS_WIN)
    116   void OnEndSystemTracingAcked(
    117       const scoped_refptr<base::RefCountedString>& events_str_ptr);
    118 #endif
    119 
    120   void OnCaptureMonitoringSnapshotAcked(
    121       TraceMessageFilter* trace_message_filter);
    122 
    123   void OnTraceBufferPercentFullReply(
    124       TraceMessageFilter* trace_message_filter,
    125       float percent_full);
    126 
    127   void OnWatchEventMatched();
    128 
    129   void SetEnabledOnFileThread(
    130       const base::debug::CategoryFilter& category_filter,
    131       int mode,
    132       const base::debug::TraceOptions& trace_options,
    133       const base::Closure& callback);
    134   void SetDisabledOnFileThread(const base::Closure& callback);
    135   void OnEnableRecordingDone(const base::debug::CategoryFilter& category_filter,
    136                              const base::debug::TraceOptions& trace_options,
    137                              const EnableRecordingDoneCallback& callback);
    138   void OnDisableRecordingDone();
    139   void OnEnableMonitoringDone(
    140       const base::debug::CategoryFilter& category_filter,
    141       const base::debug::TraceOptions& trace_options,
    142       const EnableMonitoringDoneCallback& callback);
    143   void OnDisableMonitoringDone(const DisableMonitoringDoneCallback& callback);
    144 
    145   void OnMonitoringStateChanged(bool is_monitoring);
    146 
    147   TraceMessageFilterSet trace_message_filters_;
    148 
    149   // Pending acks for DisableRecording.
    150   int pending_disable_recording_ack_count_;
    151   TraceMessageFilterSet pending_disable_recording_filters_;
    152   // Pending acks for CaptureMonitoringSnapshot.
    153   int pending_capture_monitoring_snapshot_ack_count_;
    154   TraceMessageFilterSet pending_capture_monitoring_filters_;
    155   // Pending acks for GetTraceBufferPercentFull.
    156   int pending_trace_buffer_percent_full_ack_count_;
    157   TraceMessageFilterSet pending_trace_buffer_percent_full_filters_;
    158   float maximum_trace_buffer_percent_full_;
    159 
    160 #if defined(OS_CHROMEOS) || defined(OS_WIN)
    161   bool is_system_tracing_;
    162 #endif
    163   bool is_recording_;
    164   bool is_monitoring_;
    165   base::debug::TraceOptions trace_options_;
    166 
    167   GetCategoriesDoneCallback pending_get_categories_done_callback_;
    168   GetTraceBufferPercentFullCallback pending_trace_buffer_percent_full_callback_;
    169 
    170   std::string watch_category_name_;
    171   std::string watch_event_name_;
    172   WatchEventCallback watch_event_callback_;
    173 
    174   std::set<std::string> known_category_groups_;
    175   std::set<TracingUI*> tracing_uis_;
    176   scoped_refptr<TraceDataSink> trace_data_sink_;
    177   scoped_refptr<TraceDataSink> monitoring_data_sink_;
    178   DISALLOW_COPY_AND_ASSIGN(TracingControllerImpl);
    179 };
    180 
    181 }  // namespace content
    182 
    183 #endif  // CONTENT_BROWSER_TRACING_TRACING_CONTROLLER_IMPL_H_
    184