53 lines · c
1// SPDX-License-Identifier: GPL-2.0-only2/*3 * generic arrays4 */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 array12 * @array: the array object13 *14 * Get a new element from the given array. If it exceeds the15 * 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 elements43 * @array: the array object44 */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