aboutsummaryrefslogtreecommitdiffstats
path: root/test.h
diff options
context:
space:
mode:
authorMattias Andrée <maandree@kth.se>2024-08-18 09:43:16 +0200
committerMattias Andrée <maandree@kth.se>2024-08-18 09:43:16 +0200
commit715b59e5002b971a987c3c8a2e1b3e61d80388f7 (patch)
treeaa64aa9fed94388056432f0f4a2180d5c03523fd /test.h
parentAdd @since for definitions added in version 1.0 and 1.1 (diff)
parentFix tests and libsimple_arraycpy and libsimple_arraymove (diff)
downloadlibsimple-715b59e5002b971a987c3c8a2e1b3e61d80388f7.tar.gz
libsimple-715b59e5002b971a987c3c8a2e1b3e61d80388f7.tar.bz2
libsimple-715b59e5002b971a987c3c8a2e1b3e61d80388f7.tar.xz
Merge tag '1.2' into since
Version 1.2
Diffstat (limited to 'test.h')
-rw-r--r--test.h39
1 files changed, 39 insertions, 0 deletions
diff --git a/test.h b/test.h
index fe229ef..d8ac2d4 100644
--- a/test.h
+++ b/test.h
@@ -95,3 +95,42 @@ test_fprintf(FILE *restrict stream, const char *restrict format, ...)
return test_vfprintf(stream, format, ap);
va_end(ap);
}
+
+
+
+static size_t
+gcd(size_t u, size_t v)
+{
+ size_t t;
+ int shift = 0;
+ /* Not needed because u>0, v>0: if (!(u | v)) return u + v; */
+ while (!((u | v) & 1)) u >>= 1, v >>= 1, shift++;
+ while (!(u & 1)) u >>= 1;
+ do {
+ while (!(v & 1)) v >>= 1;
+ if (u > v) t = u, u = v, v = t;
+ } while (v -= u);
+ return u << shift;
+}
+
+static inline size_t
+lcm(size_t u, size_t v)
+{
+ return u / gcd(u, v) * v;
+}
+
+#define ASSERT_ALIGNMENT(INFO, ALIGN)\
+ do {\
+ assert((INFO)->alignment <= lcm(cacheline, ALIGN));\
+ assert(!((INFO)->alignment % (ALIGN)));\
+ if ((cacheline - (ALIGN) % cacheline) % cacheline + (INFO)->size % (ALIGN) > cacheline)\
+ assert(!((INFO)->alignment % cacheline));\
+ } while (0)
+
+#define DEFINE_PAGESIZE size_t pagesize = (size_t)sysconf(_SC_PAGESIZE)
+
+#ifdef _SC_LEVEL1_DCACHE_LINESIZ
+#define DEFINE_CACHELINE size_t cacheline = (size_t)sysconf(_SC_LEVEL1_DCACHE_LINESIZE)
+#else
+#define DEFINE_CACHELINE size_t cacheline = 64
+#endif