brintos

brintos / linux-shallow public Read only

0
0
Text · 1.2 KiB · a204dce Raw
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