altstack: stack alignment and accounting tweaks
[ccan] / ccan / altstack / test / run.c
index adc1020eb0a12cf4019c9593cb7aa9ff0a9392c7..de94887284703977946feca870e07ce4bd9aee42 100644 (file)
@@ -4,6 +4,7 @@
 #include <setjmp.h>
 #include <signal.h>
 #include <string.h>
 #include <setjmp.h>
 #include <signal.h>
 #include <string.h>
+#include <unistd.h>
 #include <sys/mman.h>
 #include <ccan/tap/tap.h>
 #include <ccan/altstack/altstack.h>
 #include <sys/mman.h>
 #include <ccan/tap/tap.h>
 #include <ccan/altstack/altstack.h>
@@ -20,13 +21,13 @@ enum {
 };
 int fail, call1, call2;
 char *m_;
 };
 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 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 e(x) (900+(x))
 #define seterr(x) (errno = e(x))
 #define setcall(x) ((call1 |= !errno ? (x) : 0), (call2 |= errno || 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__)))
 #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__)))
@@ -58,7 +59,9 @@ static void *wrap(void *i)
 
 int main(void)
 {
 
 int main(void)
 {
-       plan_tests(16);
+       long pgsz = sysconf(_SC_PAGESIZE);
+
+       plan_tests(17);
 
 #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)));
 
 #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)));
@@ -86,7 +89,7 @@ int main(void)
        chkfail(munmap_,        altstack(8*MiB, wrap, 0, 0) ==  1, e(munmap_),
                getrlimit_|setrlimit_|mmap_|sigaltstack_|sigaction_,
                setrlimit_|sigaltstack_|sigaction_);
        chkfail(munmap_,        altstack(8*MiB, wrap, 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,
                err(1, "munmap");
 
        chkok(                  altstack(1*MiB, wrap, (void *) 1000000, 0) == -1, EOVERFLOW,
@@ -102,10 +105,12 @@ int main(void)
        chkfail(munmap_,        altstack(1*MiB, wrap, (void *) 1000000, 0) == -1, EOVERFLOW,
                getrlimit_|setrlimit_|mmap_|sigaltstack_|sigaction_,
                setrlimit_|sigaltstack_|sigaction_);
        chkfail(munmap_,        altstack(1*MiB, wrap, (void *) 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");
 
                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++)
 
        char *p;
        for(p = altstack_geterr(); *p; p++)
@@ -128,7 +133,8 @@ int main(void)
                getrlimit_|setrlimit_|mmap_|sigaltstack_|sigaction_,
                setrlimit_|munmap_|sigaltstack_|sigaction_);
 
                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,
 
        used = 0;
        chkok(                  altstack(8*MiB, wrap, (void *) 100000, 0) == 0, 0,
@@ -138,7 +144,8 @@ int main(void)
        used = 1;
        altstack_rsp_save();
        dn(0);
        used = 1;
        altstack_rsp_save();
        dn(0);
-       ok1(used == 32);
+       diag("used: %lu", used);
+       ok1(used == 32 || used == 40);
 
        return exit_status();
 }
 
        return exit_status();
 }