I noticed test failures of module 'aligned-malloc' on OpenBSD 6.1
and AIX 7.2 (64-bit). So, apparently some of the functions memalign,
posix_memalign, aligned_alloc are not reliably implemented on some
platforms.

Let me add modules for these functions. These modules don't implement
the functions when they are not provided (due to the impossibilty
to call free() on a pointer that was not returned by malloc()). They
only add workarounds. Add unit tests, of course.


'memalign' works when it is implemented. So, for this one, the
purpose of the module 'memalign' is only to drag in the unit tests.


2020-11-03  Bruno Haible  <[email protected]>

        memalign: Add tests.
        * tests/test-memalign.c: New file.
        * modules/memalign-tests: New file.

        memalign: New module.
        * modules/memalign: New file.
        * doc/glibc-functions/memalign.texi: Mention the new module.

>From 9019f1d7d55639280f72478906ffda77a5358892 Mon Sep 17 00:00:00 2001
From: Bruno Haible <[email protected]>
Date: Wed, 4 Nov 2020 02:12:15 +0100
Subject: [PATCH 1/2] memalign: New module.

* modules/memalign: New file.
* doc/glibc-functions/memalign.texi: Mention the new module.
---
 ChangeLog                         |  6 ++++++
 doc/glibc-functions/memalign.texi |  2 +-
 modules/memalign                  | 22 ++++++++++++++++++++++
 3 files changed, 29 insertions(+), 1 deletion(-)
 create mode 100644 modules/memalign

diff --git a/ChangeLog b/ChangeLog
index bd7cb08..b78324f 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,11 @@
 2020-11-03  Bruno Haible  <[email protected]>
 
+	memalign: New module.
+	* modules/memalign: New file.
+	* doc/glibc-functions/memalign.texi: Mention the new module.
+
+2020-11-03  Bruno Haible  <[email protected]>
+
 	verify tests: Fix crash with GCC (regression 2020-11-02).
 	* tests/test-verify.c (main): Fix initializer of s.
 
diff --git a/doc/glibc-functions/memalign.texi b/doc/glibc-functions/memalign.texi
index a25b3f8..7c07bc6 100644
--- a/doc/glibc-functions/memalign.texi
+++ b/doc/glibc-functions/memalign.texi
@@ -15,7 +15,7 @@ Documentation:
 @uref{https://www.kernel.org/doc/man-pages/online/pages/man3/memalign.3.html,,man memalign}.
 @end itemize
 
-Gnulib module: ---
+Gnulib module: memalign
 
 Portability problems fixed by Gnulib:
 @itemize
diff --git a/modules/memalign b/modules/memalign
new file mode 100644
index 0000000..e8a292d
--- /dev/null
+++ b/modules/memalign
@@ -0,0 +1,22 @@
+Description:
+Allocate memory with indefinite extent and specified alignment.
+
+Files:
+
+Depends-on:
+
+configure.ac:
+AC_CHECK_FUNCS([memalign])
+
+Makefile.am:
+
+Include:
+#if HAVE_MEMALIGN
+#include <malloc.h>
+#endif
+
+License:
+LGPLv2+
+
+Maintainer:
+all
-- 
2.7.4

>From 3056c25ec015a135b8fa4b2a76609e4da959113f Mon Sep 17 00:00:00 2001
From: Bruno Haible <[email protected]>
Date: Wed, 4 Nov 2020 02:12:22 +0100
Subject: [PATCH 2/2] memalign: Add tests.

* tests/test-memalign.c: New file.
* modules/memalign-tests: New file.
---
 ChangeLog              |   6 +++
 modules/memalign-tests |  12 ++++++
 tests/test-memalign.c  | 105 +++++++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 123 insertions(+)
 create mode 100644 modules/memalign-tests
 create mode 100644 tests/test-memalign.c

diff --git a/ChangeLog b/ChangeLog
index b78324f..6998d36 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,11 @@
 2020-11-03  Bruno Haible  <[email protected]>
 
+	memalign: Add tests.
+	* tests/test-memalign.c: New file.
+	* modules/memalign-tests: New file.
+
+2020-11-03  Bruno Haible  <[email protected]>
+
 	memalign: New module.
 	* modules/memalign: New file.
 	* doc/glibc-functions/memalign.texi: Mention the new module.
diff --git a/modules/memalign-tests b/modules/memalign-tests
new file mode 100644
index 0000000..1450354
--- /dev/null
+++ b/modules/memalign-tests
@@ -0,0 +1,12 @@
+Files:
+tests/test-memalign.c
+tests/macros.h
+
+Depends-on:
+stdint
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-memalign
+check_PROGRAMS += test-memalign
diff --git a/tests/test-memalign.c b/tests/test-memalign.c
new file mode 100644
index 0000000..5e9815a
--- /dev/null
+++ b/tests/test-memalign.c
@@ -0,0 +1,105 @@
+/* Test of allocating memory with given alignment.
+
+   Copyright (C) 2020 Free Software Foundation, Inc.
+
+   This program is free software: you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+/* Written by Bruno Haible <[email protected]>, 2020.  */
+
+#include <config.h>
+
+#if HAVE_MEMALIGN
+
+/* Specification.  */
+# include <malloc.h>
+
+# include <stdint.h>
+# include <stdlib.h>
+# include <string.h>
+
+# include "macros.h"
+
+int
+main (int argc, char *argv[])
+{
+  static size_t sizes[] =
+    { 13, 8, 17, 450, 320, 1, 99, 4, 15, 16, 2, 76, 37, 127, 2406, 641, 5781 };
+  void *aligned2_blocks[SIZEOF (sizes)];
+  void *aligned4_blocks[SIZEOF (sizes)];
+  void *aligned8_blocks[SIZEOF (sizes)];
+  void *aligned16_blocks[SIZEOF (sizes)];
+  void *aligned32_blocks[SIZEOF (sizes)];
+  void *aligned64_blocks[SIZEOF (sizes)];
+  size_t i;
+
+  for (i = 0; i < SIZEOF (sizes); i++)
+    {
+      size_t size = sizes[i];
+
+      aligned2_blocks[i] = memalign (2, size);
+      ASSERT (aligned2_blocks[i] != NULL);
+      ASSERT (((uintptr_t) aligned2_blocks[i] % 2) == 0);
+      memset (aligned2_blocks[i], 'u', size);
+
+      aligned4_blocks[i] = memalign (4, size);
+      ASSERT (aligned4_blocks[i] != NULL);
+      ASSERT (((uintptr_t) aligned4_blocks[i] % 4) == 0);
+      memset (aligned4_blocks[i], 'v', size);
+
+      aligned8_blocks[i] = memalign (8, size);
+      ASSERT (aligned8_blocks[i] != NULL);
+      ASSERT (((uintptr_t) aligned8_blocks[i] % 8) == 0);
+      memset (aligned8_blocks[i], 'w', size);
+
+      aligned16_blocks[i] = memalign (16, size);
+      ASSERT (aligned16_blocks[i] != NULL);
+      ASSERT (((uintptr_t) aligned16_blocks[i] % 16) == 0);
+      memset (aligned16_blocks[i], 'x', size);
+
+      aligned32_blocks[i] = memalign (32, size);
+      ASSERT (aligned32_blocks[i] != NULL);
+      ASSERT (((uintptr_t) aligned32_blocks[i] % 32) == 0);
+      memset (aligned32_blocks[i], 'y', size);
+
+      aligned64_blocks[i] = memalign (64, size);
+      ASSERT (aligned64_blocks[i] != NULL);
+      ASSERT (((uintptr_t) aligned64_blocks[i] % 64) == 0);
+      memset (aligned64_blocks[i], 'z', size);
+    }
+
+  for (i = 0; i < SIZEOF (sizes); i++)
+    {
+      free (aligned2_blocks[i]);
+      free (aligned4_blocks[i]);
+      free (aligned8_blocks[i]);
+      free (aligned16_blocks[i]);
+      free (aligned32_blocks[i]);
+      free (aligned64_blocks[i]);
+    }
+
+  return 0;
+}
+
+#else
+
+# include <stdio.h>
+
+int
+main (int argc, char *argv[])
+{
+  fputs ("Skipping test: function 'memalign' does not exist\n", stderr);
+  return 77;
+}
+
+#endif
-- 
2.7.4

Reply via email to