array.c 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. /*
  2. * generic arrays
  3. */
  4. #include <linux/slab.h>
  5. #include <sound/core.h>
  6. #include <sound/hdaudio.h>
  7. /**
  8. * snd_array_new - get a new element from the given array
  9. * @array: the array object
  10. *
  11. * Get a new element from the given array. If it exceeds the
  12. * pre-allocated array size, re-allocate the array.
  13. *
  14. * Returns NULL if allocation failed.
  15. */
  16. void *snd_array_new(struct snd_array *array)
  17. {
  18. if (snd_BUG_ON(!array->elem_size))
  19. return NULL;
  20. if (array->used >= array->alloced) {
  21. int num = array->alloced + array->alloc_align;
  22. int oldsize = array->alloced * array->elem_size;
  23. int size = (num + 1) * array->elem_size;
  24. void *nlist;
  25. if (snd_BUG_ON(num >= 4096))
  26. return NULL;
  27. nlist = krealloc(array->list, size, GFP_KERNEL);
  28. if (!nlist)
  29. return NULL;
  30. memset(nlist + oldsize, 0, size - oldsize);
  31. array->list = nlist;
  32. array->alloced = num;
  33. }
  34. return snd_array_elem(array, array->used++);
  35. }
  36. EXPORT_SYMBOL_GPL(snd_array_new);
  37. /**
  38. * snd_array_free - free the given array elements
  39. * @array: the array object
  40. */
  41. void snd_array_free(struct snd_array *array)
  42. {
  43. kfree(array->list);
  44. array->used = 0;
  45. array->alloced = 0;
  46. array->list = NULL;
  47. }
  48. EXPORT_SYMBOL_GPL(snd_array_free);