| Index: scripts/slave/runtest.py
|
| diff --git a/scripts/slave/runtest.py b/scripts/slave/runtest.py
|
| index e5e4bf6f17a0e337a6ee387a515d0c13955719c1..1ce5d8d49008aa2fd016ab57be39ebd8ffb78e3f 100755
|
| --- a/scripts/slave/runtest.py
|
| +++ b/scripts/slave/runtest.py
|
| @@ -85,6 +85,33 @@ def get_temp_count():
|
| return len(os.listdir(tempfile.gettempdir()))
|
|
|
|
|
| +def _LaunchDBus():
|
| + """Launches DBus to work around a bug in GLib.
|
| +
|
| + Works around a bug in GLib where it performs operations which aren't
|
| + async-signal-safe (in particular, memory allocations) between fork
|
| + and exec when it spawns subprocesses. This causes threads inside
|
| + Chrome's browser and utility processes to get stuck, and this
|
| + harness to hang waiting for those processes, which will never
|
| + terminate. This doesn't happen on users' machines, because they have
|
| + an active desktop session and the DBUS_SESSION_BUS_ADDRESS
|
| + environment variable set, but it does happen on the bots. See Issue
|
| + 309093 for more details."""
|
| + import platform
|
| + import subprocess
|
| + if (platform.uname()[0].lower() == 'linux' and
|
| + 'DBUS_SESSION_BUS_ADDRESS' not in os.environ):
|
| + try:
|
| + print 'DBUS_SESSION_BUS_ADDRESS env var not found, starting dbus-launch'
|
| + dbus_output = subprocess.check_output(['dbus-launch']).split('\n')
|
| + for line in dbus_output:
|
| + m = re.match(r"([^=]+)\=(.+)", line)
|
| + if m:
|
| + os.environ[m.group(1)] = m.group(2)
|
| + print ' setting %s to %s' % (m.group(1), m.group(2))
|
| + except subprocess.CalledProcessError, e:
|
| + print 'Exception while running dbus_launch: %s' % e
|
| +
|
| def _RunGTestCommand(command, results_tracker=None, pipes=None,
|
| extra_env=None):
|
|
|
| @@ -1217,6 +1244,10 @@ def main():
|
| 'properties "lsan" and "lsan_run_all_tests".')
|
| option_parser.add_option('', '--extra-sharding-args', default='',
|
| help='Extra options for run_test_cases.py.')
|
| + option_parser.add_option('--spawn-dbus', action='store_true',
|
| + default=False,
|
| + help='Work around GLib DBus bug by '
|
| + 'manually spawning dbus-launch')
|
|
|
| chromium_utils.AddPropertiesOptions(option_parser)
|
| options, args = option_parser.parse_args()
|
| @@ -1234,6 +1265,9 @@ def main():
|
| # Print out builder name for log_parser
|
| print '[Running on builder: "%s"]' % options.builder_name
|
|
|
| + if options.spawn_dbus:
|
| + _LaunchDBus()
|
| +
|
| # TODO(thakis): Simplify this once ConvertBuildDirToLegacy() ignores its
|
| # arguments.
|
| use_out = False
|
|
|