]> git.ozlabs.org Git - ccan/blobdiff - ccan/altstack/test/run.c
altstack: Use ptrint instead of bare casts
[ccan] / ccan / altstack / test / run.c
index adc1020eb0a12cf4019c9593cb7aa9ff0a9392c7..61710fda3b9c8dbddab5318ad55caf8aa7d023f6 100644 (file)
@@ -1,13 +1,15 @@
+#include "config.h"
 #include <assert.h>
 #include <err.h>
 #include <errno.h>
 #include <setjmp.h>
 #include <signal.h>
 #include <string.h>
+#include <unistd.h>
 #include <sys/mman.h>
 #include <ccan/tap/tap.h>
+#include <ccan/ptrint/ptrint.h>
 #include <ccan/altstack/altstack.h>
-#define _XOPEN_SOURCE 700
 #include <stdio.h>
 
 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();
 }