Index: build/android/pylib/device/adb_wrapper.py |
diff --git a/build/android/pylib/device/adb_wrapper.py b/build/android/pylib/device/adb_wrapper.py |
index 4006a21d5540611c5e23aa72f2b838293b5efadc..1dbb1d89a9a2a8b7d04b007b47d4c7f20845af5a 100644 |
--- a/build/android/pylib/device/adb_wrapper.py |
+++ b/build/android/pylib/device/adb_wrapper.py |
@@ -56,8 +56,12 @@ class AdbWrapper(object): |
# pylint: disable=unused-argument |
@classmethod |
- def _BuildAdbCmd(cls, args, device_serial): |
- cmd = [constants.GetAdbPath()] |
+ def _BuildAdbCmd(cls, args, device_serial, cpu_affinity=None): |
+ if cpu_affinity is not None: |
+ cmd = ['taskset', '-c', str(cpu_affinity)] |
+ else: |
+ cmd = [] |
+ cmd.append(constants.GetAdbPath()) |
if device_serial is not None: |
cmd.extend(['-s', device_serial]) |
cmd.extend(args) |
@@ -68,9 +72,9 @@ class AdbWrapper(object): |
@classmethod |
@decorators.WithTimeoutAndRetries |
def _RunAdbCmd(cls, args, timeout=None, retries=None, device_serial=None, |
- check_error=True): |
+ check_error=True, cpu_affinity=None): |
status, output = cmd_helper.GetCmdStatusAndOutputWithTimeout( |
- cls._BuildAdbCmd(args, device_serial), |
+ cls._BuildAdbCmd(args, device_serial, cpu_affinity=cpu_affinity), |
timeout_retry.CurrentTimeoutThread().GetRemainingTime()) |
if status != 0: |
raise device_errors.AdbCommandFailedError( |
@@ -135,6 +139,25 @@ class AdbWrapper(object): |
def __repr__(self): |
return '%s(\'%s\')' % (self.__class__.__name__, self) |
+ # pylint: disable=unused-argument |
+ @classmethod |
+ def IsServerOnline(cls): |
+ status, output = cmd_helper.GetCmdStatusAndOutput(['pgrep', 'adb']) |
+ output = [int(x) for x in output.split()] |
+ logging.info('PIDs for adb found: %r', output) |
+ return status == 0 |
+ # pylint: enable=unused-argument |
+ |
+ @classmethod |
+ def KillServer(cls, timeout=_DEFAULT_TIMEOUT, retries=_DEFAULT_RETRIES): |
+ cls._RunAdbCmd(['kill-server'], timeout=timeout, retries=retries) |
+ |
+ @classmethod |
+ def StartServer(cls, timeout=_DEFAULT_TIMEOUT, retries=_DEFAULT_RETRIES): |
+ # CPU affinity is used to reduce adb instability http://crbug.com/268450 |
+ cls._RunAdbCmd(['start-server'], timeout=timeout, retries=retries, |
+ cpu_affinity=0) |
+ |
# TODO(craigdh): Determine the filter criteria that should be supported. |
@classmethod |
def GetDevices(cls, timeout=_DEFAULT_TIMEOUT, retries=_DEFAULT_RETRIES): |
@@ -222,12 +245,12 @@ class AdbWrapper(object): |
status = int(output[output_end+1:]) |
except ValueError: |
logging.warning('exit status of shell command %r missing.', command) |
- raise device_errors.AdbCommandFailedError( |
- args, output, device_serial=self._device_serial) |
+ raise device_errors.AdbShellCommandFailedError( |
+ command, output, status=None, device_serial=self._device_serial) |
output = output[:output_end] |
if status != expect_status: |
- raise device_errors.AdbCommandFailedError( |
- args, output, status, self._device_serial) |
+ raise device_errors.AdbShellCommandFailedError( |
+ command, output, status=status, device_serial=self._device_serial) |
return output |
def Ls(self, path, timeout=_DEFAULT_TIMEOUT, retries=_DEFAULT_RETRIES): |