linux.c 1.2 KB

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