|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
From 95d78c7e7c81a6b788f28c33ef2cafd87471a0d7 Mon Sep 17 00:00:00 2001
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
From: David Herrmann <dh.herrmann@gmail.com>
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
Date: Mon, 22 Sep 2014 12:05:16 +0200
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
Subject: [PATCH] util: add alloca_align()
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
The alloca_align() helper is the alloca() equivalent of posix_memalign().
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
As there is no such function provided by glibc, we simply account for
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
additional memory and return a pointer offset into the allocated memory to
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
grant the alignment.
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
Furthermore, alloca0_align() is added, which simply clears the allocated
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
memory.
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
---
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
src/shared/util.h | 16 ++++++++++++++++
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
src/test/test-util.c | 14 ++++++++++++++
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
2 files changed, 30 insertions(+)
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
diff --git a/src/shared/util.h b/src/shared/util.h
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
index 08d556fc92..a1d5657237 100644
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
--- a/src/shared/util.h
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+++ b/src/shared/util.h
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
@@ -852,6 +852,22 @@ int unlink_noerrno(const char *path);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
(void *) memset(_new_, 0, _len_); \
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
})
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+#define alloca_align(size, align) \
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ ({ \
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ void *_ptr_; \
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ size_t _mask_ = (align) - 1; \
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ _ptr_ = alloca((size) + _mask_); \
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ (void*)(((uintptr_t)_ptr_ + _mask_) & ~_mask_); \
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ })
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+#define alloca0_align(size, align) \
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ ({ \
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ void *_new_; \
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ size_t _size_ = (size); \
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ _new_ = alloca_align(_size_, (align)); \
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ (void*)memset(_new_, 0, _size_); \
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ })
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
#define strappenda(a, ...) \
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
({ \
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
int _len = strlen(a); \
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
diff --git a/src/test/test-util.c b/src/test/test-util.c
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
index f8e42f3a55..1311184815 100644
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
--- a/src/test/test-util.c
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+++ b/src/test/test-util.c
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
@@ -131,6 +131,19 @@ static void test_container_of(void) {
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
v1) == &myval);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
}
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+static void test_alloca(void) {
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ static const uint8_t zero[997] = { };
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ char *t;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ t = alloca_align(17, 512);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ assert_se(!((uintptr_t)t & 0xff));
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ memzero(t, 17);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ t = alloca0_align(997, 1024);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ assert_se(!((uintptr_t)t & 0x1ff));
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ assert_se(!memcmp(t, zero, 997));
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+}
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
static void test_first_word(void) {
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
assert_se(first_word("Hello", ""));
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
assert_se(first_word("Hello", "Hello"));
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
@@ -1272,6 +1285,7 @@ int main(int argc, char *argv[]) {
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
test_align_power2();
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
test_max();
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
test_container_of();
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ test_alloca();
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
test_first_word();
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
test_close_many();
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
test_parse_boolean();
|