Chromium Code Reviews| Index: tools/telemetry/telemetry/core/platform/tracing_controller_backend.py |
| diff --git a/tools/telemetry/telemetry/core/platform/tracing_controller_backend.py b/tools/telemetry/telemetry/core/platform/tracing_controller_backend.py |
| index d566320db5cc47ec9ae509350c79e5bbc5182165..f8aa1024753292c1386777842d8ce8caa0834266 100644 |
| --- a/tools/telemetry/telemetry/core/platform/tracing_controller_backend.py |
| +++ b/tools/telemetry/telemetry/core/platform/tracing_controller_backend.py |
| @@ -12,6 +12,10 @@ class TracingControllerBackend(object): |
| self._platform_backend = platform_backend |
| self._current_trace_options = None |
| self._current_category_filter = None |
| + # A map from uniquely-identifying remote port (which may be the |
| + # same as local port) to DevToolsClientBackend. There is no |
| + # guarantee that the devtools agent is still alive. |
| + self._devtools_clients_map = {} |
| def Start(self, trace_options, category_filter, timeout): |
| if self.is_tracing_running: |
| @@ -22,27 +26,36 @@ class TracingControllerBackend(object): |
| assert isinstance(trace_options, |
| tracing_options.TracingOptions) |
| - self._AssertOneBrowserBackend() |
| - |
| self._current_trace_options = trace_options |
| self._current_category_filter = category_filter |
| if trace_options.enable_chrome_trace: |
| - browser_backend = self.running_browser_backends[0] |
| - browser_backend.StartTracing( |
| - trace_options, category_filter.filter_string, timeout) |
| + self._RemoveStaleDevToolsClient() |
| + for _, devtools_client in self._devtools_clients_map.iteritems(): |
| + devtools_client.StartChromeTracing( |
| + trace_options, category_filter.filter_string, timeout) |
| if trace_options.enable_platform_display_trace: |
| self._platform_backend.StartDisplayTracing() |
| + def _RemoveStaleDevToolsClient(self): |
| + """Removes DevTools clients that are no longer connectable.""" |
| + self._devtools_clients_map = { |
| + port: client |
| + for port, client in self._devtools_clients_map.iteritems() |
| + if client.IsAlive() |
| + } |
| + |
| def Stop(self): |
| assert self.is_tracing_running, 'Can only stop tracing when tracing.' |
| - self._AssertOneBrowserBackend() |
| trace_data_builder = trace_data_module.TraceDataBuilder() |
| if self._current_trace_options.enable_chrome_trace: |
| - browser_backend = self.running_browser_backends[0] |
| - browser_backend.StopTracing(trace_data_builder) |
| + for _, devtools_client in self._devtools_clients_map.iteritems(): |
| + # We do not check for stale DevTools client, so that we get an |
| + # exception if there is a stale client. This is because we |
| + # will potentially lose data if there is a stale client. |
| + devtools_client.StopChromeTracing(trace_data_builder) |
| if self._current_trace_options.enable_platform_display_trace: |
| surface_flinger_trace_data = self._platform_backend.StopDisplayTracing() |
| @@ -53,24 +66,18 @@ class TracingControllerBackend(object): |
| self._current_category_filter = None |
| return trace_data_builder.AsData() |
| - def _AssertOneBrowserBackend(self): |
| - # Note: it is possible to implement tracing for both the case of 0 and >1. |
| - # For >1, we just need to merge the trace files at StopTracing. |
| - # |
| - # For 0, we want to modify chrome's trace-startup to support leaving |
| - # tracing on indefinitely. Then have the backend notify the platform |
| - # and the tracing controller that it is starting a browser, have |
| - # the controller add in the trace-startup command, and then when we get |
| - # the Stop message or the DidStopBrowser(), issue the stop tracing command |
| - # on the right backend. |
| - num_instances = len(self.running_browser_backends) |
| - assert num_instances == 1, ( |
| - 'Tracing only supports one browser instance (not %i).' % num_instances) |
| + def RegisterDevToolsClient(self, devtools_client_backend): |
| + assert not self.is_tracing_running, ( |
| + 'Cannot add new DevTools client when tracing is running.') |
| + remote_port = str(devtools_client_backend.remote_port) |
| + self._devtools_clients_map[remote_port] = devtools_client_backend |
| def IsChromeTracingSupported(self): |
| - self._AssertOneBrowserBackend() |
| - browser_backend = self.running_browser_backends[0] |
| - return browser_backend.devtools_client.IsChromeTracingSupported() |
| + self._RemoveStaleDevToolsClient() |
| + for _, devtools_client in self._devtools_clients_map.iteritems(): |
| + if devtools_client.IsChromeTracingSupported(): |
| + return True |
| + return False |
| def IsDisplayTracingSupported(self): |
| return self._platform_backend.IsDisplayTracingSupported() |
| @@ -79,10 +86,6 @@ class TracingControllerBackend(object): |
| def is_tracing_running(self): |
| return self._current_trace_options != None |
| - @property |
| - def running_browser_backends(self): |
| - return self._platform_backend.running_browser_backends |
| - |
| def DidStartBrowser(self, browser, browser_backend): |
|
nednguyen
2015/01/13 16:12:00
Kill these methods?
|
| pass |