xref: /netbsd-src/external/cddl/osnet/lib/libumem/umem.c (revision 0d3564d15043a28d31f837e065390b4af80ac69b)
1*0d3564d1Shannken /*	$NetBSD: umem.c,v 1.3 2019/05/26 10:21:00 hannken Exp $	*/
2fc8ec0b8Shaad 
3fc8ec0b8Shaad /*
4fc8ec0b8Shaad  * CDDL HEADER START
5fc8ec0b8Shaad  *
6fc8ec0b8Shaad  * The contents of this file are subject to the terms of the
7fc8ec0b8Shaad  * Common Development and Distribution License (the "License").
8fc8ec0b8Shaad  * You may not use this file except in compliance with the License.
9fc8ec0b8Shaad  *
10fc8ec0b8Shaad  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
11fc8ec0b8Shaad  * or http://www.opensolaris.org/os/licensing.
12fc8ec0b8Shaad  * See the License for the specific language governing permissions
13fc8ec0b8Shaad  * and limitations under the License.
14fc8ec0b8Shaad  *
15fc8ec0b8Shaad  * When distributing Covered Code, include this CDDL HEADER in each
16fc8ec0b8Shaad  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
17fc8ec0b8Shaad  * If applicable, add the following below this CDDL HEADER, with the
18fc8ec0b8Shaad  * fields enclosed by brackets "[]" replaced with your own identifying
19fc8ec0b8Shaad  * information: Portions Copyright [yyyy] [name of copyright owner]
20fc8ec0b8Shaad  *
21fc8ec0b8Shaad  * CDDL HEADER END
22fc8ec0b8Shaad  */
23fc8ec0b8Shaad /*
24fc8ec0b8Shaad  * Copyright 2006 Ricardo Correia.  All rights reserved.
25fc8ec0b8Shaad  * Use is subject to license terms.
26fc8ec0b8Shaad  */
27fc8ec0b8Shaad 
28fc8ec0b8Shaad #include <umem.h>
29fc8ec0b8Shaad #include <stdlib.h>
30fc8ec0b8Shaad #include <assert.h>
31fc8ec0b8Shaad 
32fc8ec0b8Shaad static umem_nofail_callback_t *nofail_cb = NULL;
33fc8ec0b8Shaad 
34fc8ec0b8Shaad struct umem_cache {
35fc8ec0b8Shaad 	umem_constructor_t *constructor;
36fc8ec0b8Shaad 	umem_destructor_t *destructor;
37fc8ec0b8Shaad 	void *callback_data;
38fc8ec0b8Shaad 	size_t bufsize;
39fc8ec0b8Shaad };
40fc8ec0b8Shaad 
41fc8ec0b8Shaad /*
42fc8ec0b8Shaad  * Simple stub for umem_alloc(). The callback isn't expected to return.
43fc8ec0b8Shaad  */
umem_alloc(size_t size,int flags)44fc8ec0b8Shaad void *umem_alloc(size_t size, int flags)
45fc8ec0b8Shaad {
46fc8ec0b8Shaad 	assert(flags == UMEM_DEFAULT || flags == UMEM_NOFAIL);
47fc8ec0b8Shaad 
48fc8ec0b8Shaad 	if(size == 0)
49fc8ec0b8Shaad 		return NULL;
50fc8ec0b8Shaad 
51fc8ec0b8Shaad 	void *ret = malloc(size);
52fc8ec0b8Shaad 	if(ret == NULL) {
53fc8ec0b8Shaad 		if(!(flags & UMEM_NOFAIL))
54fc8ec0b8Shaad 			return NULL;
55fc8ec0b8Shaad 
56fc8ec0b8Shaad 		if(nofail_cb != NULL)
57fc8ec0b8Shaad 			nofail_cb();
58fc8ec0b8Shaad 		abort();
59fc8ec0b8Shaad 	}
60fc8ec0b8Shaad 
61fc8ec0b8Shaad 	return ret;
62fc8ec0b8Shaad }
63fc8ec0b8Shaad 
64fc8ec0b8Shaad /*
65fc8ec0b8Shaad  * Simple stub for umem_zalloc().
66fc8ec0b8Shaad  */
umem_zalloc(size_t size,int flags)67fc8ec0b8Shaad void *umem_zalloc(size_t size, int flags)
68fc8ec0b8Shaad {
69fc8ec0b8Shaad 	assert(flags == UMEM_DEFAULT || flags == UMEM_NOFAIL);
70fc8ec0b8Shaad 
71fc8ec0b8Shaad 	if(size == 0)
72fc8ec0b8Shaad 		return NULL;
73fc8ec0b8Shaad 
74fc8ec0b8Shaad 	void *ret = calloc(1, size);
75fc8ec0b8Shaad 	if(ret == NULL) {
76fc8ec0b8Shaad 		if(!(flags & UMEM_NOFAIL))
77fc8ec0b8Shaad 			return NULL;
78fc8ec0b8Shaad 
79fc8ec0b8Shaad 		if(nofail_cb != NULL)
80fc8ec0b8Shaad 			nofail_cb();
81fc8ec0b8Shaad 		abort();
82fc8ec0b8Shaad 	}
83fc8ec0b8Shaad 
84fc8ec0b8Shaad 	return ret;
85fc8ec0b8Shaad }
86fc8ec0b8Shaad 
87fc8ec0b8Shaad /*
88fc8ec0b8Shaad  * Simple stub for umem_free().
89fc8ec0b8Shaad  */
umem_free(void * buf,size_t size)90fc8ec0b8Shaad void umem_free(void *buf, size_t size)
91fc8ec0b8Shaad {
92fc8ec0b8Shaad 	free(buf);
93fc8ec0b8Shaad }
94fc8ec0b8Shaad 
95fc8ec0b8Shaad /*
96fc8ec0b8Shaad  * Simple stub for umem_nofail_callback().
97fc8ec0b8Shaad  */
umem_nofail_callback(umem_nofail_callback_t * callback)98fc8ec0b8Shaad void umem_nofail_callback(umem_nofail_callback_t *callback)
99fc8ec0b8Shaad {
100fc8ec0b8Shaad 	nofail_cb = callback;
101fc8ec0b8Shaad }
102fc8ec0b8Shaad 
103fc8ec0b8Shaad /*
104fc8ec0b8Shaad  * Simple stub for umem_cache_create().
105fc8ec0b8Shaad  */
umem_cache_create(char * debug_name,size_t bufsize,size_t align,umem_constructor_t * constructor,umem_destructor_t * destructor,umem_reclaim_t * reclaim,void * callback_data,void * source,int cflags)106fc8ec0b8Shaad umem_cache_t *umem_cache_create(char *debug_name, size_t bufsize, size_t align, umem_constructor_t *constructor, umem_destructor_t *destructor, umem_reclaim_t *reclaim, void *callback_data, void *source, int cflags)
107fc8ec0b8Shaad {
108fc8ec0b8Shaad 	assert(source == NULL);
109fc8ec0b8Shaad 
110fc8ec0b8Shaad 	umem_cache_t *cache = malloc(sizeof(umem_cache_t));
111fc8ec0b8Shaad 	if(cache == NULL)
112fc8ec0b8Shaad 		return NULL;
113fc8ec0b8Shaad 
114fc8ec0b8Shaad 	cache->constructor = constructor;
115fc8ec0b8Shaad 	cache->destructor = destructor;
116fc8ec0b8Shaad 	cache->callback_data = callback_data;
117fc8ec0b8Shaad 	cache->bufsize = bufsize;
118fc8ec0b8Shaad 
119fc8ec0b8Shaad 	return cache;
120fc8ec0b8Shaad }
121fc8ec0b8Shaad 
122fc8ec0b8Shaad /*
123fc8ec0b8Shaad  * Simple stub for umem_cache_alloc(). The nofail callback isn't expected to return.
124fc8ec0b8Shaad  */
umem_cache_alloc(umem_cache_t * cache,int flags)125fc8ec0b8Shaad void *umem_cache_alloc(umem_cache_t *cache, int flags)
126fc8ec0b8Shaad {
127fc8ec0b8Shaad 	void *buf = malloc(cache->bufsize);
128fc8ec0b8Shaad 	if(buf == NULL) {
129fc8ec0b8Shaad 		if(!(flags & UMEM_NOFAIL))
130fc8ec0b8Shaad 			return NULL;
131fc8ec0b8Shaad 
132fc8ec0b8Shaad 		if(nofail_cb != NULL)
133fc8ec0b8Shaad 			nofail_cb();
134fc8ec0b8Shaad 		abort();
135fc8ec0b8Shaad 	}
136fc8ec0b8Shaad 
137fc8ec0b8Shaad 	if(cache->constructor != NULL) {
138*0d3564d1Shannken 		if(cache->constructor(buf, cache->callback_data, flags) != 0) {
139fc8ec0b8Shaad 			free(buf);
140fc8ec0b8Shaad 			if(!(flags & UMEM_NOFAIL))
141fc8ec0b8Shaad 				return NULL;
142fc8ec0b8Shaad 
143fc8ec0b8Shaad 			if(nofail_cb != NULL)
144fc8ec0b8Shaad 				nofail_cb();
145fc8ec0b8Shaad 			abort();
146fc8ec0b8Shaad 		}
147fc8ec0b8Shaad 	}
148fc8ec0b8Shaad 
149fc8ec0b8Shaad 	return buf;
150fc8ec0b8Shaad }
151fc8ec0b8Shaad 
152fc8ec0b8Shaad /*
153fc8ec0b8Shaad  * Simple stub for umem_cache_free().
154fc8ec0b8Shaad  */
umem_cache_free(umem_cache_t * cache,void * buffer)155fc8ec0b8Shaad void umem_cache_free(umem_cache_t *cache, void *buffer)
156fc8ec0b8Shaad {
157fc8ec0b8Shaad 	if(cache->destructor != NULL)
158*0d3564d1Shannken 		cache->destructor(buffer, cache->callback_data);
159fc8ec0b8Shaad 
160fc8ec0b8Shaad 	free(buffer);
161fc8ec0b8Shaad }
162fc8ec0b8Shaad 
163fc8ec0b8Shaad /*
164fc8ec0b8Shaad  * Simple stub for umem_cache_destroy().
165fc8ec0b8Shaad  */
umem_cache_destroy(umem_cache_t * cache)166fc8ec0b8Shaad void umem_cache_destroy(umem_cache_t *cache)
167fc8ec0b8Shaad {
168fc8ec0b8Shaad 	free(cache);
169fc8ec0b8Shaad }
170