1*4226f635SJason King /*
2*4226f635SJason King  * This file and its contents are supplied under the terms of the
3*4226f635SJason King  * Common Development and Distribution License ("CDDL"), version 1.0.
4*4226f635SJason King  * You may only use this file in accordance with the terms of version
5*4226f635SJason King  * 1.0 of the CDDL.
6*4226f635SJason King  *
7*4226f635SJason King  * A full copy of the text of the CDDL should have accompanied this
8*4226f635SJason King  * source.  A copy of the CDDL is also available via the Internet at
9*4226f635SJason King  * http://www.illumos.org/license/CDDL.
10*4226f635SJason King  */
11*4226f635SJason King 
12*4226f635SJason King /*
13*4226f635SJason King  * Copyright 2017 Jason King
14*4226f635SJason King  */
15*4226f635SJason King 
16*4226f635SJason King #include <sys/debug.h>
17*4226f635SJason King #include <stdlib.h>
18*4226f635SJason King #include <string.h>
19*4226f635SJason King #include "demangle-sys.h"
20*4226f635SJason King #include "demangle_int.h"
21*4226f635SJason King 
22*4226f635SJason King void *
23*4226f635SJason King zalloc(sysdem_ops_t *ops, size_t len)
24*4226f635SJason King {
25*4226f635SJason King 	void *p = ops->alloc(len);
26*4226f635SJason King 
27*4226f635SJason King 	if (p != NULL)
28*4226f635SJason King 		(void) memset(p, 0, len);
29*4226f635SJason King 
30*4226f635SJason King #ifdef DEBUG
31*4226f635SJason King 	/*
32*4226f635SJason King 	 * In normal operation, we should never exhaust memory.  Either
33*4226f635SJason King 	 * something's wrong, or the system is so hosed that aborting
34*4226f635SJason King 	 * shouldn't hurt anything, and it gives us a more useful stack
35*4226f635SJason King 	 * trace.
36*4226f635SJason King 	 */
37*4226f635SJason King 	if (p == NULL)
38*4226f635SJason King 		abort();
39*4226f635SJason King #endif
40*4226f635SJason King 
41*4226f635SJason King 	return (p);
42*4226f635SJason King }
43*4226f635SJason King 
44*4226f635SJason King void
45*4226f635SJason King xfree(sysdem_ops_t *ops, void *p, size_t len)
46*4226f635SJason King {
47*4226f635SJason King 	if (p == NULL || len == 0)
48*4226f635SJason King 		return;
49*4226f635SJason King 
50*4226f635SJason King 	ops->free(p, len);
51*4226f635SJason King }
52*4226f635SJason King 
53*4226f635SJason King void *
54*4226f635SJason King xrealloc(sysdem_ops_t *ops, void *p, size_t oldsz, size_t newsz)
55*4226f635SJason King {
56*4226f635SJason King 	if (newsz == oldsz)
57*4226f635SJason King 		return (p);
58*4226f635SJason King 
59*4226f635SJason King 	VERIFY3U(newsz, >, oldsz);
60*4226f635SJason King 
61*4226f635SJason King 	void *temp = zalloc(ops, newsz);
62*4226f635SJason King 
63*4226f635SJason King 	if (temp == NULL)
64*4226f635SJason King 		return (NULL);
65*4226f635SJason King 
66*4226f635SJason King 	if (oldsz > 0) {
67*4226f635SJason King 		(void) memcpy(temp, p, oldsz);
68*4226f635SJason King 		xfree(ops, p, oldsz);
69*4226f635SJason King 	}
70*4226f635SJason King 
71*4226f635SJason King 	return (temp);
72*4226f635SJason King }
73*4226f635SJason King 
74*4226f635SJason King /*ARGSUSED*/
75*4226f635SJason King static void
76*4226f635SJason King def_free(void *p, size_t len)
77*4226f635SJason King {
78*4226f635SJason King 	free(p);
79*4226f635SJason King }
80*4226f635SJason King 
81*4226f635SJason King static sysdem_ops_t i_sysdem_ops_default = {
82*4226f635SJason King 	.alloc = malloc,
83*4226f635SJason King 	.free = def_free
84*4226f635SJason King };
85*4226f635SJason King sysdem_ops_t *sysdem_ops_default = &i_sysdem_ops_default;
86