X-Git-Url: https://git.ozlabs.org/?a=blobdiff_plain;f=ccan%2Ffailtest%2Ffailtest.c;h=e2e6c64fec64d188fed1b92184fbf64ad9951fd1;hb=aa6f4ffe51b1963228abe0d001ba77b6e45bc1bf;hp=9972db3cd29fc8ad83a9d3c51bc8fedf65ef4a76;hpb=c9f915e02c760caffe75da7f9a6a9a1de1bf1747;p=ccan diff --git a/ccan/failtest/failtest.c b/ccan/failtest/failtest.c index 9972db3c..e2e6c64f 100644 --- a/ccan/failtest/failtest.c +++ b/ccan/failtest/failtest.c @@ -219,7 +219,7 @@ static void trace_str(const char *str) { ssize_t ret; - while ((ret = write(tracefd, str, strlen(str))) <= 0) { + while ((ret = write(tracefd, str, strlen(str))) > 0) { str += ret; if (!*str) return; @@ -317,21 +317,28 @@ static NORETURN void failtest_cleanup(bool forced_cleanup, int status) { int i; + /* For children, we don't care if they "failed" the testing. */ + if (control_fd != -1) + status = 0; + if (forced_cleanup) history_num--; /* Cleanup everything, in reverse order. */ - for (i = history_num - 1; i >= 0; i--) - if (history[i].cleanup) - history[i].cleanup(&history[i].u); + for (i = history_num - 1; i >= 0; i--) { + if (!history[i].cleanup) + continue; + if (!forced_cleanup) { + printf("Leak at %s:%u\n", + history[i].file, history[i].line); + status = 1; + } + history[i].cleanup(&history[i].u); + } free_everything(); - - if (control_fd == -1) - exit(status); - tell_parent(SUCCESS); - exit(0); + exit(status); } static bool should_fail(struct failtest_call *call) @@ -976,7 +983,6 @@ int failtest_fcntl(int fd, const char *file, unsigned line, int cmd, ...) } p = add_history(FAILTEST_FCNTL, file, line, &call); - get_locks(); if (should_fail(p)) { p->u.fcntl.ret = -1; @@ -985,6 +991,7 @@ int failtest_fcntl(int fd, const char *file, unsigned line, int cmd, ...) else p->error = EDEADLK; } else { + get_locks(); p->u.fcntl.ret = fcntl(p->u.fcntl.fd, p->u.fcntl.cmd, &p->u.fcntl.arg.fl); if (p->u.fcntl.ret == -1)