[LTP] [PATCH v4 1/2] lib: introduce tst_timeout_remaining()

Jan Stancek jstancek@redhat.com
Thu Aug 30 10:55:18 CEST 2018


Which returns number of seconds remaining until timeout.
Along with tst_start_time it is only valid for test pid.

Its value has to be (re)initialized when:
- test starts
- test calls tst_set_timeout()
- test runs multiple iterations or uses .all_filesystems

Signed-off-by: Jan Stancek <jstancek@redhat.com>
---
Changes in v4:
- drop tst_timer_find_clock(), use CLOCK_MONOTONIC
- reinitialize in heartbeat(), so we cover -i parameter and tst_set_timeout()
- modify test18 so it sleeps
- add test18 .gitignore
- add note to docs

 doc/test-writing-guidelines.txt |  3 +++
 include/tst_test.h              |  1 +
 lib/newlib_tests/.gitignore     |  1 +
 lib/newlib_tests/test18.c       | 34 ++++++++++++++++++++++++++++++++++
 lib/tst_test.c                  | 22 ++++++++++++++++++++++
 5 files changed, 61 insertions(+)
 create mode 100644 lib/newlib_tests/test18.c

diff --git a/doc/test-writing-guidelines.txt b/doc/test-writing-guidelines.txt
index a16972430b14..0194f2098d26 100644
--- a/doc/test-writing-guidelines.txt
+++ b/doc/test-writing-guidelines.txt
@@ -324,6 +324,9 @@ overriden by setting '.timeout' in the test structure or by calling
 time may vary arbitrarily, for these timeout can be disabled by setting it to
 -1.
 
+Test can find out how much time (in seconds) is remaining to timeout,
+by calling 'tst_timeout_remaining()'.
+
 A word about the cleanup() callback
 +++++++++++++++++++++++++++++++++++
 
diff --git a/include/tst_test.h b/include/tst_test.h
index 98dacf3873ab..c0c9a7c7b995 100644
--- a/include/tst_test.h
+++ b/include/tst_test.h
@@ -217,6 +217,7 @@ const char *tst_strsig(int sig);
  */
 const char *tst_strstatus(int status);
 
+unsigned int tst_timeout_remaining(void);
 void tst_set_timeout(int timeout);
 
 #ifndef TST_NO_DEFAULT_MAIN
diff --git a/lib/newlib_tests/.gitignore b/lib/newlib_tests/.gitignore
index 99edc640438e..76e89e438f55 100644
--- a/lib/newlib_tests/.gitignore
+++ b/lib/newlib_tests/.gitignore
@@ -19,6 +19,7 @@ tst_safe_fileops
 tst_res_hexd
 tst_strstatus
 test17
+test18
 tst_expiration_timer
 test_exec
 test_exec_child
diff --git a/lib/newlib_tests/test18.c b/lib/newlib_tests/test18.c
new file mode 100644
index 000000000000..6615471a5708
--- /dev/null
+++ b/lib/newlib_tests/test18.c
@@ -0,0 +1,34 @@
+/*
+ * Copyright (c) 2018, Linux Test Project
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <stdlib.h>
+#include <unistd.h>
+#include "tst_test.h"
+
+static void run(void)
+{
+	do {
+		sleep(1);
+	} while (tst_timeout_remaining() >= 4);
+
+	tst_res(TPASS, "Timeout remaining: %d", tst_timeout_remaining());
+}
+
+static struct tst_test test = {
+	.test_all = run,
+	.timeout = 5
+};
diff --git a/lib/tst_test.c b/lib/tst_test.c
index 2f3d357d2fcc..ae3ca6182581 100644
--- a/lib/tst_test.c
+++ b/lib/tst_test.c
@@ -47,6 +47,7 @@ static int iterations = 1;
 static float duration = -1;
 static pid_t main_pid, lib_pid;
 static int mntpoint_mounted;
+static struct timespec tst_start_time; /* valid only for test pid */
 
 struct results {
 	int passed;
@@ -916,6 +917,9 @@ static void add_paths(void)
 
 static void heartbeat(void)
 {
+	if (tst_clock_gettime(CLOCK_MONOTONIC, &tst_start_time))
+		tst_res(TWARN | TERRNO, "tst_clock_gettime() failed");
+
 	kill(getppid(), SIGUSR1);
 }
 
@@ -925,6 +929,9 @@ static void testrun(void)
 	unsigned long long stop_time = 0;
 	int cont = 1;
 
+	if (tst_clock_gettime(CLOCK_MONOTONIC, &tst_start_time))
+		tst_res(TWARN | TERRNO, "tst_clock_gettime() failed");
+
 	add_paths();
 	do_test_setup();
 
@@ -992,6 +999,21 @@ static void sigint_handler(int sig LTP_ATTRIBUTE_UNUSED)
 	}
 }
 
+unsigned int tst_timeout_remaining(void)
+{
+	static struct timespec now;
+	unsigned int elapsed;
+
+	if (tst_clock_gettime(CLOCK_MONOTONIC, &now))
+		tst_res(TWARN | TERRNO, "tst_clock_gettime() failed");
+
+	elapsed = tst_timespec_diff_ms(now, tst_start_time) / 1000;
+	if (results->timeout > elapsed)
+		return results->timeout - elapsed;
+
+	return 0;
+}
+
 void tst_set_timeout(int timeout)
 {
 	char *mul = getenv("LTP_TIMEOUT_MUL");
-- 
1.8.3.1



More information about the ltp mailing list