1#include <stdlib.h> 2#include <string.h> 3#include <malloc.h> 4#include <unistd.h> 5#include <assert.h> 6 7#include <linux/mempool.h> 8#include <linux/slab.h> 9#include <urcu/uatomic.h> 10 11int nr_allocated; 12 13void *mempool_alloc(mempool_t *pool, int gfp_mask) 14{ 15 return pool->alloc(gfp_mask, pool->data); 16} 17 18void mempool_free(void *element, mempool_t *pool) 19{ 20 pool->free(element, pool->data); 21} 22 23mempool_t *mempool_create(int min_nr, mempool_alloc_t *alloc_fn, 24 mempool_free_t *free_fn, void *pool_data) 25{ 26 mempool_t *ret = malloc(sizeof(*ret)); 27 28 ret->alloc = alloc_fn; 29 ret->free = free_fn; 30 ret->data = pool_data; 31 return ret; 32} 33 34void *kmem_cache_alloc(struct kmem_cache *cachep, int flags) 35{ 36 void *ret = malloc(cachep->size); 37 if (cachep->ctor) 38 cachep->ctor(ret); 39 uatomic_inc(&nr_allocated); 40 return ret; 41} 42 43void kmem_cache_free(struct kmem_cache *cachep, void *objp) 44{ 45 assert(objp); 46 uatomic_dec(&nr_allocated); 47 memset(objp, 0, cachep->size); 48 free(objp); 49} 50 51struct kmem_cache * 52kmem_cache_create(const char *name, size_t size, size_t offset, 53 unsigned long flags, void (*ctor)(void *)) 54{ 55 struct kmem_cache *ret = malloc(sizeof(*ret)); 56 57 ret->size = size; 58 ret->ctor = ctor; 59 return ret; 60} 61