| Index: build/android/emulator.py | 
| diff --git a/build/android/emulator.py b/build/android/emulator.py | 
| index 07f64bb8fabebcbcc322c169320459125137f936..5abfadcaa6f914a03e812c2cee8a487c2bc68251 100755 | 
| --- a/build/android/emulator.py | 
| +++ b/build/android/emulator.py | 
| @@ -50,14 +50,34 @@ def _KillAllEmulators(): | 
| return | 
| time.sleep(1) | 
|  | 
| + | 
| +class PortPool(object): | 
| +  """Pool for emulator port starting position that changes over time.""" | 
| +  _port_min = 5554 | 
| +  _port_max = 5585 | 
| +  _port_current_index = 0 | 
| + | 
| +  @classmethod | 
| +  def port_range(cls): | 
| +    """Return a range of valid ports for emulator use. | 
| + | 
| +    The port must be an even number between 5554 and 5584.  Sometimes | 
| +    a killed emulator "hangs on" to a port long enough to prevent | 
| +    relaunch.  This is especially true on slow machines (like a bot). | 
| +    Cycling through a port start position helps make us resilient.""" | 
| +    ports = range(cls._port_min, cls._port_max, 2) | 
| +    n = cls._port_current_index | 
| +    cls._port_current_index = (n + 1) % len(ports) | 
| +    return ports[n:] + ports[:n] | 
| + | 
| + | 
| def _GetAvailablePort(): | 
| """Returns an available TCP port for the console.""" | 
| used_ports = [] | 
| emulators = android_commands.GetEmulators() | 
| for emulator in emulators: | 
| used_ports.append(emulator.split('-')[1]) | 
| -  # The port must be an even number between 5554 and 5584. | 
| -  for port in range(5554, 5585, 2): | 
| +  for port in PortPool.port_range(): | 
| if str(port) not in used_ports: | 
| return port | 
|  | 
|  |