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
5from systrace.tracing_agents import atrace_agent
6from telemetry.internal.platform import tracing_agent
7from tracing.trace_data import trace_data
8
9from devil.android.sdk import version_codes
10
11
12class AtraceTracingAgent(tracing_agent.TracingAgent):
13  def __init__(self, platform_backend):
14    super(AtraceTracingAgent, self).__init__(platform_backend)
15    self._device = platform_backend.device
16    self._categories = None
17    self._atrace_agent = atrace_agent.AtraceAgent(
18        platform_backend.device.build_version_sdk)
19    self._config = None
20
21  @classmethod
22  def IsSupported(cls, platform_backend):
23    return (platform_backend.GetOSName() == 'android' and
24        platform_backend.device.build_version_sdk >
25            version_codes.JELLY_BEAN_MR1)
26
27  def StartAgentTracing(self, config, timeout):
28    if not config.enable_atrace_trace:
29      return False
30
31    app_name = (','.join(config.atrace_config.app_name) if
32        isinstance(config.atrace_config.app_name, list) else
33        config.atrace_config.app_name)
34    self._config = atrace_agent.AtraceConfig(
35        config.atrace_config.categories,
36        trace_buf_size=None, kfuncs=None, app_name=app_name,
37        compress_trace_data=True, from_file=True,
38        device_serial_number=str(self._device), trace_time=None,
39        target='android')
40    return self._atrace_agent.StartAgentTracing(self._config, timeout)
41
42  def StopAgentTracing(self):
43    self._atrace_agent.StopAgentTracing()
44
45  def SupportsExplicitClockSync(self):
46    return self._atrace_agent.SupportsExplicitClockSync()
47
48  def RecordClockSyncMarker(self, sync_id,
49                            record_controller_clock_sync_marker_callback):
50    return self._atrace_agent.RecordClockSyncMarker(sync_id,
51        lambda t, sid: record_controller_clock_sync_marker_callback(sid, t))
52
53  def CollectAgentTraceData(self, trace_data_builder, timeout=None):
54    raw_data = self._atrace_agent.GetResults(timeout).raw_data
55    trace_data_builder.AddTraceFor(trace_data.ATRACE_PART, raw_data)
56