1/*
2 * This file and its contents are supplied under the terms of the
3 * Common Development and Distribution License ("CDDL"), version 1.0.
4 * You may only use this file in accordance with the terms of version
5 * 1.0 of the CDDL.
6 *
7 * A full copy of the text of the CDDL should have accompanied this
8 * source.  A copy of the CDDL is also available via the Internet at
9 * http://www.illumos.org/license/CDDL.
10 */
11
12/*
13 * Copyright 2016 Joyent, Inc.
14 */
15
16/*
17 * Basic tests for aligned_alloc(3C). Note that we test ENOMEM failure by
18 * relying on the implementation of the current libc malloc. Specifically we go
19 * through and add a mapping so we can't expand the heap and then use it up. If
20 * the memory allocator is ever changed, this test will start failing, at which
21 * point, it may not be worth the cost of keeping it around.
22 */
23
24#include <stdlib.h>
25#include <errno.h>
26#include <libproc.h>
27#include <sys/sysmacros.h>
28#include <sys/mman.h>
29#include <sys/debug.h>
30
31int
32main(void)
33{
34	pstatus_t status;
35	void *buf;
36
37	/*
38	 * Alignment must be sizeof (void *) (word) aligned.
39	 */
40	VERIFY3P(aligned_alloc(sizeof (void *) - 1, 16), ==, NULL);
41	VERIFY3S(errno, ==, EINVAL);
42
43	VERIFY3P(aligned_alloc(sizeof (void *) + 1, 16), ==, NULL);
44	VERIFY3S(errno, ==, EINVAL);
45
46
47	VERIFY3P(aligned_alloc(23, 16), ==, NULL);
48	VERIFY3S(errno, ==, EINVAL);
49
50	buf = aligned_alloc(sizeof (void *), 16);
51	VERIFY3P(buf, !=, NULL);
52	free(buf);
53
54	/*
55	 * Cause ENOMEM
56	 */
57	VERIFY0(proc_get_status(getpid(), &status));
58	VERIFY3P(mmap((caddr_t)P2ROUNDUP(status.pr_brkbase +
59	    status.pr_brksize, 0x1000), 0x1000,
60	    PROT_READ, MAP_ANON | MAP_FIXED | MAP_PRIVATE, -1, 0),
61	    !=, (void *)-1);
62
63	for (;;) {
64		if (malloc(16) == NULL)
65			break;
66	}
67
68	for (;;) {
69		if (aligned_alloc(sizeof (void *), 16) == NULL)
70			break;
71	}
72
73	VERIFY3P(aligned_alloc(sizeof (void *), 16), ==, NULL);
74	VERIFY3S(errno, ==, ENOMEM);
75
76	return (0);
77}
78