| Index: build/android/pylib/forwarder.py
|
| diff --git a/build/android/pylib/forwarder.py b/build/android/pylib/forwarder.py
|
| index 40a5d36fae3305753d68b6bffc46cfb97bc2b355..ff1d710870ed2eb8f6e2e1dd3f4cd5732b3bb517 100644
|
| --- a/build/android/pylib/forwarder.py
|
| +++ b/build/android/pylib/forwarder.py
|
| @@ -45,6 +45,7 @@ class Forwarder(object):
|
| """
|
| assert build_type in ('Release', 'Debug')
|
| self._adb = adb
|
| + self._device_to_host_port_map = dict()
|
| self._host_to_device_port_map = dict()
|
| self._device_initialized = False
|
| self._host_adb_control_port = 0
|
| @@ -97,6 +98,7 @@ class Forwarder(object):
|
| 'expected "device_port:host_port"' % output)
|
| device_port = int(tokens[0])
|
| host_port = int(tokens[1])
|
| + self._device_to_host_port_map[device_port] = host_port
|
| self._host_to_device_port_map[host_port] = device_port
|
| logging.info('Forwarding device port: %d to host port: %d.',
|
| device_port, host_port)
|
| @@ -137,24 +139,35 @@ class Forwarder(object):
|
| device_port: A previously forwarded port (through Run()).
|
| """
|
| with self._lock:
|
| - # Please note the minus sign below.
|
| - redirection_command = '%d:-%d' % (
|
| - self._host_adb_control_port, device_port)
|
| - (exit_code, output) = cmd_helper.GetCmdStatusAndOutput(
|
| - [self._host_forwarder_path, redirection_command])
|
| - if exit_code != 0:
|
| - raise Exception('%s exited with %d:\n%s' % (
|
| - self._host_forwarder_path, exit_code, '\n'.join(output)))
|
| + self._UnmapDevicePortInternalLocked(device_port)
|
| +
|
| + def _UnmapDevicePortInternalLocked(self, device_port):
|
| + if not device_port in self._device_to_host_port_map:
|
| + return
|
| + # Please note the minus sign below.
|
| + redirection_command = '%d:-%d' % (
|
| + self._host_adb_control_port, device_port)
|
| + (exit_code, output) = cmd_helper.GetCmdStatusAndOutput(
|
| + [self._host_forwarder_path, redirection_command])
|
| + if exit_code != 0:
|
| + raise Exception('%s exited with %d:\n%s' % (
|
| + self._host_forwarder_path, exit_code, '\n'.join(output)))
|
| + host_port = self._device_to_host_port_map[device_port]
|
| + del self._device_to_host_port_map[device_port]
|
| + del self._host_to_device_port_map[host_port]
|
|
|
| @staticmethod
|
| - def KillHost(build_type):
|
| + def KillHost(build_type='Debug'):
|
| """Kills the forwarder process running on the host.
|
|
|
| Args:
|
| - build_type: 'Release' or 'Debug'
|
| + build_type: 'Release' or 'Debug' (default='Debug')
|
| """
|
| logging.info('Killing host_forwarder.')
|
| host_forwarder_path = _MakeBinaryPath(build_type, 'host_forwarder')
|
| + if not os.path.exists(host_forwarder_path):
|
| + host_forwarder_path = _MakeBinaryPath(
|
| + 'Release' if build_type == 'Debug' else 'Debug', 'host_forwarder')
|
| assert os.path.exists(host_forwarder_path), 'Please build forwarder2'
|
| (exit_code, output) = cmd_helper.GetCmdStatusAndOutput(
|
| [host_forwarder_path, 'kill-server'])
|
| @@ -195,8 +208,8 @@ class Forwarder(object):
|
| with self._lock:
|
| return self._host_to_device_port_map.get(host_port)
|
|
|
| - # Deprecated.
|
| def Close(self):
|
| - """Terminates the forwarder process."""
|
| - # TODO(pliard): Remove references in client code.
|
| - pass
|
| + """Releases the previously forwarded ports."""
|
| + with self._lock:
|
| + for device_port in self._device_to_host_port_map.copy():
|
| + self._UnmapDevicePortInternalLocked(device_port)
|
|
|