OLD | NEW |
1 # Copyright 2013 The Chromium Authors. All rights reserved. | 1 # Copyright 2013 The Chromium Authors. All rights reserved. |
2 # Use of this source code is governed by a BSD-style license that can be | 2 # Use of this source code is governed by a BSD-style license that can be |
3 # found in the LICENSE file. | 3 # found in the LICENSE file. |
4 | 4 |
5 try: | 5 try: |
6 import resource # pylint: disable=F0401 | 6 import resource # pylint: disable=F0401 |
7 except ImportError: | 7 except ImportError: |
8 resource = None # Not available on all platforms | 8 resource = None # Not available on all platforms |
9 | 9 |
| 10 import re |
| 11 |
10 from telemetry.core import exceptions | 12 from telemetry.core import exceptions |
11 from telemetry.core.platform import platform_backend | 13 from telemetry.core.platform import platform_backend |
12 from telemetry import decorators | 14 from telemetry import decorators |
13 | 15 |
14 | 16 |
15 class LinuxBasedPlatformBackend(platform_backend.PlatformBackend): | 17 class LinuxBasedPlatformBackend(platform_backend.PlatformBackend): |
16 | 18 |
17 """Abstract platform containing functionality shared by all Linux based OSes. | 19 """Abstract platform containing functionality shared by all Linux based OSes. |
18 | 20 |
19 This includes Android and ChromeOS. | 21 This includes Android and ChromeOS. |
(...skipping 26 matching lines...) Expand all Loading... |
46 return results | 48 return results |
47 stats = stats.split() | 49 stats = stats.split() |
48 utime = float(stats[13]) | 50 utime = float(stats[13]) |
49 stime = float(stats[14]) | 51 stime = float(stats[14]) |
50 cpu_process_jiffies = utime + stime | 52 cpu_process_jiffies = utime + stime |
51 clock_ticks = self.GetClockTicks() | 53 clock_ticks = self.GetClockTicks() |
52 results.update({'CpuProcessTime': cpu_process_jiffies / clock_ticks}) | 54 results.update({'CpuProcessTime': cpu_process_jiffies / clock_ticks}) |
53 return results | 55 return results |
54 | 56 |
55 def GetCpuTimestamp(self): | 57 def GetCpuTimestamp(self): |
56 timer_list = self.GetFileContents('/proc/timer_list') | 58 total_jiffies = self._GetProcJiffies() |
57 total_jiffies = float(self._GetProcJiffies(timer_list)) | |
58 clock_ticks = self.GetClockTicks() | 59 clock_ticks = self.GetClockTicks() |
59 return {'TotalTime': total_jiffies / clock_ticks} | 60 return {'TotalTime': total_jiffies / clock_ticks} |
60 | 61 |
61 def GetMemoryStats(self, pid): | 62 def GetMemoryStats(self, pid): |
62 status_contents = self._GetProcFileForPid(pid, 'status') | 63 status_contents = self._GetProcFileForPid(pid, 'status') |
63 stats = self._GetProcFileForPid(pid, 'stat').split() | 64 stats = self._GetProcFileForPid(pid, 'stat').split() |
64 status = self._GetProcFileDict(status_contents) | 65 status = self._GetProcFileDict(status_contents) |
65 if not status or not stats or 'Z' in status['State']: | 66 if not status or not stats or 'Z' in status['State']: |
66 return {} | 67 return {} |
67 vm = int(stats[22]) | 68 vm = int(stats[22]) |
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
139 def _ConvertKbToByte(self, value): | 140 def _ConvertKbToByte(self, value): |
140 return int(value.replace('kB', '')) * 1024 | 141 return int(value.replace('kB', '')) * 1024 |
141 | 142 |
142 def _GetProcFileDict(self, contents): | 143 def _GetProcFileDict(self, contents): |
143 retval = {} | 144 retval = {} |
144 for line in contents.splitlines(): | 145 for line in contents.splitlines(): |
145 key, value = line.split(':') | 146 key, value = line.split(':') |
146 retval[key.strip()] = value.strip() | 147 retval[key.strip()] = value.strip() |
147 return retval | 148 return retval |
148 | 149 |
149 def _GetProcJiffies(self, timer_list): | 150 def _GetProcJiffies(self): |
150 """Parse '/proc/timer_list' output and returns the first jiffies attribute. | 151 """Parse '/proc/timer_list' output and returns the first jiffies attribute. |
151 | 152 |
152 Multi-CPU machines will have multiple 'jiffies:' lines, all of which will be | 153 Multi-CPU machines will have multiple 'jiffies:' lines, all of which will be |
153 essentially the same. Return the first one.""" | 154 essentially the same. Return the first one.""" |
154 if isinstance(timer_list, str): | 155 jiffies_timer_lines = self.RunCommand( |
155 timer_list = timer_list.splitlines() | 156 ['grep', 'jiffies','/proc/timer_list']) |
156 for line in timer_list: | 157 if not jiffies_timer_lines: |
157 if line.startswith('jiffies:'): | 158 raise Exception('Unable to find jiffies from /proc/timer_list') |
158 _, value = line.split(':') | 159 jiffies_timer_list = jiffies_timer_lines.splitlines() |
159 return value | 160 # Each line should look something like 'jiffies: 4315883489'. |
160 raise Exception('Unable to find jiffies from /proc/timer_list') | 161 for line in jiffies_timer_list: |
| 162 print repr(line) |
| 163 match = re.match('\s*jiffies\s*:\s*(\d+)', line) |
| 164 if match: |
| 165 value = match.group(1) |
| 166 return float(value) |
| 167 raise Exception('Unable to parse jiffies attribute: %s' % |
| 168 repr(jiffies_timer_lines)) |
OLD | NEW |