linux.c 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  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. int preempt_count;
  11. void *mempool_alloc(mempool_t *pool, int gfp_mask)
  12. {
  13. return pool->alloc(gfp_mask, pool->data);
  14. }
  15. void mempool_free(void *element, mempool_t *pool)
  16. {
  17. pool->free(element, pool->data);
  18. }
  19. mempool_t *mempool_create(int min_nr, mempool_alloc_t *alloc_fn,
  20. mempool_free_t *free_fn, void *pool_data)
  21. {
  22. mempool_t *ret = malloc(sizeof(*ret));
  23. ret->alloc = alloc_fn;
  24. ret->free = free_fn;
  25. ret->data = pool_data;
  26. return ret;
  27. }
  28. void *kmem_cache_alloc(struct kmem_cache *cachep, int flags)
  29. {
  30. void *ret;
  31. if (flags & __GFP_NOWARN)
  32. return NULL;
  33. ret = malloc(cachep->size);
  34. if (cachep->ctor)
  35. cachep->ctor(ret);
  36. uatomic_inc(&nr_allocated);
  37. return ret;
  38. }
  39. void kmem_cache_free(struct kmem_cache *cachep, void *objp)
  40. {
  41. assert(objp);
  42. uatomic_dec(&nr_allocated);
  43. memset(objp, 0, cachep->size);
  44. free(objp);
  45. }
  46. struct kmem_cache *
  47. kmem_cache_create(const char *name, size_t size, size_t offset,
  48. unsigned long flags, void (*ctor)(void *))
  49. {
  50. struct kmem_cache *ret = malloc(sizeof(*ret));
  51. ret->size = size;
  52. ret->ctor = ctor;
  53. return ret;
  54. }