7 #ifndef CVMFS_UTIL_SMALLOC_H_
8 #define CVMFS_UTIL_SMALLOC_H_
20 #define PLATFORM_MAP_ANONYMOUS MAP_ANON
22 #define PLATFORM_MAP_ANONYMOUS MAP_ANONYMOUS
26 #ifdef CVMFS_NAMESPACE_GUARD
27 namespace CVMFS_NAMESPACE_GUARD {
38 return (size + 7) & ~static_cast<uint64_t>(7);
43 #ifdef CVMFS_SUPPRESS_ASSERTS
47 #ifdef CVMFS_SUPPRESS_ASSERTS
48 }
while ((size > 0) && (mem == NULL));
50 assert((mem || (size == 0)) &&
"Out Of Memory");
57 #ifdef CVMFS_SUPPRESS_ASSERTS
60 mem = realloc(ptr, size);
61 #ifdef CVMFS_SUPPRESS_ASSERTS
62 }
while ((size > 0) && (mem == NULL));
64 assert((mem || (size == 0)) &&
"Out Of Memory");
68 static inline void *
__attribute__((used)) scalloc(
size_t count,
size_t size) {
71 #ifdef CVMFS_SUPPRESS_ASSERTS
74 mem = calloc(count, size);
75 #ifdef CVMFS_SUPPRESS_ASSERTS
76 }
while ((count * size > 0) && (mem == NULL));
78 assert((mem || ((count * size) == 0)) &&
"Out Of Memory");
82 static inline void *
__attribute__((used)) smmap(
size_t size) {
85 assert(size < std::numeric_limits<size_t>::max() - 4096);
87 const int anonymous_fd = -1;
88 const off_t offset = 0;
89 size_t pages = ((size + 2 *
sizeof(size_t)) + 4095)
91 unsigned char *mem = NULL;
93 #ifdef CVMFS_SUPPRESS_ASSERTS
96 mem =
static_cast<unsigned char *
>(
99 PROT_READ | PROT_WRITE,
104 #ifdef CVMFS_SUPPRESS_ASSERTS
105 }
while (mem == MAP_FAILED);
109 assert((mem != MAP_FAILED) &&
"Out Of Memory");
111 *(
reinterpret_cast<size_t *
>(
mem) + 1) = pages;
112 return mem + 2 *
sizeof(size_t);
115 static inline void __attribute__((used)) smunmap(
void *mem) {
116 unsigned char *area =
static_cast<unsigned char *
>(
mem);
117 area = area -
sizeof(size_t);
118 size_t pages = *(
reinterpret_cast<size_t *
>(area));
119 int retval = munmap(area -
sizeof(
size_t), pages * 4096);
121 assert((retval == 0) &&
"Invalid umnmap");
128 static inline void *
__attribute__((used)) sxmmap(
size_t size) {
129 const int anonymous_fd = -1;
130 const off_t offset = 0;
133 #ifdef CVMFS_SUPPRESS_ASSERTS
138 PROT_READ | PROT_WRITE,
143 #ifdef CVMFS_SUPPRESS_ASSERTS
144 }
while (mem == MAP_FAILED);
147 assert((mem != MAP_FAILED) &&
"Out Of Memory");
155 static inline void __attribute__((used)) sxunmap(
void *mem,
size_t size) {
156 int retval = munmap(mem, size);
157 assert((retval == 0) &&
"Invalid umnmap");
165 static inline void *
__attribute__((used)) sxmmap_align(
size_t size) {
166 assert((size % (2 * 1024 * 1024)) == 0);
168 #ifdef CVMFS_SUPPRESS_ASSERTS
171 mem =
reinterpret_cast<char *
>(sxmmap(2 * size));
172 #ifdef CVMFS_SUPPRESS_ASSERTS
173 }
while (mem == MAP_FAILED);
176 uintptr_t head = size - (uintptr_t(mem) %
size);
179 uintptr_t tail = size - head;
181 sxunmap(mem + size, tail);
186 #ifdef CVMFS_NAMESPACE_GUARD
190 #endif // CVMFS_UTIL_SMALLOC_H_
assert((mem||(size==0))&&"Out Of Memory")
struct cvmcache_object_info __attribute__
static uint64_t RoundUp8(const uint64_t size)
#define PLATFORM_MAP_ANONYMOUS
const uint32_t kMemMarker