Index: build/android/pylib/device/device_utils.py |
diff --git a/build/android/pylib/device/device_utils.py b/build/android/pylib/device/device_utils.py |
index 3ad767b51951c59f526be272d2dac5e38cb0a2a5..3688b4685cc4f2b3fe68699ccfa4c59aa6d33d56 100644 |
--- a/build/android/pylib/device/device_utils.py |
+++ b/build/android/pylib/device/device_utils.py |
@@ -574,6 +574,29 @@ class DeviceUtils(object): |
else: |
return output |
+ def _RunPipedShellCommand(self, script, **kwargs): |
+ PIPESTATUS_LEADER = 'PIPESTATUS: ' |
+ |
+ script += '; echo "%s${PIPESTATUS[@]}"' % PIPESTATUS_LEADER |
+ kwargs['check_return'] = True |
+ output = self.RunShellCommand(script, **kwargs) |
+ pipestatus_line = output[-1] |
+ |
+ if not pipestatus_line.startswith(PIPESTATUS_LEADER): |
+ logging.error('Pipe exit statuses of shell script missing.') |
+ raise device_errors.AdbShellCommandFailedError( |
+ script, output, status=None, |
+ device_serial=self.adb.GetDeviceSerial()) |
+ |
+ output = output[:-1] |
+ statuses = [ |
+ int(s) for s in pipestatus_line[len(PIPESTATUS_LEADER):].split()] |
+ if any(statuses): |
+ raise device_errors.AdbShellCommandFailedError( |
+ script, output, status=statuses, |
+ device_serial=self.adb.GetDeviceSerial()) |
+ return output |
+ |
@decorators.WithTimeoutAndRetriesFromInstance() |
def KillAll(self, process_name, signum=9, as_root=False, blocking=False, |
timeout=None, retries=None): |
@@ -595,7 +618,7 @@ class DeviceUtils(object): |
CommandTimeoutError on timeout. |
DeviceUnreachableError on missing device. |
""" |
- pids = self._GetPidsImpl(process_name) |
+ pids = self.GetPids(process_name) |
if not pids: |
raise device_errors.CommandFailedError( |
'No process "%s"' % process_name, str(self)) |
@@ -605,7 +628,7 @@ class DeviceUtils(object): |
if blocking: |
wait_period = 0.1 |
- while self._GetPidsImpl(process_name): |
+ while self.GetPids(process_name): |
time.sleep(wait_period) |
return len(pids) |
@@ -1020,7 +1043,7 @@ class DeviceUtils(object): |
else: |
logging.warning('Could not determine size of %s.', device_path) |
- if size is None or size <= self._MAX_ADB_OUTPUT_LENGTH: |
+ if 0 < size <= self._MAX_ADB_OUTPUT_LENGTH: |
return _JoinLines(self.RunShellCommand( |
['cat', device_path], as_root=as_root, check_return=True)) |
elif as_root and self.NeedsSU(): |
@@ -1355,11 +1378,19 @@ class DeviceUtils(object): |
CommandTimeoutError on timeout. |
DeviceUnreachableError on missing device. |
""" |
- return self._GetPidsImpl(process_name) |
- |
- def _GetPidsImpl(self, process_name): |
procs_pids = {} |
- for line in self.RunShellCommand('ps', check_return=True): |
+ try: |
+ ps_output = self._RunPipedShellCommand( |
+ cmd_helper.SingleQuote('ps | grep -F %s' % process_name)) |
perezju
2015/04/15 09:48:43
Oh, no, this is wrong, I think. It should be:
ps_
jbudorick
2015/04/15 13:43:15
Done.
|
+ except device_errors.AdbShellCommandFailedError as e: |
+ if e.status and isinstance(e.status, list) and not e.status[0]: |
+ # If ps succeeded but grep failed, there were no processes with the |
+ # given name. |
+ return procs_pids |
+ else: |
+ raise |
+ |
+ for line in ps_output: |
try: |
ps_data = line.split() |
if process_name in ps_data[-1]: |
@@ -1431,10 +1462,8 @@ class DeviceUtils(object): |
'Size', 'Rss', 'Pss', 'Shared_Clean', 'Shared_Dirty', 'Private_Clean', |
'Private_Dirty') |
- showmap_out = self.RunShellCommand( |
- ['showmap', str(pid)], as_root=True, check_return=True) |
- if not showmap_out: |
- raise device_errors.CommandFailedError('No output from showmap') |
+ showmap_out = self._RunPipedShellCommand( |
+ 'showmap %d | grep TOTAL' % int(pid), as_root=True) |
split_totals = showmap_out[-1].split() |
if (not split_totals |