DIRS = $(sort $(wildcard src/*))
all:
- for i in $(DIRS); do echo $$i; make -s -C $$i; done
-t: all
-# for i in $(DIRS); do echo $$i; $$i/t; done
-b: all
- for i in $(DIRS); do echo $$i; $$i/b; done
+ for i in $(DIRS); do printf "%-20s" $$i; make -s -C $$i; done
+t:
+ @for i in $(DIRS); do printf "%-20s" $$i; make -s -C $$i 2>/dev/null; done
+b: t
+ @for i in $(DIRS); do echo $$i; $$i/b; done
clean:
for i in $(DIRS); do make -s -C $$i clean; done
static int verbose = 1;
void error__(const char *n, int l, const char *s, ...) {
- fprintf(stderr, "use error in tests only\n");
+ dprintf(1, "use error in tests only\n");
}
static int N;
struct timespec ts;
if (clock_gettime(CLOCK_REALTIME, &ts) < 0) {
- fprintf(stderr, "bench: clock_gettime failed: %s\n", strerror(errno));
+ dprintf(1, "bench: clock_gettime failed: %s\n", strerror(errno));
return 0;
}
return ts.tv_sec*SEC + ts.tv_nsec;
}
}
if (f) fclose(f);
- fprintf(stderr, " %7zu virt %7zu res %7zu dirty", vm_size, vm_rss, vm_priv_dirty);
+ dprintf(1, " %7zu virt %7zu res %7zu dirty", vm_size, vm_rss, vm_priv_dirty);
}
void stats() {
- if (dt/N > 100)
- fprintf(stderr, "%10d N %10llu ns/op ", N, dt/N);
+ if (dt/N >= 100)
+ dprintf(1, "%10d N %10llu ns/op ", N, dt/N);
else
- fprintf(stderr, "%10d N %13.2f ns/op", N, (double)dt/N);
+ dprintf(1, "%10d N %13.2f ns/op", N, (double)dt/N);
if (verbose)
vmstats();
- fputc('\n', stderr);
+ dprintf(1, "\n");
}
static void run(const char *name, void (*f)(int)) {
if (p) {
int s;
if (p<0 || wait(&s)<0 || !WIFEXITED(s) || WEXITSTATUS(s))
- fprintf(stderr, "benchmark %s failed\n", name);
+ dprintf(1, "benchmark %s failed\n", name);
return;
}
- fprintf(stderr, "%-32s", name);
+ dprintf(1, "%-32s", name);
for (N=1; ; N=nextN()) {
// TODO: fork at each iteration and pass N,dt..?
reset_timer();
start_timer();
f(N);
stop_timer();
-// fprintf(stderr, "%10d%12llu next: %d\n", N, dt, nextN());
+// dprintf(1, "%10d%12llu next: %d\n", N, dt, nextN());
if (dt >= SEC/2 || N >= MAXN) {
stats();
exit(0);
}
if (N <= 0) {
- fprintf(stderr, "bench: fatal: N <= 0\n");
+ dprintf(1, "bench: fatal: N <= 0\n");
exit(1);
}
}
void error__(const char *n, int l, const char *s, ...) {
va_list ap;
+ if (failed == 0 && nfailed == 0)
+ dprintf(1, "FAIL\n", n);
failed = 1;
- fprintf(stderr, " ERROR %s %s:%d: ", name, n, l);
+ dprintf(1, " ERROR %s %s:%d: ", name, n, l);
va_start(ap, s);
- vfprintf(stderr, s, ap);
+ vdprintf(1, s, ap);
va_end(ap);
}
failed = 0;
name = n;
if (verbose)
- fprintf(stderr, "running %s:\n", name);
+ dprintf(1, "running %s:\n", name);
pid = fork();
if (pid == 0) {
if (failed) {
nfailed++;
- fprintf(stderr, "FAILED %s\n", name);
+ dprintf(1, "FAILED %s\n", name);
} else if (verbose)
- fprintf(stderr, "PASSED %s\n", name);
+ dprintf(1, "PASSED %s\n", name);
}
static int summary() {
if (nfailed)
- fprintf(stderr, "FAIL:%d (all: %d)\n", nfailed, count);
+ dprintf(1, "FAIL (%d out of %d tests)\n", nfailed, count);
else
- fprintf(stderr, "PASS (all: %d)\n", count);
+ dprintf(1, "ok (%d tests)\n", count);
return !!nfailed;
}
static void usage() {
- fprintf(stderr, "usage: ./t [-vs]\n");
+ dprintf(1, "usage: ./t [-vs]\n");
exit(1);
}