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