1 /* 2 * Copyright (C) 2014 BlueKitchen GmbH 3 * 4 * Redistribution and use in source and binary forms, with or without 5 * modification, are permitted provided that the following conditions 6 * are met: 7 * 8 * 1. Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * 2. Redistributions in binary form must reproduce the above copyright 11 * notice, this list of conditions and the following disclaimer in the 12 * documentation and/or other materials provided with the distribution. 13 * 3. Neither the name of the copyright holders nor the names of 14 * contributors may be used to endorse or promote products derived 15 * from this software without specific prior written permission. 16 * 4. Any redistribution, use, or modification is done solely for 17 * personal benefit and not for any commercial purpose or for 18 * monetary gain. 19 * 20 * THIS SOFTWARE IS PROVIDED BY BLUEKITCHEN GMBH AND CONTRIBUTORS 21 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 22 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 23 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BLUEKITCHEN 24 * GMBH OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 25 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 26 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS 27 * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED 28 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 29 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF 30 * THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 31 * SUCH DAMAGE. 32 * 33 * Please inquire about commercial licensing options at 34 * [email protected] 35 * 36 */ 37 38 #define BTSTACK_FILE__ "btstack_memory_pool.c" 39 40 /* 41 * btstack_memory_pool.c 42 * 43 * Fixed-size block allocation 44 * 45 * Free blocks are kept in singly linked list 46 * 47 */ 48 49 #include "btstack_memory_pool.h" 50 51 #include <stddef.h> 52 #include "btstack_debug.h" 53 54 typedef struct node { 55 struct node * next; 56 } node_t; 57 58 void btstack_memory_pool_create(btstack_memory_pool_t *pool, void * storage, int count, int block_size){ 59 node_t *free_blocks = (node_t*) pool; 60 char *mem_ptr = (char *) storage; 61 int i; 62 63 // create singly linked list of all available blocks 64 free_blocks->next = NULL; 65 for (i = 0 ; i < count ; i++){ 66 btstack_memory_pool_free(pool, mem_ptr); 67 mem_ptr += block_size; 68 } 69 } 70 71 void * btstack_memory_pool_get(btstack_memory_pool_t *pool){ 72 node_t *free_blocks = (node_t*) pool; 73 74 if (!free_blocks->next) return NULL; 75 76 // remove first 77 node_t *node = free_blocks->next; 78 free_blocks->next = node->next; 79 80 return (void*) node; 81 } 82 83 void btstack_memory_pool_free(btstack_memory_pool_t *pool, void * block){ 84 node_t *free_blocks = (node_t*) pool; 85 node_t *node = (node_t*) block; 86 87 // assert that node is not already in list 88 node_t * it; 89 for (it = free_blocks->next; it != NULL; it = it->next){ 90 btstack_assert(it != node); 91 } 92 93 // add block as node to list 94 node->next = free_blocks->next; 95 free_blocks->next = node; 96 } 97