usr/src/lib/libc/port/gen/posix_memalign.c
author Jon Tibble <meths@btinternet.com>
Thu, 09 Dec 2010 22:32:39 +0100
changeset 13255 4afa820d78b9
parent 7088 87e6b40103da
permissions -rw-r--r--
298 SPARC build fails in smt_pause.o 478 Build needs fixing for pkgdepend flag day Reviewed by: [email protected] Reviewed by: [email protected] Reviewed by: [email protected] Approved by: [email protected]
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
7088
87e6b40103da PSARC 2008/421 _POSIX_ADVISORY_INFO
raf
parents:
diff changeset
     1
/*
87e6b40103da PSARC 2008/421 _POSIX_ADVISORY_INFO
raf
parents:
diff changeset
     2
 * CDDL HEADER START
87e6b40103da PSARC 2008/421 _POSIX_ADVISORY_INFO
raf
parents:
diff changeset
     3
 *
87e6b40103da PSARC 2008/421 _POSIX_ADVISORY_INFO
raf
parents:
diff changeset
     4
 * The contents of this file are subject to the terms of the
87e6b40103da PSARC 2008/421 _POSIX_ADVISORY_INFO
raf
parents:
diff changeset
     5
 * Common Development and Distribution License (the "License").
87e6b40103da PSARC 2008/421 _POSIX_ADVISORY_INFO
raf
parents:
diff changeset
     6
 * You may not use this file except in compliance with the License.
87e6b40103da PSARC 2008/421 _POSIX_ADVISORY_INFO
raf
parents:
diff changeset
     7
 *
87e6b40103da PSARC 2008/421 _POSIX_ADVISORY_INFO
raf
parents:
diff changeset
     8
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
87e6b40103da PSARC 2008/421 _POSIX_ADVISORY_INFO
raf
parents:
diff changeset
     9
 * or http://www.opensolaris.org/os/licensing.
87e6b40103da PSARC 2008/421 _POSIX_ADVISORY_INFO
raf
parents:
diff changeset
    10
 * See the License for the specific language governing permissions
87e6b40103da PSARC 2008/421 _POSIX_ADVISORY_INFO
raf
parents:
diff changeset
    11
 * and limitations under the License.
87e6b40103da PSARC 2008/421 _POSIX_ADVISORY_INFO
raf
parents:
diff changeset
    12
 *
87e6b40103da PSARC 2008/421 _POSIX_ADVISORY_INFO
raf
parents:
diff changeset
    13
 * When distributing Covered Code, include this CDDL HEADER in each
87e6b40103da PSARC 2008/421 _POSIX_ADVISORY_INFO
raf
parents:
diff changeset
    14
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
87e6b40103da PSARC 2008/421 _POSIX_ADVISORY_INFO
raf
parents:
diff changeset
    15
 * If applicable, add the following below this CDDL HEADER, with the
87e6b40103da PSARC 2008/421 _POSIX_ADVISORY_INFO
raf
parents:
diff changeset
    16
 * fields enclosed by brackets "[]" replaced with your own identifying
87e6b40103da PSARC 2008/421 _POSIX_ADVISORY_INFO
raf
parents:
diff changeset
    17
 * information: Portions Copyright [yyyy] [name of copyright owner]
87e6b40103da PSARC 2008/421 _POSIX_ADVISORY_INFO
raf
parents:
diff changeset
    18
 *
87e6b40103da PSARC 2008/421 _POSIX_ADVISORY_INFO
raf
parents:
diff changeset
    19
 * CDDL HEADER END
87e6b40103da PSARC 2008/421 _POSIX_ADVISORY_INFO
raf
parents:
diff changeset
    20
 */
87e6b40103da PSARC 2008/421 _POSIX_ADVISORY_INFO
raf
parents:
diff changeset
    21
87e6b40103da PSARC 2008/421 _POSIX_ADVISORY_INFO
raf
parents:
diff changeset
    22
/*
87e6b40103da PSARC 2008/421 _POSIX_ADVISORY_INFO
raf
parents:
diff changeset
    23
 * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
87e6b40103da PSARC 2008/421 _POSIX_ADVISORY_INFO
raf
parents:
diff changeset
    24
 * Use is subject to license terms.
87e6b40103da PSARC 2008/421 _POSIX_ADVISORY_INFO
raf
parents:
diff changeset
    25
 */
87e6b40103da PSARC 2008/421 _POSIX_ADVISORY_INFO
raf
parents:
diff changeset
    26
87e6b40103da PSARC 2008/421 _POSIX_ADVISORY_INFO
raf
parents:
diff changeset
    27
#pragma ident	"%Z%%M%	%I%	%E% SMI"
87e6b40103da PSARC 2008/421 _POSIX_ADVISORY_INFO
raf
parents:
diff changeset
    28
87e6b40103da PSARC 2008/421 _POSIX_ADVISORY_INFO
raf
parents:
diff changeset
    29
#include "lint.h"
87e6b40103da PSARC 2008/421 _POSIX_ADVISORY_INFO
raf
parents:
diff changeset
    30
#include <stdlib.h>
87e6b40103da PSARC 2008/421 _POSIX_ADVISORY_INFO
raf
parents:
diff changeset
    31
#include <errno.h>
87e6b40103da PSARC 2008/421 _POSIX_ADVISORY_INFO
raf
parents:
diff changeset
    32
87e6b40103da PSARC 2008/421 _POSIX_ADVISORY_INFO
raf
parents:
diff changeset
    33
/*
87e6b40103da PSARC 2008/421 _POSIX_ADVISORY_INFO
raf
parents:
diff changeset
    34
 * SUSv3 - aligned memory allocation
87e6b40103da PSARC 2008/421 _POSIX_ADVISORY_INFO
raf
parents:
diff changeset
    35
 *
87e6b40103da PSARC 2008/421 _POSIX_ADVISORY_INFO
raf
parents:
diff changeset
    36
 * From the SUSv3 specification:
87e6b40103da PSARC 2008/421 _POSIX_ADVISORY_INFO
raf
parents:
diff changeset
    37
 *    The value of alignment shall be a power
87e6b40103da PSARC 2008/421 _POSIX_ADVISORY_INFO
raf
parents:
diff changeset
    38
 *    of two multiple of sizeof (void *).
87e6b40103da PSARC 2008/421 _POSIX_ADVISORY_INFO
raf
parents:
diff changeset
    39
 * This is enforced below.
87e6b40103da PSARC 2008/421 _POSIX_ADVISORY_INFO
raf
parents:
diff changeset
    40
 *
87e6b40103da PSARC 2008/421 _POSIX_ADVISORY_INFO
raf
parents:
diff changeset
    41
 * From the SUSv3 specification:
87e6b40103da PSARC 2008/421 _POSIX_ADVISORY_INFO
raf
parents:
diff changeset
    42
 *    If the size of the space requested is 0, the behavior
87e6b40103da PSARC 2008/421 _POSIX_ADVISORY_INFO
raf
parents:
diff changeset
    43
 *    is implementation-defined; the value returned in memptr
87e6b40103da PSARC 2008/421 _POSIX_ADVISORY_INFO
raf
parents:
diff changeset
    44
 *    shall be either a null pointer or a unique pointer.
87e6b40103da PSARC 2008/421 _POSIX_ADVISORY_INFO
raf
parents:
diff changeset
    45
 * We choose always to return a null pointer in this case.
87e6b40103da PSARC 2008/421 _POSIX_ADVISORY_INFO
raf
parents:
diff changeset
    46
 * (Not all implementations of memalign() behave this way.)
87e6b40103da PSARC 2008/421 _POSIX_ADVISORY_INFO
raf
parents:
diff changeset
    47
 */
87e6b40103da PSARC 2008/421 _POSIX_ADVISORY_INFO
raf
parents:
diff changeset
    48
int
87e6b40103da PSARC 2008/421 _POSIX_ADVISORY_INFO
raf
parents:
diff changeset
    49
posix_memalign(void **memptr, size_t alignment, size_t size)
87e6b40103da PSARC 2008/421 _POSIX_ADVISORY_INFO
raf
parents:
diff changeset
    50
{
87e6b40103da PSARC 2008/421 _POSIX_ADVISORY_INFO
raf
parents:
diff changeset
    51
	void *ptr = NULL;
87e6b40103da PSARC 2008/421 _POSIX_ADVISORY_INFO
raf
parents:
diff changeset
    52
	int error = 0;
87e6b40103da PSARC 2008/421 _POSIX_ADVISORY_INFO
raf
parents:
diff changeset
    53
87e6b40103da PSARC 2008/421 _POSIX_ADVISORY_INFO
raf
parents:
diff changeset
    54
	if (alignment == 0 ||
87e6b40103da PSARC 2008/421 _POSIX_ADVISORY_INFO
raf
parents:
diff changeset
    55
	    (alignment & (sizeof (void *) - 1)) != 0 ||
87e6b40103da PSARC 2008/421 _POSIX_ADVISORY_INFO
raf
parents:
diff changeset
    56
	    (alignment & (alignment - 1)) != 0)
87e6b40103da PSARC 2008/421 _POSIX_ADVISORY_INFO
raf
parents:
diff changeset
    57
		error = EINVAL;
87e6b40103da PSARC 2008/421 _POSIX_ADVISORY_INFO
raf
parents:
diff changeset
    58
	else if (size != 0 &&
87e6b40103da PSARC 2008/421 _POSIX_ADVISORY_INFO
raf
parents:
diff changeset
    59
	    (ptr = memalign(alignment, size)) == NULL)
87e6b40103da PSARC 2008/421 _POSIX_ADVISORY_INFO
raf
parents:
diff changeset
    60
		error = ENOMEM;
87e6b40103da PSARC 2008/421 _POSIX_ADVISORY_INFO
raf
parents:
diff changeset
    61
87e6b40103da PSARC 2008/421 _POSIX_ADVISORY_INFO
raf
parents:
diff changeset
    62
	*memptr = ptr;
87e6b40103da PSARC 2008/421 _POSIX_ADVISORY_INFO
raf
parents:
diff changeset
    63
	return (error);
87e6b40103da PSARC 2008/421 _POSIX_ADVISORY_INFO
raf
parents:
diff changeset
    64
}