# This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. import threading import mozinfo if mozinfo.os == "linux": from talos.cmanager_linux import LinuxCounterManager as DefaultCounterManager elif mozinfo.os == "win": from talos.cmanager_win32 import WinCounterManager as DefaultCounterManager else: # mac from talos.cmanager_mac import MacCounterManager as DefaultCounterManager class CounterManagement(object): def __init__(self, process_name, counters, resolution): """ Public interface to manage counters. On creation, create a thread to collect counters. Call :meth:`start` to start collecting counters with that thread. Be sure to call :meth:`stop` to stop the thread. """ assert counters self._raw_counters = counters self._process_name = process_name self._counter_results = dict([(counter, []) for counter in self._raw_counters]) self._resolution = resolution self._stop = threading.Event() self._thread = threading.Thread(target=self._collect) self._process = None def _collect(self): manager = DefaultCounterManager( self._process_name, self._process, self._raw_counters ) while not self._stop.wait(self._resolution): # Get the output from all the possible counters for count_type in self._raw_counters: val = manager.getCounterValue(count_type) if val: self._counter_results[count_type].append(val) def start(self, process): """ start the counter management thread. :param process: a psutil.Process instance representing the browser process. """ self._process = process self._thread.start() def stop(self): self._stop.set() self._thread.join() def results(self): assert not self._thread.is_alive() return self._counter_results