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