X-Git-Url: https://git.ozlabs.org/?a=blobdiff_plain;f=ccan%2Faltstack%2Ftest%2Frun.c;h=61710fda3b9c8dbddab5318ad55caf8aa7d023f6;hb=029a45b84fe60f8012dc1c740709db2c2e620d38;hp=adc1020eb0a12cf4019c9593cb7aa9ff0a9392c7;hpb=e65a92188aa1ac4c27a86d427acdf09417595ade;p=ccan diff --git a/ccan/altstack/test/run.c b/ccan/altstack/test/run.c index adc1020e..61710fda 100644 --- a/ccan/altstack/test/run.c +++ b/ccan/altstack/test/run.c @@ -1,13 +1,15 @@ +#include "config.h" #include #include #include #include #include #include +#include #include #include +#include #include -#define _XOPEN_SOURCE 700 #include enum { @@ -20,13 +22,13 @@ enum { }; int fail, call1, call2; char *m_; -rlim_t max_; +rlim_t msz_; #define e(x) (900+(x)) #define seterr(x) (errno = e(x)) -#define setcall(x) ((call1 |= !errno ? (x) : 0), (call2 |= errno || out_ ? (x) : 0)) +#define setcall(x) ((call1 |= !errno ? (x) : 0), (call2 |= errno || state.out ? (x) : 0)) #define getrlimit(...) (fail&getrlimit_ ? (seterr(getrlimit_), -1) : (setcall(getrlimit_), getrlimit(__VA_ARGS__))) #define mmap(...) (fail&mmap_ ? (seterr(mmap_), (void *)-1) : (setcall(mmap_), mmap(__VA_ARGS__))) -#define munmap(a, b) (fail&munmap_ ? (seterr(munmap_), -1) : (setcall(munmap_), munmap(m_=(a), max_=(b)))) +#define munmap(a, b) (fail&munmap_ ? (seterr(munmap_), -1) : (setcall(munmap_), munmap(m_=(a), msz_=(b)))) #define setrlimit(...) (fail&setrlimit_ ? (seterr(setrlimit_), -1) : (setcall(setrlimit_), setrlimit(__VA_ARGS__))) #define sigaltstack(...) (fail&sigaltstack_ ? (seterr(sigaltstack_), -1) : (setcall(sigaltstack_), sigaltstack(__VA_ARGS__))) #define sigaction(...) (fail&sigaction_ ? (seterr(sigaction_), -1) : (setcall(sigaction_), sigaction(__VA_ARGS__))) @@ -52,60 +54,84 @@ static void __attribute__((optimize("O0"))) dn(unsigned long i) } static void *wrap(void *i) { - dn((unsigned long) i); + dn(ptr2int(i)); return wrap; } +#define chkfail(x, y, z, c1, c2) \ + do { \ + call1 = 0; \ + call2 = 0; \ + errno = 0; \ + ok1((fail = x) && (y)); \ + ok1(errno == (z)); \ + ok1(call1 == (c1)); \ + ok1(call2 == (c2)); \ + } while (0); + +#define chkok(y, z, c1, c2) \ + do { \ + call1 = 0; \ + call2 = 0; \ + errno = 0; \ + fail = 0; \ + ok1((y)); \ + ok1(errno == (z)); \ + ok1(call1 == (c1)); \ + ok1(call2 == (c2)); \ + } while (0) + int main(void) { - plan_tests(16); + long pgsz = sysconf(_SC_PAGESIZE); -#define chkfail(x, y, z, c1, c2) (call1 = 0, call2 = 0, errno = 0, ok1((fail = x) && (y) && errno == (z) && call1 == (c1) && call2 == (c2))); -#define chkok( y, z, c1, c2) (call1 = 0, call2 = 0, errno = 0, fail = 0, ok1((y) && errno == (z) && call1 == (c1) && call2 == (c2))); + plan_tests(50); - chkfail(getrlimit_, altstack(8*MiB, wrap, 0, 0) == -1, e(getrlimit_), + chkfail(getrlimit_, altstack(8*MiB, wrap, int2ptr(0), 0) == -1, e(getrlimit_), 0, 0); - chkfail(setrlimit_, altstack(8*MiB, wrap, 0, 0) == -1, e(setrlimit_), + chkfail(setrlimit_, altstack(8*MiB, wrap, int2ptr(0), 0) == -1, e(setrlimit_), getrlimit_, 0); - chkfail(mmap_, altstack(8*MiB, wrap, 0, 0) == -1, e(mmap_), + chkfail(mmap_, altstack(8*MiB, wrap, int2ptr(0), 0) == -1, e(mmap_), getrlimit_|setrlimit_, setrlimit_); - chkfail(sigaltstack_, altstack(8*MiB, wrap, 0, 0) == -1, e(sigaltstack_), + chkfail(sigaltstack_, altstack(8*MiB, wrap, int2ptr(0), 0) == -1, e(sigaltstack_), getrlimit_|setrlimit_|mmap_, setrlimit_|munmap_); - chkfail(sigaction_, altstack(8*MiB, wrap, 0, 0) == -1, e(sigaction_), + chkfail(sigaction_, altstack(8*MiB, wrap, int2ptr(0), 0) == -1, e(sigaction_), getrlimit_|setrlimit_|mmap_|sigaltstack_, setrlimit_|munmap_|sigaltstack_); - chkfail(munmap_, altstack(8*MiB, wrap, 0, 0) == 1, e(munmap_), + chkfail(munmap_, altstack(8*MiB, wrap, int2ptr(0), 0) == 1, e(munmap_), getrlimit_|setrlimit_|mmap_|sigaltstack_|sigaction_, setrlimit_|sigaltstack_|sigaction_); - if (fail = 0, munmap(m_, max_) == -1) + if (fail = 0, munmap(m_, msz_) == -1) err(1, "munmap"); - chkok( altstack(1*MiB, wrap, (void *) 1000000, 0) == -1, EOVERFLOW, + chkok( altstack(1*MiB, wrap, int2ptr(1000000), 0) == -1, EOVERFLOW, getrlimit_|setrlimit_|mmap_|sigaltstack_|sigaction_, setrlimit_|munmap_|sigaltstack_|sigaction_); // be sure segv catch is repeatable (SA_NODEFER) - chkok( altstack(1*MiB, wrap, (void *) 1000000, 0) == -1, EOVERFLOW, + chkok( altstack(1*MiB, wrap, int2ptr(1000000), 0) == -1, EOVERFLOW, getrlimit_|setrlimit_|mmap_|sigaltstack_|sigaction_, setrlimit_|munmap_|sigaltstack_|sigaction_); used = 1; - chkfail(munmap_, altstack(1*MiB, wrap, (void *) 1000000, 0) == -1, EOVERFLOW, + chkfail(munmap_, altstack(1*MiB, wrap, int2ptr(1000000), 0) == -1, EOVERFLOW, getrlimit_|setrlimit_|mmap_|sigaltstack_|sigaction_, setrlimit_|sigaltstack_|sigaction_); - if (fail = 0, munmap(m_, max_) == -1) + if (fail = 0, munmap(m_, msz_) == -1) err(1, "munmap"); - ok1(used > 1*MiB-1*KiB && used < 1*MiB); + ok1(altstack_max() == 1*MiB); + diag("used: %lu", used); + ok1(used >= 1*MiB - pgsz && used <= 1*MiB + pgsz); char *p; for(p = altstack_geterr(); *p; p++) @@ -124,21 +150,23 @@ int main(void) ok1(strcmp(buf, estr "\n") == 0); used = 1; - chkok( altstack(8*MiB, wrap, (void *) 1000000, 0) == -1, EOVERFLOW, + chkok( altstack(8*MiB, wrap, int2ptr(1000000), 0) == -1, EOVERFLOW, getrlimit_|setrlimit_|mmap_|sigaltstack_|sigaction_, setrlimit_|munmap_|sigaltstack_|sigaction_); - ok1(used > 8*MiB-8*KiB && used < 8*MiB); + diag("used: %lu", used); + ok1(used >= 8*MiB - pgsz && used <= 8*MiB + pgsz); used = 0; - chkok( altstack(8*MiB, wrap, (void *) 100000, 0) == 0, 0, + chkok( altstack(8*MiB, wrap, int2ptr(100000), 0) == 0, 0, getrlimit_|setrlimit_|mmap_|sigaltstack_|sigaction_|munmap_, setrlimit_|munmap_|sigaltstack_|sigaction_); used = 1; altstack_rsp_save(); dn(0); - ok1(used == 32); + diag("used: %lu", used); + ok1(used == 32 || used == 40); return exit_status(); }