ryantimwilson / rpms / systemd

Forked from rpms/systemd a month ago
Clone
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();