Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/tests/lib/libc/sys Add new auxiliary functions in t_ptrace_w...
details: https://anonhg.NetBSD.org/src/rev/b37c014623cc
branches: trunk
changeset: 322811:b37c014623cc
user: kamil <kamil%NetBSD.org@localhost>
date: Sat May 19 05:04:09 2018 +0000
description:
Add new auxiliary functions in t_ptrace_wait.h
New functions:
- FORKEE_ASSERT_NEQ()
- await_stopped_child()
Both will be used soon in a new ATF ptrace(2) test.
Sponsored by <The NetBSD Foundation>
diffstat:
tests/lib/libc/sys/t_ptrace_wait.h | 68 +++++++++++++++++++++++++++++++++++++-
1 files changed, 67 insertions(+), 1 deletions(-)
diffs (89 lines):
diff -r 5ba1fa5812dd -r b37c014623cc tests/lib/libc/sys/t_ptrace_wait.h
--- a/tests/lib/libc/sys/t_ptrace_wait.h Sat May 19 05:01:42 2018 +0000
+++ b/tests/lib/libc/sys/t_ptrace_wait.h Sat May 19 05:04:09 2018 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: t_ptrace_wait.h,v 1.4 2018/05/13 23:01:25 kamil Exp $ */
+/* $NetBSD: t_ptrace_wait.h,v 1.5 2018/05/19 05:04:09 kamil Exp $ */
/*-
* Copyright (c) 2016 The NetBSD Foundation, Inc.
@@ -153,6 +153,17 @@
#x, vx, #y, vy); \
} while (/*CONSTCOND*/0)
+#define FORKEE_ASSERT_NEQ(x, y) \
+do { \
+ uintmax_t vx = (x); \
+ uintmax_t vy = (y); \
+ int ret = vx != vy; \
+ if (!ret) \
+ errx(EXIT_FAILURE, "%s:%d %s(): Assertion failed for: " \
+ "%s(%ju) != %s(%ju)", __FILE__, __LINE__, __func__, \
+ #x, vx, #y, vy); \
+} while (/*CONSTCOND*/0)
+
#define FORKEE_ASSERTX(x) \
do { \
int ret = (x); \
@@ -364,6 +375,61 @@
await_zombie_raw(process, 1000);
}
+static pid_t __used
+await_stopped_child(pid_t process)
+{
+ struct kinfo_proc2 *p = NULL;
+ size_t i, len;
+ pid_t child = -1;
+
+ int name[] = {
+ [0] = CTL_KERN,
+ [1] = KERN_PROC2,
+ [2] = KERN_PROC_ALL,
+ [3] = 0,
+ [4] = sizeof(struct kinfo_proc2),
+ [5] = 0
+ };
+
+ const size_t namelen = __arraycount(name);
+
+ /* Await the process becoming a zombie */
+ while(1) {
+ name[5] = 0;
+
+ FORKEE_ASSERT_EQ(sysctl(name, namelen, 0, &len, NULL, 0), 0);
+
+ FORKEE_ASSERT_EQ(reallocarr(&p,
+ len,
+ sizeof(struct kinfo_proc2)), 0);
+
+ name[5] = len;
+
+ FORKEE_ASSERT_EQ(sysctl(name, namelen, p, &len, NULL, 0), 0);
+
+ for (i = 0; i < len/sizeof(struct kinfo_proc2); i++) {
+ if (p[i].p_pid == getpid())
+ continue;
+ if (p[i].p_ppid != process)
+ continue;
+ if (p[i].p_stat != LSSTOP)
+ continue;
+ child = p[i].p_pid;
+ break;
+ }
+
+ if (child != -1)
+ break;
+
+ FORKEE_ASSERT_EQ(usleep(1000), 0);
+ }
+
+ /* Free the buffer */
+ FORKEE_ASSERT_EQ(reallocarr(&p, 0, sizeof(struct kinfo_proc2)), 0);
+
+ return child;
+}
+
/* Happy number sequence -- this function is used to just consume cpu cycles */
#define HAPPY_NUMBER 1
Home |
Main Index |
Thread Index |
Old Index