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