diff --git a/checker/2-uart-checker/_test/test.c b/checker/2-uart-checker/_test/test.c index b13b81809be8520ee26d6c13e889102d70b9dc96..7c5cef14c34ab8ac94357b8bd885f6559730a4d8 100644 --- a/checker/2-uart-checker/_test/test.c +++ b/checker/2-uart-checker/_test/test.c @@ -11,6 +11,7 @@ #include <sys/types.h> #include <sys/ioctl.h> #include <sys/wait.h> +#include <signal.h> #include "uart16550.h" @@ -46,6 +47,15 @@ #define not_test(d, v, e, p) do_test((d), (v), (e), 1, 0, (p)) #define fatal_test(d, v, e,p) do_test((d), (v), (e), 0, 1, (p)) +#define GENERIC_TEST_TIMEOUT 3 + + +void sig_handler(int signum) { + fprintf(stderr, "Child process pid=%d of checker (that issues read/write syscalls to the driver) got killed after TIMEOUT=%ds\n", getpid(), GENERIC_TEST_TIMEOUT); + fprintf(stderr, "\tThis might be because you didn't implement read/write or there is a bug in the implementation\n"); + exit(EXIT_FAILURE); +} + /* * if the test passes it will return 0 * if it fails it returns the number of points given as argument @@ -328,8 +338,10 @@ copy_file(int fdr, int fdw, int len) static int copy_test(int fd0, int fd1, int speed_set) { - pid_t rpid, wpid; - int len, status, rc, fd; + pid_t rpid, wpid, kpid; + int len, status, fd; + int rc1, rc2, rc3, exit_status1, exit_status2, exit_status3; + int i; len = gen_test_file(INFILE, speed_set); rpid = fork(); @@ -360,17 +372,46 @@ copy_test(int fd0, int fd1, int speed_set) break; } - rc = waitpid(rpid, &status, 0); - if (rc < 0) - return rc; - if (WEXITSTATUS(status)) - return WEXITSTATUS(status); + kpid = fork(); + switch (kpid) { + case 0: + for (i = 0; i < GENERIC_TEST_TIMEOUT; i++) { + /* + * check if procs still exist. kill with arg 0 + * will succed (ret 0) if the pid exists + */ + if (!kill(rpid, 0)) { + sleep(1); + continue; + } else if (!kill(wpid, 0)) { + sleep(1); + continue; + } else + break; + + } + kill(rpid, SIGTERM); + kill(wpid, SIGTERM); + exit(EXIT_SUCCESS); + break; + default: + break; + + } + + rc1 = waitpid(rpid, &status, 0); + exit_status1 = WEXITSTATUS(status); + + + rc2 = waitpid(wpid, &status, 0); + exit_status2 = WEXITSTATUS(status); + + rc3 = waitpid(kpid, &status, 0); + exit_status3 = WEXITSTATUS(status); - rc = waitpid(wpid, &status, 0); - if (rc < 0) - return rc; - if (WEXITSTATUS(status)) - return WEXITSTATUS(status); + if (rc1 < 0 || rc2 < 0 || rc3 < 0 || + exit_status1 || exit_status2 || exit_status3) + return -1; return system("diff " INFILE " " OUTFILE "> /dev/null 2> /dev/null"); } @@ -524,6 +565,7 @@ main(void) float num_passed = 0; const int total = 92; + signal(SIGTERM, sig_handler); srand(time(NULL)); make_nodes();