X-Git-Url: http://git.ozlabs.org/?p=ccan;a=blobdiff_plain;f=tools%2Fccanlint%2Fccanlint.c;h=20c3b9bf0e64df23d4d1bd76c601122a0792f43b;hp=ee8c8b78634aab7e5eb3dfb9fb5374b07014e88d;hb=021e03c4186bde630b1b4912afaab1e7f8417c1e;hpb=218c9c2322fb2e8aaac2e5c400cb5a0aa2b7f1e3 diff --git a/tools/ccanlint/ccanlint.c b/tools/ccanlint/ccanlint.c index ee8c8b78..20c3b9bf 100644 --- a/tools/ccanlint/ccanlint.c +++ b/tools/ccanlint/ccanlint.c @@ -37,16 +37,18 @@ static LIST_HEAD(normal_tests); static LIST_HEAD(finished_tests); bool safe_mode = false; static struct btree *exclude; +static unsigned int timeout; static void usage(const char *name) { - fprintf(stderr, "Usage: %s [-s] [-n] [-v] [-d ]\n" + fprintf(stderr, "Usage: %s [-s] [-n] [-v] [-t ] [-d ] [-x ]\n" " -v: verbose mode\n" " -s: simply give one line summary\n" " -d: use this directory instead of the current one\n" " -n: do not compile anything\n" " -l: list tests ccanlint performs\n" - " -x: exclude tests (e.g. -x trailing_whitespace,valgrind)\n", + " -x: exclude tests (e.g. -x trailing_whitespace,valgrind)\n" + " -t: ignore (terminate) tests that are slower than this\n", name); exit(1); } @@ -100,7 +102,7 @@ static bool run_test(struct ccanlint *i, struct manifest *m) { void *result; - unsigned int this_score; + unsigned int this_score, timeleft; const struct dependent *d; const char *skip; @@ -109,7 +111,9 @@ static bool run_test(struct ccanlint *i, d->dependent->num_depends--; skip = should_skip(m, i); + if (skip) { + skip: if (verbose) printf(" %s: skipped (%s)\n", i->name, skip); @@ -126,7 +130,12 @@ static bool run_test(struct ccanlint *i, return true; } - result = i->check(m); + timeleft = timeout ? timeout : default_timeout_ms; + result = i->check(m, &timeleft); + if (timeout && timeleft == 0) { + skip = "timeout"; + goto skip; + } if (!result) { if (verbose) { printf(" %s: OK", i->name); @@ -311,7 +320,7 @@ int main(int argc, char *argv[]) /* I'd love to use long options, but that's not standard. */ /* FIXME: getopt_long ccan package? */ - while ((c = getopt(argc, argv, "sd:vnlx:")) != -1) { + while ((c = getopt(argc, argv, "sd:vnlx:t:")) != -1) { switch (c) { case 'd': dir = optarg; @@ -336,6 +345,12 @@ int main(int argc, char *argv[]) for (i = 0; exclude_strs[i]; i++) btree_insert(exclude, exclude_strs[i]); } break; + case 't': + timeout = atoi(optarg); + if (!timeout) + errx(1, "Invalid timeout %s: 1 ms minumum", + optarg); + break; default: usage(argv[0]); }