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