1#pragma once
2
3#include <stddef.h>
4#include <unistd.h>
5
6#ifdef __cplusplus
7extern "C" {
8#endif
9
10/*
11 * Align to `alignment` boundary which must be a power of two or zero.
12 */
13
14static inline unsigned align_unsigned(unsigned n, unsigned alignment)
15{
16 if (alignment > 1) {
17 alignment--;
18 return (n + alignment) & ~alignment;
19 } else {
20 return n;
21 }
22}
23
24static inline void* align_pointer(void* ptr, unsigned alignment)
25{
26 if (alignment > 1) {
27 ptrdiff_t n = (ptrdiff_t) ptr;
28 alignment--;
29 return (void*) ((n + alignment) & ~(ptrdiff_t) alignment);
30 } else {
31 return ptr;
32 }
33}
34
35/*
36 * Align to page size.
37 */
38
39static unsigned sys_page_size()
40{
41 static unsigned page_size = 0;
42 if (page_size == 0) {
43 page_size = sysconf(_SC_PAGE_SIZE);
44 }
45 return page_size;
46}
47
48static inline unsigned align_unsigned_to_page(unsigned n)
49{
50 return align_unsigned(n, sys_page_size());
51}
52
53static inline void* align_pointer_to_page(void* ptr)
54{
55 return align_pointer(ptr, sys_page_size());
56}
57
58#ifdef __cplusplus
59}
60#endif