Blame SOURCES/0025-tests-check-tracing-of-looping-threads.patch

4d44fe
From 1fc4e011bb0d977b64385e5dff91620c42985bcf Mon Sep 17 00:00:00 2001
4d44fe
From: "Dmitry V. Levin" <ldv@altlinux.org>
4d44fe
Date: Wed, 4 Jul 2018 02:11:27 +0000
4d44fe
Subject: [PATCH 25/27] tests: check tracing of looping threads
4d44fe
4d44fe
* test/many_looping_threads.c: Remove.
4d44fe
* test/.gitignore: Remove many_looping_threads.
4d44fe
* test/Makefile (PROGS): Likewise.
4d44fe
(many_looping_threads): Remove.
4d44fe
* tests/looping_threads.c: New file.
4d44fe
* tests/looping_threads.test: New test.
4d44fe
* tests/.gitignore: Add looping_threads.
4d44fe
* tests/Makefile.am (check_PROGRAMS): Likewise.
4d44fe
(looping_threads_LDADD): New variable.
4d44fe
(MISC_TESTS, XFAIL_TESTS): Add looping_threads.test.
4d44fe
4d44fe
Conflicts:
4d44fe
	tests/Makefile.am
4d44fe
4d44fe
Skipped files (not present in the tarball):
4d44fe
	test/.gitignore
4d44fe
	test/Makefile
4d44fe
	test/many_looping_threads.c
4d44fe
	tests/.gitignore
4d44fe
4d44fe
Additional changes:
4d44fe
	tests/Makefile.in (generated from tests/Makefile.am)
4d44fe
	tests-m32/Makefile.in (generated from tests-m32/Makefile.am)
4d44fe
	tests-m32/looping_threads.c (copy of tests/looping_threads.c)
4d44fe
	tests-m32/looping_threads.test (copy of tests/looping_threads.test)
4d44fe
	tests-mx32/Makefile.in (generated from tests-mx32/Makefile.am)
4d44fe
	tests-mx32/looping_threads.c (copy of tests/looping_threads.c)
4d44fe
	tests-mx32/looping_threads.test (copy of tests/looping_threads.test)
4d44fe
4d44fe
---
4d44fe
 test/.gitignore             |   1 -
4d44fe
 test/Makefile               |   5 +-
4d44fe
 test/many_looping_threads.c |  49 ------------------
4d44fe
 tests/.gitignore            |   1 +
4d44fe
 tests/Makefile.am           |   6 ++-
4d44fe
 tests/looping_threads.c     | 121 ++++++++++++++++++++++++++++++++++++++++++++
4d44fe
 tests/looping_threads.test  |  38 ++++++++++++++
4d44fe
 7 files changed, 166 insertions(+), 55 deletions(-)
4d44fe
 delete mode 100644 test/many_looping_threads.c
4d44fe
 create mode 100644 tests/looping_threads.c
4d44fe
 create mode 100755 tests/looping_threads.test
4d44fe
4d44fe
Index: strace-4.24/tests/Makefile.am
4d44fe
===================================================================
4d44fe
--- strace-4.24.orig/tests/Makefile.am	2019-03-10 05:50:05.488993755 +0100
4d44fe
+++ strace-4.24/tests/Makefile.am	2019-03-10 06:01:56.696871947 +0100
4d44fe
@@ -108,6 +108,7 @@
4d44fe
 	ksysent \
4d44fe
 	list_sigaction_signum \
4d44fe
 	localtime \
4d44fe
+	looping_threads \
4d44fe
 	mmsg-silent \
4d44fe
 	mmsg_name-v \
4d44fe
 	msg_control-v \
4d44fe
@@ -172,6 +173,7 @@
4d44fe
 fstatat64_CPPFLAGS = $(AM_CPPFLAGS) -D_FILE_OFFSET_BITS=64
4d44fe
 ftruncate64_CPPFLAGS = $(AM_CPPFLAGS) -D_FILE_OFFSET_BITS=64
4d44fe
 localtime_LDADD = $(clock_LIBS) $(LDADD)
4d44fe
+looping_threads_LDADD = -lpthread $(LDADD)
4d44fe
 lstat64_CPPFLAGS = $(AM_CPPFLAGS) -D_FILE_OFFSET_BITS=64
4d44fe
 mmap64_CPPFLAGS = $(AM_CPPFLAGS) -D_FILE_OFFSET_BITS=64
4d44fe
 mmap64_Xabbrev_CPPFLAGS = $(AM_CPPFLAGS) -D_FILE_OFFSET_BITS=64
4d44fe
@@ -304,6 +306,7 @@
4d44fe
 	kill_child.test \
4d44fe
 	ksysent.test \
4d44fe
 	localtime.test \
4d44fe
+	looping_threads.test \
4d44fe
 	opipe.test \
4d44fe
 	options-syntax.test \
4d44fe
 	pc.test \
4d44fe
@@ -347,7 +350,8 @@
4d44fe
 XFAIL_TESTS_mx32 = $(STACKTRACE_TESTS)
4d44fe
 XFAIL_TESTS_x86_64 = int_0x80.gen.test
4d44fe
 XFAIL_TESTS_x32 = int_0x80.gen.test
4d44fe
-XFAIL_TESTS = $(XFAIL_TESTS_$(MPERS_NAME)) $(XFAIL_TESTS_$(ARCH))
4d44fe
+XFAIL_TESTS = $(XFAIL_TESTS_$(MPERS_NAME)) $(XFAIL_TESTS_$(ARCH)) \
4d44fe
+	      looping_threads.test
4d44fe
 
4d44fe
 TEST_LOG_COMPILER = env
4d44fe
 AM_TEST_LOG_FLAGS = STRACE_ARCH=$(ARCH) STRACE_NATIVE_ARCH=$(NATIVE_ARCH) \
4d44fe
Index: strace-4.24/tests/looping_threads.c
4d44fe
===================================================================
4d44fe
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
4d44fe
+++ strace-4.24/tests/looping_threads.c	2019-03-10 06:01:56.697871937 +0100
4d44fe
@@ -0,0 +1,121 @@
4d44fe
+/*
4d44fe
+ * Check tracing of looping threads.
4d44fe
+ *
4d44fe
+ * Copyright (c) 2009-2019 The strace developers.
4d44fe
+ * All rights reserved.
4d44fe
+ *
4d44fe
+ * SPDX-License-Identifier: GPL-2.0-or-later
4d44fe
+ */
4d44fe
+
4d44fe
+#include "tests.h"
4d44fe
+#include <assert.h>
4d44fe
+#include <errno.h>
4d44fe
+#include <pthread.h>
4d44fe
+#include <signal.h>
4d44fe
+#include <stdio.h>
4d44fe
+#include <stdlib.h>
4d44fe
+#include <unistd.h>
4d44fe
+#include <sys/wait.h>
4d44fe
+
4d44fe
+static void *
4d44fe
+thread(void *arg)
4d44fe
+{
4d44fe
+	for (;;)
4d44fe
+		getuid();
4d44fe
+	return arg;
4d44fe
+}
4d44fe
+
4d44fe
+int
4d44fe
+main(int ac, const char *av[])
4d44fe
+{
4d44fe
+	assert(ac == 3);
4d44fe
+
4d44fe
+	int timeout = atoi(av[1]);
4d44fe
+	assert(timeout > 0);
4d44fe
+
4d44fe
+	int num_threads = atoi(av[2]);
4d44fe
+	assert(num_threads > 0);
4d44fe
+
4d44fe
+	/*
4d44fe
+	 * Unblock all signals.
4d44fe
+	 */
4d44fe
+	static sigset_t mask;
4d44fe
+	if (sigprocmask(SIG_SETMASK, &mask, NULL))
4d44fe
+		perror_msg_and_fail("sigprocmask");
4d44fe
+
4d44fe
+	/*
4d44fe
+	 * Reset SIGALRM and SIGHUP signal handlers.
4d44fe
+	 */
4d44fe
+	static const struct sigaction sa_def = { .sa_handler = SIG_DFL };
4d44fe
+	if (sigaction(SIGHUP, &sa_def, NULL))
4d44fe
+		perror_msg_and_fail("sigaction SIGHUP");
4d44fe
+	if (sigaction(SIGALRM, &sa_def, NULL))
4d44fe
+		perror_msg_and_fail("sigaction SIGALRM");
4d44fe
+
4d44fe
+	/*
4d44fe
+	 * Create a new process group.
4d44fe
+	 */
4d44fe
+	if (setpgid(0, 0))
4d44fe
+		perror_msg_and_fail("setpgid");
4d44fe
+
4d44fe
+	/*
4d44fe
+	 * Set an alarm clock.
4d44fe
+	 */
4d44fe
+	alarm(timeout);
4d44fe
+
4d44fe
+	/*
4d44fe
+	 * When the main process terminates, the process group becomes orphaned.
4d44fe
+	 * If any member of the orphaned process group is stopped, then
4d44fe
+	 * a SIGHUP signal followed by a SIGCONT signal is sent to each process
4d44fe
+	 * in the orphaned process group.
4d44fe
+	 * Create a process in a stopped state to activate this behaviour.
4d44fe
+	 */
4d44fe
+	const pid_t stopped = fork();
4d44fe
+	if (stopped < 0)
4d44fe
+		perror_msg_and_fail("fork");
4d44fe
+	if (!stopped) {
4d44fe
+		raise(SIGSTOP);
4d44fe
+		_exit(0);
4d44fe
+	}
4d44fe
+
4d44fe
+	/*
4d44fe
+	 * Wait for the process to stop.
4d44fe
+	 */
4d44fe
+	int status;
4d44fe
+	if (waitpid(stopped, &status, WUNTRACED) != stopped)
4d44fe
+		perror_msg_and_fail("waitpid WUNTRACED");
4d44fe
+	if (!WIFSTOPPED(status) || WSTOPSIG(status) != SIGSTOP)
4d44fe
+                error_msg_and_fail("waitpid WUNTRACED: "
4d44fe
+				   "unexpected wait status %d", status);
4d44fe
+	/*
4d44fe
+	 * Create all threads in a subprocess, this guarantees that
4d44fe
+	 * their tracer will not be their parent.
4d44fe
+	 */
4d44fe
+	pid_t pid = fork();
4d44fe
+	if (pid < 0)
4d44fe
+		perror_msg_and_fail("fork");
4d44fe
+	if (!pid) {
4d44fe
+		for (int i = 0; i < num_threads; i++) {
4d44fe
+			pthread_t t;
4d44fe
+			if ((errno = pthread_create(&t, NULL, thread, NULL))) {
4d44fe
+				if (EAGAIN == errno)
4d44fe
+					break;
4d44fe
+				perror_msg_and_fail("pthread_create #%d", i);
4d44fe
+			}
4d44fe
+		}
4d44fe
+
4d44fe
+		/* This terminates all threads created above.  */
4d44fe
+		_exit(0);
4d44fe
+	}
4d44fe
+
4d44fe
+	if (waitpid(pid, &status, 0) != pid)
4d44fe
+		perror_msg_and_fail("waitpid");
4d44fe
+	if (!WIFEXITED(status) || WEXITSTATUS(status) != 0)
4d44fe
+                error_msg_and_fail("waitpid: unexpected wait status %d",
4d44fe
+				   status);
4d44fe
+
4d44fe
+	/*
4d44fe
+	 * Make the process group orphaned.
4d44fe
+	 */
4d44fe
+	return 0;
4d44fe
+}
4d44fe
Index: strace-4.24/tests/looping_threads.test
4d44fe
===================================================================
4d44fe
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
4d44fe
+++ strace-4.24/tests/looping_threads.test	2019-03-10 06:01:56.697871937 +0100
4d44fe
@@ -0,0 +1,38 @@
4d44fe
+#!/bin/sh
4d44fe
+#
4d44fe
+# Check tracing of looping threads.
4d44fe
+#
4d44fe
+# Copyright (c) 2009-2019 The strace developers.
4d44fe
+# All rights reserved.
4d44fe
+#
4d44fe
+# SPDX-License-Identifier: GPL-2.0-or-later
4d44fe
+
4d44fe
+. "${srcdir=.}/init.sh"
4d44fe
+. "${srcdir=.}/PTRACE_SEIZE.sh"
4d44fe
+
4d44fe
+run_prog ../orphaned_process_group > /dev/null
4d44fe
+
4d44fe
+run_prog_skip_if_failed date +%s > /dev/null
4d44fe
+s0="$(date +%s)"
4d44fe
+
4d44fe
+check_prog nproc
4d44fe
+inc="$(nproc)"
4d44fe
+[ "$inc" -ge 1 ] || inc=1
4d44fe
+
4d44fe
+timeout_2="$(($TIMEOUT_DURATION/2))"
4d44fe
+timeout_8="$(($TIMEOUT_DURATION/8))"
4d44fe
+nproc=1
4d44fe
+
4d44fe
+run_prog "../$NAME" "$timeout_8" "$nproc"
4d44fe
+
4d44fe
+while :; do
4d44fe
+	run_strace -f -qq -enone -esignal=none "../$NAME" "$timeout_2" "$nproc"
4d44fe
+
4d44fe
+	s1="$(date +%s)"
4d44fe
+	[ "$(($s1-$s0))" -lt "$timeout_8" ] ||
4d44fe
+		break
4d44fe
+
4d44fe
+	nproc="$(($nproc+$inc))"
4d44fe
+done
4d44fe
+
4d44fe
+warn_ "$ME_: nproc=$nproc elapsed=$(($s1-$s0))"
4d44fe
Index: strace-4.24/tests-m32/looping_threads.c
4d44fe
===================================================================
4d44fe
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
4d44fe
+++ strace-4.24/tests-m32/looping_threads.c	2019-03-10 06:02:29.984538615 +0100
4d44fe
@@ -0,0 +1,121 @@
4d44fe
+/*
4d44fe
+ * Check tracing of looping threads.
4d44fe
+ *
4d44fe
+ * Copyright (c) 2009-2019 The strace developers.
4d44fe
+ * All rights reserved.
4d44fe
+ *
4d44fe
+ * SPDX-License-Identifier: GPL-2.0-or-later
4d44fe
+ */
4d44fe
+
4d44fe
+#include "tests.h"
4d44fe
+#include <assert.h>
4d44fe
+#include <errno.h>
4d44fe
+#include <pthread.h>
4d44fe
+#include <signal.h>
4d44fe
+#include <stdio.h>
4d44fe
+#include <stdlib.h>
4d44fe
+#include <unistd.h>
4d44fe
+#include <sys/wait.h>
4d44fe
+
4d44fe
+static void *
4d44fe
+thread(void *arg)
4d44fe
+{
4d44fe
+	for (;;)
4d44fe
+		getuid();
4d44fe
+	return arg;
4d44fe
+}
4d44fe
+
4d44fe
+int
4d44fe
+main(int ac, const char *av[])
4d44fe
+{
4d44fe
+	assert(ac == 3);
4d44fe
+
4d44fe
+	int timeout = atoi(av[1]);
4d44fe
+	assert(timeout > 0);
4d44fe
+
4d44fe
+	int num_threads = atoi(av[2]);
4d44fe
+	assert(num_threads > 0);
4d44fe
+
4d44fe
+	/*
4d44fe
+	 * Unblock all signals.
4d44fe
+	 */
4d44fe
+	static sigset_t mask;
4d44fe
+	if (sigprocmask(SIG_SETMASK, &mask, NULL))
4d44fe
+		perror_msg_and_fail("sigprocmask");
4d44fe
+
4d44fe
+	/*
4d44fe
+	 * Reset SIGALRM and SIGHUP signal handlers.
4d44fe
+	 */
4d44fe
+	static const struct sigaction sa_def = { .sa_handler = SIG_DFL };
4d44fe
+	if (sigaction(SIGHUP, &sa_def, NULL))
4d44fe
+		perror_msg_and_fail("sigaction SIGHUP");
4d44fe
+	if (sigaction(SIGALRM, &sa_def, NULL))
4d44fe
+		perror_msg_and_fail("sigaction SIGALRM");
4d44fe
+
4d44fe
+	/*
4d44fe
+	 * Create a new process group.
4d44fe
+	 */
4d44fe
+	if (setpgid(0, 0))
4d44fe
+		perror_msg_and_fail("setpgid");
4d44fe
+
4d44fe
+	/*
4d44fe
+	 * Set an alarm clock.
4d44fe
+	 */
4d44fe
+	alarm(timeout);
4d44fe
+
4d44fe
+	/*
4d44fe
+	 * When the main process terminates, the process group becomes orphaned.
4d44fe
+	 * If any member of the orphaned process group is stopped, then
4d44fe
+	 * a SIGHUP signal followed by a SIGCONT signal is sent to each process
4d44fe
+	 * in the orphaned process group.
4d44fe
+	 * Create a process in a stopped state to activate this behaviour.
4d44fe
+	 */
4d44fe
+	const pid_t stopped = fork();
4d44fe
+	if (stopped < 0)
4d44fe
+		perror_msg_and_fail("fork");
4d44fe
+	if (!stopped) {
4d44fe
+		raise(SIGSTOP);
4d44fe
+		_exit(0);
4d44fe
+	}
4d44fe
+
4d44fe
+	/*
4d44fe
+	 * Wait for the process to stop.
4d44fe
+	 */
4d44fe
+	int status;
4d44fe
+	if (waitpid(stopped, &status, WUNTRACED) != stopped)
4d44fe
+		perror_msg_and_fail("waitpid WUNTRACED");
4d44fe
+	if (!WIFSTOPPED(status) || WSTOPSIG(status) != SIGSTOP)
4d44fe
+                error_msg_and_fail("waitpid WUNTRACED: "
4d44fe
+				   "unexpected wait status %d", status);
4d44fe
+	/*
4d44fe
+	 * Create all threads in a subprocess, this guarantees that
4d44fe
+	 * their tracer will not be their parent.
4d44fe
+	 */
4d44fe
+	pid_t pid = fork();
4d44fe
+	if (pid < 0)
4d44fe
+		perror_msg_and_fail("fork");
4d44fe
+	if (!pid) {
4d44fe
+		for (int i = 0; i < num_threads; i++) {
4d44fe
+			pthread_t t;
4d44fe
+			if ((errno = pthread_create(&t, NULL, thread, NULL))) {
4d44fe
+				if (EAGAIN == errno)
4d44fe
+					break;
4d44fe
+				perror_msg_and_fail("pthread_create #%d", i);
4d44fe
+			}
4d44fe
+		}
4d44fe
+
4d44fe
+		/* This terminates all threads created above.  */
4d44fe
+		_exit(0);
4d44fe
+	}
4d44fe
+
4d44fe
+	if (waitpid(pid, &status, 0) != pid)
4d44fe
+		perror_msg_and_fail("waitpid");
4d44fe
+	if (!WIFEXITED(status) || WEXITSTATUS(status) != 0)
4d44fe
+                error_msg_and_fail("waitpid: unexpected wait status %d",
4d44fe
+				   status);
4d44fe
+
4d44fe
+	/*
4d44fe
+	 * Make the process group orphaned.
4d44fe
+	 */
4d44fe
+	return 0;
4d44fe
+}
4d44fe
Index: strace-4.24/tests-mx32/looping_threads.c
4d44fe
===================================================================
4d44fe
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
4d44fe
+++ strace-4.24/tests-mx32/looping_threads.c	2019-03-10 06:02:32.320515223 +0100
4d44fe
@@ -0,0 +1,121 @@
4d44fe
+/*
4d44fe
+ * Check tracing of looping threads.
4d44fe
+ *
4d44fe
+ * Copyright (c) 2009-2019 The strace developers.
4d44fe
+ * All rights reserved.
4d44fe
+ *
4d44fe
+ * SPDX-License-Identifier: GPL-2.0-or-later
4d44fe
+ */
4d44fe
+
4d44fe
+#include "tests.h"
4d44fe
+#include <assert.h>
4d44fe
+#include <errno.h>
4d44fe
+#include <pthread.h>
4d44fe
+#include <signal.h>
4d44fe
+#include <stdio.h>
4d44fe
+#include <stdlib.h>
4d44fe
+#include <unistd.h>
4d44fe
+#include <sys/wait.h>
4d44fe
+
4d44fe
+static void *
4d44fe
+thread(void *arg)
4d44fe
+{
4d44fe
+	for (;;)
4d44fe
+		getuid();
4d44fe
+	return arg;
4d44fe
+}
4d44fe
+
4d44fe
+int
4d44fe
+main(int ac, const char *av[])
4d44fe
+{
4d44fe
+	assert(ac == 3);
4d44fe
+
4d44fe
+	int timeout = atoi(av[1]);
4d44fe
+	assert(timeout > 0);
4d44fe
+
4d44fe
+	int num_threads = atoi(av[2]);
4d44fe
+	assert(num_threads > 0);
4d44fe
+
4d44fe
+	/*
4d44fe
+	 * Unblock all signals.
4d44fe
+	 */
4d44fe
+	static sigset_t mask;
4d44fe
+	if (sigprocmask(SIG_SETMASK, &mask, NULL))
4d44fe
+		perror_msg_and_fail("sigprocmask");
4d44fe
+
4d44fe
+	/*
4d44fe
+	 * Reset SIGALRM and SIGHUP signal handlers.
4d44fe
+	 */
4d44fe
+	static const struct sigaction sa_def = { .sa_handler = SIG_DFL };
4d44fe
+	if (sigaction(SIGHUP, &sa_def, NULL))
4d44fe
+		perror_msg_and_fail("sigaction SIGHUP");
4d44fe
+	if (sigaction(SIGALRM, &sa_def, NULL))
4d44fe
+		perror_msg_and_fail("sigaction SIGALRM");
4d44fe
+
4d44fe
+	/*
4d44fe
+	 * Create a new process group.
4d44fe
+	 */
4d44fe
+	if (setpgid(0, 0))
4d44fe
+		perror_msg_and_fail("setpgid");
4d44fe
+
4d44fe
+	/*
4d44fe
+	 * Set an alarm clock.
4d44fe
+	 */
4d44fe
+	alarm(timeout);
4d44fe
+
4d44fe
+	/*
4d44fe
+	 * When the main process terminates, the process group becomes orphaned.
4d44fe
+	 * If any member of the orphaned process group is stopped, then
4d44fe
+	 * a SIGHUP signal followed by a SIGCONT signal is sent to each process
4d44fe
+	 * in the orphaned process group.
4d44fe
+	 * Create a process in a stopped state to activate this behaviour.
4d44fe
+	 */
4d44fe
+	const pid_t stopped = fork();
4d44fe
+	if (stopped < 0)
4d44fe
+		perror_msg_and_fail("fork");
4d44fe
+	if (!stopped) {
4d44fe
+		raise(SIGSTOP);
4d44fe
+		_exit(0);
4d44fe
+	}
4d44fe
+
4d44fe
+	/*
4d44fe
+	 * Wait for the process to stop.
4d44fe
+	 */
4d44fe
+	int status;
4d44fe
+	if (waitpid(stopped, &status, WUNTRACED) != stopped)
4d44fe
+		perror_msg_and_fail("waitpid WUNTRACED");
4d44fe
+	if (!WIFSTOPPED(status) || WSTOPSIG(status) != SIGSTOP)
4d44fe
+                error_msg_and_fail("waitpid WUNTRACED: "
4d44fe
+				   "unexpected wait status %d", status);
4d44fe
+	/*
4d44fe
+	 * Create all threads in a subprocess, this guarantees that
4d44fe
+	 * their tracer will not be their parent.
4d44fe
+	 */
4d44fe
+	pid_t pid = fork();
4d44fe
+	if (pid < 0)
4d44fe
+		perror_msg_and_fail("fork");
4d44fe
+	if (!pid) {
4d44fe
+		for (int i = 0; i < num_threads; i++) {
4d44fe
+			pthread_t t;
4d44fe
+			if ((errno = pthread_create(&t, NULL, thread, NULL))) {
4d44fe
+				if (EAGAIN == errno)
4d44fe
+					break;
4d44fe
+				perror_msg_and_fail("pthread_create #%d", i);
4d44fe
+			}
4d44fe
+		}
4d44fe
+
4d44fe
+		/* This terminates all threads created above.  */
4d44fe
+		_exit(0);
4d44fe
+	}
4d44fe
+
4d44fe
+	if (waitpid(pid, &status, 0) != pid)
4d44fe
+		perror_msg_and_fail("waitpid");
4d44fe
+	if (!WIFEXITED(status) || WEXITSTATUS(status) != 0)
4d44fe
+                error_msg_and_fail("waitpid: unexpected wait status %d",
4d44fe
+				   status);
4d44fe
+
4d44fe
+	/*
4d44fe
+	 * Make the process group orphaned.
4d44fe
+	 */
4d44fe
+	return 0;
4d44fe
+}
4d44fe
Index: strace-4.24/tests/Makefile.in
4d44fe
===================================================================
4d44fe
--- strace-4.24.orig/tests/Makefile.in	2019-03-10 05:56:10.763336015 +0100
4d44fe
+++ strace-4.24/tests/Makefile.in	2019-03-10 06:05:55.655479092 +0100
4d44fe
@@ -155,7 +155,7 @@
4d44fe
 	ioctl_perf-success$(EXEEXT) ioctl_rtc-v$(EXEEXT) \
4d44fe
 	is_linux_mips_n64$(EXEEXT) kill_child$(EXEEXT) \
4d44fe
 	ksysent$(EXEEXT) list_sigaction_signum$(EXEEXT) \
4d44fe
-	localtime$(EXEEXT) \
4d44fe
+	localtime$(EXEEXT) looping_threads$(EXEEXT) \
4d44fe
 	mmsg-silent$(EXEEXT) mmsg_name-v$(EXEEXT) \
4d44fe
 	msg_control-v$(EXEEXT) net-accept-connect$(EXEEXT) \
4d44fe
 	net-tpacket_stats-success$(EXEEXT) netlink_inet_diag$(EXEEXT) \
4d44fe
@@ -1226,6 +1226,9 @@
4d44fe
 lookup_dcookie_OBJECTS = lookup_dcookie.$(OBJEXT)
4d44fe
 lookup_dcookie_LDADD = $(LDADD)
4d44fe
 lookup_dcookie_DEPENDENCIES = libtests.a
4d44fe
+looping_threads_SOURCES = looping_threads.c
4d44fe
+looping_threads_OBJECTS = looping_threads.$(OBJEXT)
4d44fe
+looping_threads_DEPENDENCIES = $(LDADD)
4d44fe
 lseek_SOURCES = lseek.c
4d44fe
 lseek_OBJECTS = lseek.$(OBJEXT)
4d44fe
 lseek_LDADD = $(LDADD)
4d44fe
@@ -2752,11 +2755,12 @@
4d44fe
 	kexec_file_load.c kexec_load.c keyctl.c keyctl-Xabbrev.c \
4d44fe
 	keyctl-Xraw.c keyctl-Xverbose.c kill.c kill_child.c ksysent.c \
4d44fe
 	lchown.c lchown32.c link.c linkat.c list_sigaction_signum.c \
4d44fe
-	llseek.c localtime.c lookup_dcookie.c lseek.c lstat.c lstat64.c \
4d44fe
-	madvise.c mbind.c membarrier.c memfd_create.c migrate_pages.c \
4d44fe
-	mincore.c mkdir.c mkdirat.c mknod.c mknodat.c mlock.c mlock2.c \
4d44fe
-	mlockall.c mmap.c mmap-Xabbrev.c mmap-Xraw.c mmap-Xverbose.c \
4d44fe
-	mmap64.c mmap64-Xabbrev.c mmap64-Xraw.c mmap64-Xverbose.c \
4d44fe
+	llseek.c localtime.c lookup_dcookie.c looping_threads.c \
4d44fe
+	lseek.c lstat.c lstat64.c madvise.c mbind.c membarrier.c \
4d44fe
+	memfd_create.c migrate_pages.c mincore.c mkdir.c mkdirat.c \
4d44fe
+	mknod.c mknodat.c mlock.c mlock2.c mlockall.c mmap.c \
4d44fe
+	mmap-Xabbrev.c mmap-Xraw.c mmap-Xverbose.c mmap64.c \
4d44fe
+	mmap64-Xabbrev.c mmap64-Xraw.c mmap64-Xverbose.c \
4d44fe
 	mmsg.c mmsg-silent.c mmsg_name.c mmsg_name-v.c modify_ldt.c \
4d44fe
 	mount.c mount-Xabbrev.c mount-Xraw.c mount-Xverbose.c \
4d44fe
 	move_pages.c mq.c mq_sendrecv.c mq_sendrecv-read.c \
4d44fe
@@ -2898,11 +2902,12 @@
4d44fe
 	kexec_file_load.c kexec_load.c keyctl.c keyctl-Xabbrev.c \
4d44fe
 	keyctl-Xraw.c keyctl-Xverbose.c kill.c kill_child.c ksysent.c \
4d44fe
 	lchown.c lchown32.c link.c linkat.c list_sigaction_signum.c \
4d44fe
-	llseek.c localtime.c lookup_dcookie.c lseek.c lstat.c lstat64.c \
4d44fe
-	madvise.c mbind.c membarrier.c memfd_create.c migrate_pages.c \
4d44fe
-	mincore.c mkdir.c mkdirat.c mknod.c mknodat.c mlock.c mlock2.c \
4d44fe
-	mlockall.c mmap.c mmap-Xabbrev.c mmap-Xraw.c mmap-Xverbose.c \
4d44fe
-	mmap64.c mmap64-Xabbrev.c mmap64-Xraw.c mmap64-Xverbose.c \
4d44fe
+	llseek.c localtime.c lookup_dcookie.c looping_threads.c \
4d44fe
+	lseek.c lstat.c lstat64.c madvise.c mbind.c membarrier.c \
4d44fe
+	memfd_create.c migrate_pages.c mincore.c mkdir.c mkdirat.c \
4d44fe
+	mknod.c mknodat.c mlock.c mlock2.c mlockall.c mmap.c \
4d44fe
+	mmap-Xabbrev.c mmap-Xraw.c mmap-Xverbose.c mmap64.c \
4d44fe
+	mmap64-Xabbrev.c mmap64-Xraw.c mmap64-Xverbose.c \
4d44fe
 	mmsg.c mmsg-silent.c mmsg_name.c mmsg_name-v.c modify_ldt.c \
4d44fe
 	mount.c mount-Xabbrev.c mount-Xraw.c mount-Xverbose.c \
4d44fe
 	move_pages.c mq.c mq_sendrecv.c mq_sendrecv-read.c \
4d44fe
@@ -3922,6 +3927,7 @@
4d44fe
 fstatat64_CPPFLAGS = $(AM_CPPFLAGS) -D_FILE_OFFSET_BITS=64
4d44fe
 ftruncate64_CPPFLAGS = $(AM_CPPFLAGS) -D_FILE_OFFSET_BITS=64
4d44fe
 localtime_LDADD = $(clock_LIBS) $(LDADD)
4d44fe
+looping_threads_LDADD = -lpthread $(LDADD)
4d44fe
 lstat64_CPPFLAGS = $(AM_CPPFLAGS) -D_FILE_OFFSET_BITS=64
4d44fe
 mmap64_CPPFLAGS = $(AM_CPPFLAGS) -D_FILE_OFFSET_BITS=64
4d44fe
 mmap64_Xabbrev_CPPFLAGS = $(AM_CPPFLAGS) -D_FILE_OFFSET_BITS=64
4d44fe
@@ -4242,6 +4248,7 @@
4d44fe
 	kill_child.test \
4d44fe
 	ksysent.test \
4d44fe
 	localtime.test \
4d44fe
+	looping_threads.test \
4d44fe
 	opipe.test \
4d44fe
 	options-syntax.test \
4d44fe
 	pc.test \
4d44fe
@@ -5243,6 +5250,10 @@
4d44fe
 	@rm -f lookup_dcookie$(EXEEXT)
4d44fe
 	$(AM_V_CCLD)$(LINK) $(lookup_dcookie_OBJECTS) $(lookup_dcookie_LDADD) $(LIBS)
4d44fe
 
4d44fe
+looping_threads$(EXEEXT): $(looping_threads_OBJECTS) $(looping_threads_DEPENDENCIES) $(EXTRA_looping_threads_DEPENDENCIES) 
4d44fe
+	@rm -f looping_threads$(EXEEXT)
4d44fe
+	$(AM_V_CCLD)$(LINK) $(looping_threads_OBJECTS) $(looping_threads_LDADD) $(LIBS)
4d44fe
+
4d44fe
 lseek$(EXEEXT): $(lseek_OBJECTS) $(lseek_DEPENDENCIES) $(EXTRA_lseek_DEPENDENCIES) 
4d44fe
 	@rm -f lseek$(EXEEXT)
4d44fe
 	$(AM_V_CCLD)$(LINK) $(lseek_OBJECTS) $(lseek_LDADD) $(LIBS)
4d44fe
@@ -6912,6 +6923,7 @@
4d44fe
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/llseek.Po@am__quote@
4d44fe
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/localtime.Po@am__quote@
4d44fe
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lookup_dcookie.Po@am__quote@
4d44fe
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/looping_threads.Po@am__quote@
4d44fe
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lseek.Po@am__quote@
4d44fe
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lstat.Po@am__quote@
4d44fe
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lstat64-lstat64.Po@am__quote@
4d44fe
Index: strace-4.24/tests-m32/Makefile.in
4d44fe
===================================================================
4d44fe
--- strace-4.24.orig/tests-m32/Makefile.in	2019-03-10 05:57:09.322749620 +0100
4d44fe
+++ strace-4.24/tests-m32/Makefile.in	2019-03-10 06:06:47.107963863 +0100
4d44fe
@@ -155,7 +155,7 @@
4d44fe
 	ioctl_perf-success$(EXEEXT) ioctl_rtc-v$(EXEEXT) \
4d44fe
 	is_linux_mips_n64$(EXEEXT) kill_child$(EXEEXT) \
4d44fe
 	ksysent$(EXEEXT) list_sigaction_signum$(EXEEXT) \
4d44fe
-	localtime$(EXEEXT) \
4d44fe
+	localtime$(EXEEXT) looping_threads$(EXEEXT) \
4d44fe
 	mmsg-silent$(EXEEXT) mmsg_name-v$(EXEEXT) \
4d44fe
 	msg_control-v$(EXEEXT) net-accept-connect$(EXEEXT) \
4d44fe
 	net-tpacket_stats-success$(EXEEXT) netlink_inet_diag$(EXEEXT) \
4d44fe
@@ -1226,6 +1226,9 @@
4d44fe
 lookup_dcookie_OBJECTS = lookup_dcookie.$(OBJEXT)
4d44fe
 lookup_dcookie_LDADD = $(LDADD)
4d44fe
 lookup_dcookie_DEPENDENCIES = libtests.a
4d44fe
+looping_threads_SOURCES = looping_threads.c
4d44fe
+looping_threads_OBJECTS = looping_threads.$(OBJEXT)
4d44fe
+looping_threads_DEPENDENCIES = $(LDADD)
4d44fe
 lseek_SOURCES = lseek.c
4d44fe
 lseek_OBJECTS = lseek.$(OBJEXT)
4d44fe
 lseek_LDADD = $(LDADD)
4d44fe
@@ -2752,11 +2755,12 @@
4d44fe
 	kexec_file_load.c kexec_load.c keyctl.c keyctl-Xabbrev.c \
4d44fe
 	keyctl-Xraw.c keyctl-Xverbose.c kill.c kill_child.c ksysent.c \
4d44fe
 	lchown.c lchown32.c link.c linkat.c list_sigaction_signum.c \
4d44fe
-	llseek.c localtime.c lookup_dcookie.c lseek.c lstat.c lstat64.c \
4d44fe
-	madvise.c mbind.c membarrier.c memfd_create.c migrate_pages.c \
4d44fe
-	mincore.c mkdir.c mkdirat.c mknod.c mknodat.c mlock.c mlock2.c \
4d44fe
-	mlockall.c mmap.c mmap-Xabbrev.c mmap-Xraw.c mmap-Xverbose.c \
4d44fe
-	mmap64.c mmap64-Xabbrev.c mmap64-Xraw.c mmap64-Xverbose.c \
4d44fe
+	llseek.c localtime.c lookup_dcookie.c looping_threads.c \
4d44fe
+	lseek.c lstat.c lstat64.c madvise.c mbind.c membarrier.c \
4d44fe
+	memfd_create.c migrate_pages.c mincore.c mkdir.c mkdirat.c \
4d44fe
+	mknod.c mknodat.c mlock.c mlock2.c mlockall.c mmap.c \
4d44fe
+	mmap-Xabbrev.c mmap-Xraw.c mmap-Xverbose.c mmap64.c \
4d44fe
+	mmap64-Xabbrev.c mmap64-Xraw.c mmap64-Xverbose.c \
4d44fe
 	mmsg.c mmsg-silent.c mmsg_name.c mmsg_name-v.c modify_ldt.c \
4d44fe
 	mount.c mount-Xabbrev.c mount-Xraw.c mount-Xverbose.c \
4d44fe
 	move_pages.c mq.c mq_sendrecv.c mq_sendrecv-read.c \
4d44fe
@@ -2898,11 +2902,12 @@
4d44fe
 	kexec_file_load.c kexec_load.c keyctl.c keyctl-Xabbrev.c \
4d44fe
 	keyctl-Xraw.c keyctl-Xverbose.c kill.c kill_child.c ksysent.c \
4d44fe
 	lchown.c lchown32.c link.c linkat.c list_sigaction_signum.c \
4d44fe
-	llseek.c localtime.c lookup_dcookie.c lseek.c lstat.c lstat64.c \
4d44fe
-	madvise.c mbind.c membarrier.c memfd_create.c migrate_pages.c \
4d44fe
-	mincore.c mkdir.c mkdirat.c mknod.c mknodat.c mlock.c mlock2.c \
4d44fe
-	mlockall.c mmap.c mmap-Xabbrev.c mmap-Xraw.c mmap-Xverbose.c \
4d44fe
-	mmap64.c mmap64-Xabbrev.c mmap64-Xraw.c mmap64-Xverbose.c \
4d44fe
+	llseek.c localtime.c lookup_dcookie.c looping_threads.c \
4d44fe
+	lseek.c lstat.c lstat64.c madvise.c mbind.c membarrier.c \
4d44fe
+	memfd_create.c migrate_pages.c mincore.c mkdir.c mkdirat.c \
4d44fe
+	mknod.c mknodat.c mlock.c mlock2.c mlockall.c mmap.c \
4d44fe
+	mmap-Xabbrev.c mmap-Xraw.c mmap-Xverbose.c mmap64.c \
4d44fe
+	mmap64-Xabbrev.c mmap64-Xraw.c mmap64-Xverbose.c \
4d44fe
 	mmsg.c mmsg-silent.c mmsg_name.c mmsg_name-v.c modify_ldt.c \
4d44fe
 	mount.c mount-Xabbrev.c mount-Xraw.c mount-Xverbose.c \
4d44fe
 	move_pages.c mq.c mq_sendrecv.c mq_sendrecv-read.c \
4d44fe
@@ -3922,6 +3927,7 @@
4d44fe
 fstatat64_CPPFLAGS = $(AM_CPPFLAGS) -D_FILE_OFFSET_BITS=64
4d44fe
 ftruncate64_CPPFLAGS = $(AM_CPPFLAGS) -D_FILE_OFFSET_BITS=64
4d44fe
 localtime_LDADD = $(clock_LIBS) $(LDADD)
4d44fe
+looping_threads_LDADD = -lpthread $(LDADD)
4d44fe
 lstat64_CPPFLAGS = $(AM_CPPFLAGS) -D_FILE_OFFSET_BITS=64
4d44fe
 mmap64_CPPFLAGS = $(AM_CPPFLAGS) -D_FILE_OFFSET_BITS=64
4d44fe
 mmap64_Xabbrev_CPPFLAGS = $(AM_CPPFLAGS) -D_FILE_OFFSET_BITS=64
4d44fe
@@ -4242,6 +4248,7 @@
4d44fe
 	kill_child.test \
4d44fe
 	ksysent.test \
4d44fe
 	localtime.test \
4d44fe
+	looping_threads.test \
4d44fe
 	opipe.test \
4d44fe
 	options-syntax.test \
4d44fe
 	pc.test \
4d44fe
@@ -5243,6 +5250,10 @@
4d44fe
 	@rm -f lookup_dcookie$(EXEEXT)
4d44fe
 	$(AM_V_CCLD)$(LINK) $(lookup_dcookie_OBJECTS) $(lookup_dcookie_LDADD) $(LIBS)
4d44fe
 
4d44fe
+looping_threads$(EXEEXT): $(looping_threads_OBJECTS) $(looping_threads_DEPENDENCIES) $(EXTRA_looping_threads_DEPENDENCIES) 
4d44fe
+	@rm -f looping_threads$(EXEEXT)
4d44fe
+	$(AM_V_CCLD)$(LINK) $(looping_threads_OBJECTS) $(looping_threads_LDADD) $(LIBS)
4d44fe
+
4d44fe
 lseek$(EXEEXT): $(lseek_OBJECTS) $(lseek_DEPENDENCIES) $(EXTRA_lseek_DEPENDENCIES) 
4d44fe
 	@rm -f lseek$(EXEEXT)
4d44fe
 	$(AM_V_CCLD)$(LINK) $(lseek_OBJECTS) $(lseek_LDADD) $(LIBS)
4d44fe
@@ -6912,6 +6923,7 @@
4d44fe
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/llseek.Po@am__quote@
4d44fe
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/localtime.Po@am__quote@
4d44fe
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lookup_dcookie.Po@am__quote@
4d44fe
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/looping_threads.Po@am__quote@
4d44fe
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lseek.Po@am__quote@
4d44fe
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lstat.Po@am__quote@
4d44fe
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lstat64-lstat64.Po@am__quote@
4d44fe
Index: strace-4.24/tests-mx32/Makefile.in
4d44fe
===================================================================
4d44fe
--- strace-4.24.orig/tests-mx32/Makefile.in	2019-03-10 05:57:19.939643305 +0100
4d44fe
+++ strace-4.24/tests-mx32/Makefile.in	2019-03-10 06:06:42.992005079 +0100
4d44fe
@@ -155,7 +155,7 @@
4d44fe
 	ioctl_perf-success$(EXEEXT) ioctl_rtc-v$(EXEEXT) \
4d44fe
 	is_linux_mips_n64$(EXEEXT) kill_child$(EXEEXT) \
4d44fe
 	ksysent$(EXEEXT) list_sigaction_signum$(EXEEXT) \
4d44fe
-	localtime$(EXEEXT) \
4d44fe
+	localtime$(EXEEXT) looping_threads$(EXEEXT) \
4d44fe
 	mmsg-silent$(EXEEXT) mmsg_name-v$(EXEEXT) \
4d44fe
 	msg_control-v$(EXEEXT) net-accept-connect$(EXEEXT) \
4d44fe
 	net-tpacket_stats-success$(EXEEXT) netlink_inet_diag$(EXEEXT) \
4d44fe
@@ -1226,6 +1226,9 @@
4d44fe
 lookup_dcookie_OBJECTS = lookup_dcookie.$(OBJEXT)
4d44fe
 lookup_dcookie_LDADD = $(LDADD)
4d44fe
 lookup_dcookie_DEPENDENCIES = libtests.a
4d44fe
+looping_threads_SOURCES = looping_threads.c
4d44fe
+looping_threads_OBJECTS = looping_threads.$(OBJEXT)
4d44fe
+looping_threads_DEPENDENCIES = $(LDADD)
4d44fe
 lseek_SOURCES = lseek.c
4d44fe
 lseek_OBJECTS = lseek.$(OBJEXT)
4d44fe
 lseek_LDADD = $(LDADD)
4d44fe
@@ -2752,11 +2755,12 @@
4d44fe
 	kexec_file_load.c kexec_load.c keyctl.c keyctl-Xabbrev.c \
4d44fe
 	keyctl-Xraw.c keyctl-Xverbose.c kill.c kill_child.c ksysent.c \
4d44fe
 	lchown.c lchown32.c link.c linkat.c list_sigaction_signum.c \
4d44fe
-	llseek.c localtime.c lookup_dcookie.c lseek.c lstat.c lstat64.c \
4d44fe
-	madvise.c mbind.c membarrier.c memfd_create.c migrate_pages.c \
4d44fe
-	mincore.c mkdir.c mkdirat.c mknod.c mknodat.c mlock.c mlock2.c \
4d44fe
-	mlockall.c mmap.c mmap-Xabbrev.c mmap-Xraw.c mmap-Xverbose.c \
4d44fe
-	mmap64.c mmap64-Xabbrev.c mmap64-Xraw.c mmap64-Xverbose.c \
4d44fe
+	llseek.c localtime.c lookup_dcookie.c looping_threads.c \
4d44fe
+	lseek.c lstat.c lstat64.c madvise.c mbind.c membarrier.c \
4d44fe
+	memfd_create.c migrate_pages.c mincore.c mkdir.c mkdirat.c \
4d44fe
+	mknod.c mknodat.c mlock.c mlock2.c mlockall.c mmap.c \
4d44fe
+	mmap-Xabbrev.c mmap-Xraw.c mmap-Xverbose.c mmap64.c \
4d44fe
+	mmap64-Xabbrev.c mmap64-Xraw.c mmap64-Xverbose.c \
4d44fe
 	mmsg.c mmsg-silent.c mmsg_name.c mmsg_name-v.c modify_ldt.c \
4d44fe
 	mount.c mount-Xabbrev.c mount-Xraw.c mount-Xverbose.c \
4d44fe
 	move_pages.c mq.c mq_sendrecv.c mq_sendrecv-read.c \
4d44fe
@@ -2898,11 +2902,12 @@
4d44fe
 	kexec_file_load.c kexec_load.c keyctl.c keyctl-Xabbrev.c \
4d44fe
 	keyctl-Xraw.c keyctl-Xverbose.c kill.c kill_child.c ksysent.c \
4d44fe
 	lchown.c lchown32.c link.c linkat.c list_sigaction_signum.c \
4d44fe
-	llseek.c localtime.c lookup_dcookie.c lseek.c lstat.c lstat64.c \
4d44fe
-	madvise.c mbind.c membarrier.c memfd_create.c migrate_pages.c \
4d44fe
-	mincore.c mkdir.c mkdirat.c mknod.c mknodat.c mlock.c mlock2.c \
4d44fe
-	mlockall.c mmap.c mmap-Xabbrev.c mmap-Xraw.c mmap-Xverbose.c \
4d44fe
-	mmap64.c mmap64-Xabbrev.c mmap64-Xraw.c mmap64-Xverbose.c \
4d44fe
+	llseek.c localtime.c lookup_dcookie.c looping_threads.c \
4d44fe
+	lseek.c lstat.c lstat64.c madvise.c mbind.c membarrier.c \
4d44fe
+	memfd_create.c migrate_pages.c mincore.c mkdir.c mkdirat.c \
4d44fe
+	mknod.c mknodat.c mlock.c mlock2.c mlockall.c mmap.c \
4d44fe
+	mmap-Xabbrev.c mmap-Xraw.c mmap-Xverbose.c mmap64.c \
4d44fe
+	mmap64-Xabbrev.c mmap64-Xraw.c mmap64-Xverbose.c \
4d44fe
 	mmsg.c mmsg-silent.c mmsg_name.c mmsg_name-v.c modify_ldt.c \
4d44fe
 	mount.c mount-Xabbrev.c mount-Xraw.c mount-Xverbose.c \
4d44fe
 	move_pages.c mq.c mq_sendrecv.c mq_sendrecv-read.c \
4d44fe
@@ -3922,6 +3927,7 @@
4d44fe
 fstatat64_CPPFLAGS = $(AM_CPPFLAGS) -D_FILE_OFFSET_BITS=64
4d44fe
 ftruncate64_CPPFLAGS = $(AM_CPPFLAGS) -D_FILE_OFFSET_BITS=64
4d44fe
 localtime_LDADD = $(clock_LIBS) $(LDADD)
4d44fe
+looping_threads_LDADD = -lpthread $(LDADD)
4d44fe
 lstat64_CPPFLAGS = $(AM_CPPFLAGS) -D_FILE_OFFSET_BITS=64
4d44fe
 mmap64_CPPFLAGS = $(AM_CPPFLAGS) -D_FILE_OFFSET_BITS=64
4d44fe
 mmap64_Xabbrev_CPPFLAGS = $(AM_CPPFLAGS) -D_FILE_OFFSET_BITS=64
4d44fe
@@ -4242,6 +4248,7 @@
4d44fe
 	kill_child.test \
4d44fe
 	ksysent.test \
4d44fe
 	localtime.test \
4d44fe
+	looping_threads.test \
4d44fe
 	opipe.test \
4d44fe
 	options-syntax.test \
4d44fe
 	pc.test \
4d44fe
@@ -5243,6 +5250,10 @@
4d44fe
 	@rm -f lookup_dcookie$(EXEEXT)
4d44fe
 	$(AM_V_CCLD)$(LINK) $(lookup_dcookie_OBJECTS) $(lookup_dcookie_LDADD) $(LIBS)
4d44fe
 
4d44fe
+looping_threads$(EXEEXT): $(looping_threads_OBJECTS) $(looping_threads_DEPENDENCIES) $(EXTRA_looping_threads_DEPENDENCIES) 
4d44fe
+	@rm -f looping_threads$(EXEEXT)
4d44fe
+	$(AM_V_CCLD)$(LINK) $(looping_threads_OBJECTS) $(looping_threads_LDADD) $(LIBS)
4d44fe
+
4d44fe
 lseek$(EXEEXT): $(lseek_OBJECTS) $(lseek_DEPENDENCIES) $(EXTRA_lseek_DEPENDENCIES) 
4d44fe
 	@rm -f lseek$(EXEEXT)
4d44fe
 	$(AM_V_CCLD)$(LINK) $(lseek_OBJECTS) $(lseek_LDADD) $(LIBS)
4d44fe
@@ -6912,6 +6923,7 @@
4d44fe
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/llseek.Po@am__quote@
4d44fe
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/localtime.Po@am__quote@
4d44fe
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lookup_dcookie.Po@am__quote@
4d44fe
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/looping_threads.Po@am__quote@
4d44fe
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lseek.Po@am__quote@
4d44fe
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lstat.Po@am__quote@
4d44fe
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lstat64-lstat64.Po@am__quote@
4d44fe
Index: strace-4.24/tests-m32/looping_threads.test
4d44fe
===================================================================
4d44fe
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
4d44fe
+++ strace-4.24/tests-m32/looping_threads.test	2019-08-29 17:32:41.677062567 +0200
4d44fe
@@ -0,0 +1,38 @@
4d44fe
+#!/bin/sh
4d44fe
+#
4d44fe
+# Check tracing of looping threads.
4d44fe
+#
4d44fe
+# Copyright (c) 2009-2019 The strace developers.
4d44fe
+# All rights reserved.
4d44fe
+#
4d44fe
+# SPDX-License-Identifier: GPL-2.0-or-later
4d44fe
+
4d44fe
+. "${srcdir=.}/init.sh"
4d44fe
+. "${srcdir=.}/PTRACE_SEIZE.sh"
4d44fe
+
4d44fe
+run_prog ../orphaned_process_group > /dev/null
4d44fe
+
4d44fe
+run_prog_skip_if_failed date +%s > /dev/null
4d44fe
+s0="$(date +%s)"
4d44fe
+
4d44fe
+check_prog nproc
4d44fe
+inc="$(nproc)"
4d44fe
+[ "$inc" -ge 1 ] || inc=1
4d44fe
+
4d44fe
+timeout_2="$(($TIMEOUT_DURATION/2))"
4d44fe
+timeout_8="$(($TIMEOUT_DURATION/8))"
4d44fe
+nproc=1
4d44fe
+
4d44fe
+run_prog "../$NAME" "$timeout_8" "$nproc"
4d44fe
+
4d44fe
+while :; do
4d44fe
+	run_strace -f -qq -enone -esignal=none "../$NAME" "$timeout_2" "$nproc"
4d44fe
+
4d44fe
+	s1="$(date +%s)"
4d44fe
+	[ "$(($s1-$s0))" -lt "$timeout_8" ] ||
4d44fe
+		break
4d44fe
+
4d44fe
+	nproc="$(($nproc+$inc))"
4d44fe
+done
4d44fe
+
4d44fe
+warn_ "$ME_: nproc=$nproc elapsed=$(($s1-$s0))"
4d44fe
Index: strace-4.24/tests-mx32/looping_threads.test
4d44fe
===================================================================
4d44fe
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
4d44fe
+++ strace-4.24/tests-mx32/looping_threads.test	2019-08-29 17:32:47.841985400 +0200
4d44fe
@@ -0,0 +1,38 @@
4d44fe
+#!/bin/sh
4d44fe
+#
4d44fe
+# Check tracing of looping threads.
4d44fe
+#
4d44fe
+# Copyright (c) 2009-2019 The strace developers.
4d44fe
+# All rights reserved.
4d44fe
+#
4d44fe
+# SPDX-License-Identifier: GPL-2.0-or-later
4d44fe
+
4d44fe
+. "${srcdir=.}/init.sh"
4d44fe
+. "${srcdir=.}/PTRACE_SEIZE.sh"
4d44fe
+
4d44fe
+run_prog ../orphaned_process_group > /dev/null
4d44fe
+
4d44fe
+run_prog_skip_if_failed date +%s > /dev/null
4d44fe
+s0="$(date +%s)"
4d44fe
+
4d44fe
+check_prog nproc
4d44fe
+inc="$(nproc)"
4d44fe
+[ "$inc" -ge 1 ] || inc=1
4d44fe
+
4d44fe
+timeout_2="$(($TIMEOUT_DURATION/2))"
4d44fe
+timeout_8="$(($TIMEOUT_DURATION/8))"
4d44fe
+nproc=1
4d44fe
+
4d44fe
+run_prog "../$NAME" "$timeout_8" "$nproc"
4d44fe
+
4d44fe
+while :; do
4d44fe
+	run_strace -f -qq -enone -esignal=none "../$NAME" "$timeout_2" "$nproc"
4d44fe
+
4d44fe
+	s1="$(date +%s)"
4d44fe
+	[ "$(($s1-$s0))" -lt "$timeout_8" ] ||
4d44fe
+		break
4d44fe
+
4d44fe
+	nproc="$(($nproc+$inc))"
4d44fe
+done
4d44fe
+
4d44fe
+warn_ "$ME_: nproc=$nproc elapsed=$(($s1-$s0))"