[master] 1d5b03e Improve vtc_wait4() so it can also handle vtc_process' needs.
Poul-Henning Kamp
phk at FreeBSD.org
Tue Mar 27 08:52:12 UTC 2018
commit 1d5b03ebb856edc4bfedb71af0fa332d06fe8123
Author: Poul-Henning Kamp <phk at FreeBSD.org>
Date: Tue Mar 27 08:50:57 2018 +0000
Improve vtc_wait4() so it can also handle vtc_process' needs.
diff --git a/bin/varnishtest/vtc.h b/bin/varnishtest/vtc.h
index 8cb2640..8f0d130 100644
--- a/bin/varnishtest/vtc.h
+++ b/bin/varnishtest/vtc.h
@@ -138,7 +138,7 @@ void b64_settings(const struct http *hp, const char *s);
struct vsb *vtc_hex_to_bin(struct vtclog *vl, const char *arg);
void vtc_expect(struct vtclog *, const char *, const char *, const char *,
const char *, const char *);
-void vtc_wait4(struct vtclog *, long, int, int);
+void vtc_wait4(struct vtclog *, long, int, int, int);
/* vtc_term.c */
struct term *Term_New(struct vtclog *, int, int);
diff --git a/bin/varnishtest/vtc_process.c b/bin/varnishtest/vtc_process.c
index c2e9c9a..7c37103 100644
--- a/bin/varnishtest/vtc_process.c
+++ b/bin/varnishtest/vtc_process.c
@@ -32,8 +32,6 @@
#include "config.h"
#include <sys/ioctl.h> // Linux: struct winsize
-#include <sys/resource.h>
-#include <sys/wait.h>
#include <ctype.h>
#include <errno.h>
@@ -85,7 +83,6 @@ struct process {
pthread_mutex_t mtx;
pthread_t tp;
unsigned hasthread;
- int status;
struct term *term;
int lin;
@@ -247,10 +244,9 @@ static void *
process_thread(void *priv)
{
struct process *p;
- struct rusage ru;
struct vev_root *evb;
struct vev *ev;
- int core, sig, ext, r;
+ int r;
CAST_OBJ_NOTNULL(p, priv, PROCESS_MAGIC);
@@ -293,8 +289,8 @@ process_thread(void *priv)
vtc_fatal(p->vl, "VEV_Once() = %d, error %s", r,
strerror(errno));
- r = wait4(p->pid, &p->status, 0, &ru);
-
+ vtc_wait4(p->vl, p->pid,
+ p->expect_exit, p->expect_signal, p->allow_core);
closefd(&p->f_stdout);
closefd(&p->f_stderr);
@@ -304,35 +300,7 @@ process_thread(void *priv)
macro_undef(p->vl, p->name, "pid");
p->pid = -1;
- vtc_log(p->vl, 2, "R 0x%04x Status: %04x (u %.6f s %.6f)",
- r, p->status,
- ru.ru_utime.tv_sec + 1e-6 * ru.ru_utime.tv_usec,
- ru.ru_stime.tv_sec + 1e-6 * ru.ru_stime.tv_usec
- );
-
AZ(pthread_mutex_unlock(&p->mtx));
- sig = WTERMSIG(p->status);
- ext = WEXITSTATUS(p->status);
-#ifdef WCOREDUMP
- core = WCOREDUMP(p->status);
- vtc_log(p->vl, 2, "Exit code: %04x sig %d exit %d core %d",
- p->status, sig, ext, core);
-#else
- core = 0;
- vtc_log(p->vl, 2, "Exit code: %04x sig %d exit %d",
- p->status, sig, ext);
-#endif
- if (core && !p->allow_core)
- vtc_fatal(p->vl, "Core dump");
- if (p->expect_signal >= 0 && sig != p->expect_signal)
- vtc_fatal(p->vl, "Expected signal %d got %d",
- p->expect_signal, sig);
- else if (sig != 0 && sig != -p->expect_signal)
- vtc_fatal(p->vl, "Expected signal %d got %d",
- -p->expect_signal, sig);
- if (ext != p->expect_exit)
- vtc_fatal(p->vl, "Expected exit %d got %d",
- p->expect_exit, ext);
VEV_Destroy(&evb);
if (p->log == 1) {
diff --git a/bin/varnishtest/vtc_subr.c b/bin/varnishtest/vtc_subr.c
index 4cdea40..1a9ff10 100644
--- a/bin/varnishtest/vtc_subr.c
+++ b/bin/varnishtest/vtc_subr.c
@@ -132,8 +132,22 @@ vtc_expect(struct vtclog *vl,
olhs, lhs, cmp, rhs);
}
+/**********************************************************************
+ * Wait for a subprocess.
+ *
+ * if expect_signal > 0, the process must die on that signal.
+ * if expect_signal < 0, dying on that signal is allowed, but not required.
+ * if allow_core > 0, a coredump is allowed, but not required.
+ * otherwise, the process must die on exit(expect_status)
+ */
+
+#ifndef WCOREDUMP
+# define WCOREDUMP(s) (-1)
+#endif
+
void
-vtc_wait4(struct vtclog *vl, long pid, int expect_status, int expect_signal)
+vtc_wait4(struct vtclog *vl, long pid,
+ int expect_status, int expect_signal, int allow_core)
{
int status, r;
struct rusage ru;
@@ -148,20 +162,21 @@ vtc_wait4(struct vtclog *vl, long pid, int expect_status, int expect_signal)
ru.ru_stime.tv_sec + 1e-6 * ru.ru_stime.tv_usec
);
- if (WIFEXITED(status) && (WEXITSTATUS(status) == expect_status))
+ if (WIFEXITED(status) && expect_signal <= 0 &&
+ (WEXITSTATUS(status) == expect_status))
return;
- if (WIFSIGNALED(status) && (WTERMSIG(status) == expect_signal))
+
+ if (expect_signal < 0)
+ expect_signal = -expect_signal;
+
+ if (WIFSIGNALED(status) && WCOREDUMP(status) <= allow_core &&
+ WTERMSIG(status) == expect_signal)
return;
-#ifdef WCOREDUMP
- vtc_fatal(vl, "Bad exit code: 0x%04x exit 0x%x signal %d core %d",
+ vtc_log(vl, 1, "Expected exit: 0x%x signal: %d core: %d",
+ expect_status, expect_signal, allow_core);
+ vtc_fatal(vl, "Bad exit status: 0x%04x exit 0x%x signal %d core %d",
status,
WEXITSTATUS(status),
WIFSIGNALED(status) ? WTERMSIG(status) : 0,
WCOREDUMP(status));
-#else
- vtc_fatal(vl, "Bad exit code: 0x%04x exit 0x%x signal %d",
- status,
- WEXITSTATUS(status),
- WIFSIGNALED(status) ? WTERMSIG(status) : 0);
-#endif
}
diff --git a/bin/varnishtest/vtc_varnish.c b/bin/varnishtest/vtc_varnish.c
index 680c1aa..a1a5ed8 100644
--- a/bin/varnishtest/vtc_varnish.c
+++ b/bin/varnishtest/vtc_varnish.c
@@ -647,7 +647,7 @@ varnish_cleanup(struct varnish *v)
/* Pick up the VSL thread */
AZ(pthread_join(v->tp_vsl, &p));
- vtc_wait4(v->vl, v->pid, v->expect_exit, 0);
+ vtc_wait4(v->vl, v->pid, v->expect_exit, 0, 0);
v->pid = 0;
}
More information about the varnish-commit
mailing list