mirror of
https://github.com/systemd/systemd
synced 2024-09-06 08:46:19 +00:00
util: add alloca_align()
The alloca_align() helper is the alloca() equivalent of posix_memalign(). As there is no such function provided by glibc, we simply account for additional memory and return a pointer offset into the allocated memory to grant the alignment. Furthermore, alloca0_align() is added, which simply clears the allocated memory.
This commit is contained in:
parent
eee846339d
commit
95d78c7e7c
|
@ -852,6 +852,22 @@ int unlink_noerrno(const char *path);
|
|||
(void *) memset(_new_, 0, _len_); \
|
||||
})
|
||||
|
||||
#define alloca_align(size, align) \
|
||||
({ \
|
||||
void *_ptr_; \
|
||||
size_t _mask_ = (align) - 1; \
|
||||
_ptr_ = alloca((size) + _mask_); \
|
||||
(void*)(((uintptr_t)_ptr_ + _mask_) & ~_mask_); \
|
||||
})
|
||||
|
||||
#define alloca0_align(size, align) \
|
||||
({ \
|
||||
void *_new_; \
|
||||
size_t _size_ = (size); \
|
||||
_new_ = alloca_align(_size_, (align)); \
|
||||
(void*)memset(_new_, 0, _size_); \
|
||||
})
|
||||
|
||||
#define strappenda(a, ...) \
|
||||
({ \
|
||||
int _len = strlen(a); \
|
||||
|
|
|
@ -131,6 +131,19 @@ static void test_container_of(void) {
|
|||
v1) == &myval);
|
||||
}
|
||||
|
||||
static void test_alloca(void) {
|
||||
static const uint8_t zero[997] = { };
|
||||
char *t;
|
||||
|
||||
t = alloca_align(17, 512);
|
||||
assert_se(!((uintptr_t)t & 0xff));
|
||||
memzero(t, 17);
|
||||
|
||||
t = alloca0_align(997, 1024);
|
||||
assert_se(!((uintptr_t)t & 0x1ff));
|
||||
assert_se(!memcmp(t, zero, 997));
|
||||
}
|
||||
|
||||
static void test_first_word(void) {
|
||||
assert_se(first_word("Hello", ""));
|
||||
assert_se(first_word("Hello", "Hello"));
|
||||
|
@ -1272,6 +1285,7 @@ int main(int argc, char *argv[]) {
|
|||
test_align_power2();
|
||||
test_max();
|
||||
test_container_of();
|
||||
test_alloca();
|
||||
test_first_word();
|
||||
test_close_many();
|
||||
test_parse_boolean();
|
||||
|
|
Loading…
Reference in a new issue