libc/stdlib: Refactor aligned_alloc().
authorzrj <rimvydas.jasinskas@gmail.com>
Wed, 3 Apr 2019 13:26:44 +0000 (16:26 +0300)
committerzrj <zrj@dragonflybsd.org>
Sun, 7 Apr 2019 19:15:05 +0000 (22:15 +0300)
  * Lift the restriction from posix_memalign() that alignment should be
    more or equal to sizeof(void *).
  * Make aligned_alloc() a weak symbol.
  * Adjust the manpage.

lib/libc/stdlib/Makefile.inc
lib/libc/stdlib/Symbol.map
lib/libc/stdlib/aligned_alloc.c [deleted file]
lib/libc/stdlib/nmalloc.c
lib/libc/stdlib/posix_memalign.3

index e765c2c..61f7b8d 100644 (file)
@@ -6,7 +6,7 @@
 
 CMAPS+=        ${.CURDIR}/stdlib/Symbol.map
 
-MISRCS+=a64l.c abort.c abs.c atexit.c aligned_alloc.c \
+MISRCS+=a64l.c abort.c abs.c atexit.c \
        atof.c atoi.c atol.c atoll.c \
        bsearch.c cxa_thread_atexit_impl.c \
        div.c exit.c getenv.c getopt.c getopt_long.c \
index 4a800e3..ad84353 100644 (file)
@@ -117,6 +117,7 @@ DF504.0 {
 };
 
 DF506.0 {
+    __aligned_alloc;
     __cxa_thread_atexit_impl;
     reallocarray;
 };
diff --git a/lib/libc/stdlib/aligned_alloc.c b/lib/libc/stdlib/aligned_alloc.c
deleted file mode 100644 (file)
index 9f13481..0000000
+++ /dev/null
@@ -1,49 +0,0 @@
-/*-
-* Copyright (c) 2012
-*      The DragonFly Project.  All rights reserved.
-*
-* Redistribution and use in source and binary forms, with or without
-* modification, are permitted provided that the following conditions
-* are met:
-*
-* 1. Redistributions of source code must retain the above copyright
-*    notice, this list of conditions and the following disclaimer.
-* 2. Redistributions in binary form must reproduce the above copyright
-*    notice, this list of conditions and the following disclaimer in
-*    the documentation and/or other materials provided with the
-*    distribution.
-* 3. Neither the name of The DragonFly Project nor the names of its
-*    contributors may be used to endorse or promote products derived
-*    from this software without specific, prior written permission.
-*
-* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-* ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
-* FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE
-* COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-* INCIDENTAL, SPECIAL, EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING,
-* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
-* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
-* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-* SUCH DAMAGE.
-*/
-
-#include <sys/types.h>
-#include <stdlib.h>
-#include <errno.h>
-
-void *
-aligned_alloc(size_t alignment, size_t size)
-{
-       void *ptr;
-       int rc;
-
-       ptr = NULL;
-       rc = posix_memalign(&ptr, alignment, size);
-       if (rc)
-               errno = rc;
-
-       return (ptr);
-}
index 87df700..ce6b443 100644 (file)
@@ -351,6 +351,7 @@ static size_t excess_alloc;                         /* excess big allocs */
 static void *_slaballoc(size_t size, int flags);
 static void *_slabrealloc(void *ptr, size_t size);
 static void _slabfree(void *ptr, int, bigalloc_t *);
+static int _slabmemalign(void **memptr, size_t alignment, size_t size);
 static void *_vmem_alloc(size_t bytes, size_t align, int flags);
 static void _vmem_free(void *ptr, size_t bytes);
 static void *magazine_alloc(struct magazine *, int *);
@@ -812,24 +813,67 @@ __realloc(void *ptr, size_t size)
        return(ret);
 }
 
+/*
+ * aligned_alloc()
+ *
+ * Allocate (size) bytes with a alignment of (alignment).
+ */
+void *
+__aligned_alloc(size_t alignment, size_t size)
+{
+       void *ptr;
+       int rc;
+
+       ptr = NULL;
+       rc = _slabmemalign(&ptr, alignment, size);
+       if (rc)
+               errno = rc;
+
+       return (ptr);
+}
+
 /*
  * posix_memalign()
  *
  * Allocate (size) bytes with a alignment of (alignment), where (alignment)
  * is a power of 2 >= sizeof(void *).
- *
+ */
+int
+__posix_memalign(void **memptr, size_t alignment, size_t size)
+{
+       int rc;
+
+       /*
+        * OpenGroup spec issue 6 check
+        */
+       if (alignment < sizeof(void *)) {
+               *memptr = NULL;
+               return(EINVAL);
+       }
+
+       rc = _slabmemalign(memptr, alignment, size);
+
+       return (rc);
+}
+
+/*
  * The slab allocator will allocate on power-of-2 boundaries up to
  * at least PAGE_SIZE.  We use the zoneindex mechanic to find a
  * zone matching the requirements, and _vmem_alloc() otherwise.
  */
-int
-__posix_memalign(void **memptr, size_t alignment, size_t size)
+static int
+_slabmemalign(void **memptr, size_t alignment, size_t size)
 {
        bigalloc_t *bigp;
        bigalloc_t big;
        size_t chunking;
        int zi __unused;
 
+       if (alignment < 1) {
+               *memptr = NULL;
+               return(EINVAL);
+       }
+
        /*
         * OpenGroup spec issue 6 checks
         */
@@ -837,10 +881,6 @@ __posix_memalign(void **memptr, size_t alignment, size_t size)
                *memptr = NULL;
                return(EINVAL);
        }
-       if (alignment < sizeof(void *)) {
-               *memptr = NULL;
-               return(EINVAL);
-       }
 
        /*
         * Our zone mechanism guarantees same-sized alignment for any
@@ -1942,6 +1982,7 @@ _mpanic(const char *ctl, ...)
        abort();
 }
 
+__weak_reference(__aligned_alloc, aligned_alloc);
 __weak_reference(__malloc, malloc);
 __weak_reference(__calloc, calloc);
 __weak_reference(__posix_memalign, posix_memalign);
index 0d13555..7546ca4 100644 (file)
@@ -25,7 +25,7 @@
 .\" OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
 .\" EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 .\"
-.Dd August 9, 2012
+.Dd April 7, 2019
 .Dt POSIX_MEMALIGN 3
 .Os
 .Sh NAME
@@ -65,9 +65,11 @@ and
 .Pp
 The
 .Fn aligned_alloc
-function is the same as
+is similar to
 .Fn posix_memalign ,
-but it takes just
+but it does not have the
+.Fn sizeof "void *"
+restriction, takes just
 .Fa alignment
 and
 .Fa size