Commit cb98e373 authored by Simon McVittie's avatar Simon McVittie Committed by Simon McVittie

closures test: Avoid timeout on ARM64 CPUs

Closures use a 16-bit atomic reference count, which is really slow
on certain ARM64 CPUs such as the Cortex-A57 (#1316). This is
non-trivial to solve, since the public struct field cannot be enlarged
to 32-bit while preserving ABI, and 16-bit atomic operations would be new
(and rather niche) API.

Until this can be solved properly (hopefully in GLib 2.59.x), cut down
the number of signal emission cycles and bump up the timeout in the
Meson build system, so that builds won't time out. We can't just take
another zero off the number of signal emission cycles, as was done in the
original version of this patch in Debian, because if we do that it can
result in test failures when the main thread starves the other threads.

ARM64 CPUs are backwards-compatible with 32-bit ARM, and the same
slowdown can be seen when building and testing 32-bit code on these
CPUs, so check for both 32- and 64-bit ARM.

Bug-Debian: https://bugs.debian.org/880883Co-authored-by: Iain Lane's avatarIain Lane <laney@debian.org>
Signed-off-by: 's avatarSimon McVittie <smcv@debian.org>
parent b09a0df9
......@@ -259,7 +259,19 @@ main (int argc,
thread1 = g_thread_create (thread1_main, closure, TRUE, NULL);
thread2 = g_thread_create (thread2_main, closure, TRUE, NULL);
/* The 16-bit compare-and-swap operations currently used for closure
* refcounts are really slow on some ARM CPUs, notably Cortex-A57.
* Reduce the number of iterations so that the test completes in a
* finite time, but don't reduce it so much that the main thread
* starves the other threads and causes a test failure.
*
* https://gitlab.gnome.org/GNOME/glib/issues/1316
* aka https://bugs.debian.org/880883 */
#if defined(__aarch64__) || defined(__arm__)
for (i = 0; i < 100000; i++)
#else
for (i = 0; i < 1000000; i++)
#endif
{
static guint count = 0;
test_emissions (object);
......
......@@ -54,6 +54,13 @@ foreach test_name, extra_args : refcount_tests
suite = ['refcount'] + extra_args.get('suite', [])
timeout = suite.contains('slow') ? test_timeout_slow : test_timeout
# https://gitlab.gnome.org/GNOME/glib/issues/1316
# aka https://bugs.debian.org/880883
if test_name == 'closures' and ['arm', 'aarch64'].contains(host_cpu_family)
timeout = timeout * 10
endif
# FIXME? TESTS_ENVIRONMENT = LIBCHARSET_ALIAS_DIR=$(top_builddir)/glib/libcharset
test(test_name, exe, env : test_env, timeout : timeout, suite : suite)
endforeach
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment