Move termination signal handing from main into iperf_run_client
and iperf_run_server, so that API users get it too. Also, call iperf_errexit with an appropriate message, which in -J mode dumps out any accumulated JSON data.
Этот коммит содержится в:
родитель
7639c1a631
Коммит
afe6222a89
@ -47,8 +47,6 @@
|
|||||||
#include "iperf_util.h"
|
#include "iperf_util.h"
|
||||||
#include "locale.h"
|
#include "locale.h"
|
||||||
|
|
||||||
jmp_buf env; /* to handle longjmp on signal */
|
|
||||||
|
|
||||||
|
|
||||||
/* Forwards. */
|
/* Forwards. */
|
||||||
static int send_parameters(struct iperf_test *test);
|
static int send_parameters(struct iperf_test *test);
|
||||||
@ -2109,12 +2107,27 @@ diskfile_recv(struct iperf_stream *sp)
|
|||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
sig_handler(int sig)
|
iperf_catch_sigend(void (*handler)(int))
|
||||||
{
|
{
|
||||||
longjmp(env, 1);
|
signal(SIGINT, handler);
|
||||||
|
signal(SIGTERM, handler);
|
||||||
|
signal(SIGHUP, handler);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
iperf_got_sigend(struct iperf_test *test)
|
||||||
|
{
|
||||||
|
if (test->ctrl_sck >= 0) {
|
||||||
|
test->state = (test->role == 'c') ? CLIENT_TERMINATE : SERVER_TERMINATE;
|
||||||
|
(void) Nwrite(test->ctrl_sck, (char*) &test->state, sizeof(signed char), Ptcp);
|
||||||
|
}
|
||||||
|
i_errno = (test->role == 'c') ? IECLIENTTERM : IESERVERTERM;
|
||||||
|
iperf_errexit(test, "interrupt - %s", iperf_strerror(i_errno));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
int
|
int
|
||||||
iperf_json_start(struct iperf_test *test)
|
iperf_json_start(struct iperf_test *test)
|
||||||
{
|
{
|
||||||
|
@ -169,7 +169,8 @@ int iperf_set_send_state(struct iperf_test *test, char state);
|
|||||||
void iperf_check_throttle(struct iperf_stream *sp, struct timeval *nowP);
|
void iperf_check_throttle(struct iperf_stream *sp, struct timeval *nowP);
|
||||||
int iperf_send(struct iperf_test *, fd_set *) /* __attribute__((hot)) */;
|
int iperf_send(struct iperf_test *, fd_set *) /* __attribute__((hot)) */;
|
||||||
int iperf_recv(struct iperf_test *, fd_set *);
|
int iperf_recv(struct iperf_test *, fd_set *);
|
||||||
void sig_handler(int);
|
void iperf_catch_sigend(void (*handler)(int));
|
||||||
|
void iperf_got_sigend(struct iperf_test *test) __attribute__ ((noreturn));
|
||||||
void usage();
|
void usage();
|
||||||
void usage_long();
|
void usage_long();
|
||||||
void warning(char *);
|
void warning(char *);
|
||||||
|
@ -300,6 +300,15 @@ sigalrm_handler(int sig)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static jmp_buf sigend_jmp_buf;
|
||||||
|
|
||||||
|
static void
|
||||||
|
sigend_handler(int sig)
|
||||||
|
{
|
||||||
|
longjmp(sigend_jmp_buf, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
int
|
int
|
||||||
iperf_run_client(struct iperf_test * test)
|
iperf_run_client(struct iperf_test * test)
|
||||||
{
|
{
|
||||||
@ -311,6 +320,11 @@ iperf_run_client(struct iperf_test * test)
|
|||||||
fd_set read_set, write_set;
|
fd_set read_set, write_set;
|
||||||
struct timeval now;
|
struct timeval now;
|
||||||
|
|
||||||
|
/* Termination signals. */
|
||||||
|
iperf_catch_sigend(sigend_handler);
|
||||||
|
if (setjmp(sigend_jmp_buf))
|
||||||
|
iperf_got_sigend(test);
|
||||||
|
|
||||||
if (test->affinity != -1)
|
if (test->affinity != -1)
|
||||||
if (iperf_setaffinity(test->affinity) != 0)
|
if (iperf_setaffinity(test->affinity) != 0)
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -330,6 +330,16 @@ cleanup_server(struct iperf_test *test)
|
|||||||
close(test->listener);
|
close(test->listener);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static jmp_buf sigend_jmp_buf;
|
||||||
|
|
||||||
|
static void
|
||||||
|
sigend_handler(int sig)
|
||||||
|
{
|
||||||
|
longjmp(sigend_jmp_buf, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
int
|
int
|
||||||
iperf_run_server(struct iperf_test *test)
|
iperf_run_server(struct iperf_test *test)
|
||||||
{
|
{
|
||||||
@ -338,6 +348,11 @@ iperf_run_server(struct iperf_test *test)
|
|||||||
struct iperf_stream *sp;
|
struct iperf_stream *sp;
|
||||||
struct timeval now;
|
struct timeval now;
|
||||||
|
|
||||||
|
/* Termination signals. */
|
||||||
|
iperf_catch_sigend(sigend_handler);
|
||||||
|
if (setjmp(sigend_jmp_buf))
|
||||||
|
iperf_got_sigend(test);
|
||||||
|
|
||||||
if (test->affinity != -1)
|
if (test->affinity != -1)
|
||||||
if (iperf_setaffinity(test->affinity) != 0)
|
if (iperf_setaffinity(test->affinity) != 0)
|
||||||
return -1;
|
return -1;
|
||||||
|
23
src/main.c
23
src/main.c
@ -30,10 +30,10 @@
|
|||||||
#include "net.h"
|
#include "net.h"
|
||||||
|
|
||||||
|
|
||||||
int iperf_run(struct iperf_test *);
|
static int run(struct iperf_test *test);
|
||||||
|
|
||||||
|
|
||||||
/**************************************************************************/
|
/**************************************************************************/
|
||||||
|
|
||||||
int
|
int
|
||||||
main(int argc, char **argv)
|
main(int argc, char **argv)
|
||||||
{
|
{
|
||||||
@ -81,19 +81,6 @@ main(int argc, char **argv)
|
|||||||
/* This main program doesn't use SIGALRM, so the iperf API may use it. */
|
/* This main program doesn't use SIGALRM, so the iperf API may use it. */
|
||||||
iperf_set_test_may_use_sigalrm(test, 1);
|
iperf_set_test_may_use_sigalrm(test, 1);
|
||||||
|
|
||||||
// XXX: Check signal for errors?
|
|
||||||
signal(SIGINT, sig_handler);
|
|
||||||
if (setjmp(env)) {
|
|
||||||
if (test->ctrl_sck >= 0) {
|
|
||||||
test->state = (test->role == 'c') ? CLIENT_TERMINATE : SERVER_TERMINATE;
|
|
||||||
if (Nwrite(test->ctrl_sck, (char*) &test->state, sizeof(signed char), Ptcp) < 0) {
|
|
||||||
i_errno = IESENDMESSAGE;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (iperf_parse_arguments(test, argc, argv) < 0) {
|
if (iperf_parse_arguments(test, argc, argv) < 0) {
|
||||||
iperf_err(test, "parameter error - %s", iperf_strerror(i_errno));
|
iperf_err(test, "parameter error - %s", iperf_strerror(i_errno));
|
||||||
fprintf(stderr, "\n");
|
fprintf(stderr, "\n");
|
||||||
@ -101,7 +88,7 @@ main(int argc, char **argv)
|
|||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (iperf_run(test) < 0)
|
if (run(test) < 0)
|
||||||
iperf_errexit(test, "error - %s", iperf_strerror(i_errno));
|
iperf_errexit(test, "error - %s", iperf_strerror(i_errno));
|
||||||
|
|
||||||
iperf_free_test(test);
|
iperf_free_test(test);
|
||||||
@ -110,8 +97,8 @@ main(int argc, char **argv)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**************************************************************************/
|
/**************************************************************************/
|
||||||
int
|
static int
|
||||||
iperf_run(struct iperf_test * test)
|
run(struct iperf_test *test)
|
||||||
{
|
{
|
||||||
int consecutive_errors;
|
int consecutive_errors;
|
||||||
|
|
||||||
|
Загрузка…
x
Ссылка в новой задаче
Block a user