1 /* SPDX-License-Identifier: GPL-2.0-only */ 2 3 #include <commonlib/helpers.h> 4 #include <commonlib/mem_pool.h> 5 mem_pool_alloc(struct mem_pool * mp,size_t sz)6void *mem_pool_alloc(struct mem_pool *mp, size_t sz) 7 { 8 void *p; 9 10 if (mp->alignment == 0) 11 return NULL; 12 13 /* We assume that mp->buf started mp->alignment aligned */ 14 sz = ALIGN_UP(sz, mp->alignment); 15 16 /* Determine if any space available. */ 17 if ((mp->size - mp->free_offset) < sz) 18 return NULL; 19 20 p = &mp->buf[mp->free_offset]; 21 22 mp->free_offset += sz; 23 mp->second_to_last_alloc = mp->last_alloc; 24 mp->last_alloc = p; 25 26 return p; 27 } 28 mem_pool_free(struct mem_pool * mp,void * p)29void mem_pool_free(struct mem_pool *mp, void *p) 30 { 31 /* Determine if p was the most recent allocation. */ 32 if (p == NULL || mp->last_alloc != p) 33 return; 34 35 mp->free_offset = mp->last_alloc - mp->buf; 36 mp->last_alloc = mp->second_to_last_alloc; 37 /* No way to track allocation before this one. */ 38 mp->second_to_last_alloc = NULL; 39 } 40