Branch data Line data Source code
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 : : */ 19 : 0 : void *snd_array_new(struct snd_array *array) 20 : : { 21 [ # # ]: 0 : if (snd_BUG_ON(!array->elem_size)) 22 : : return NULL; 23 [ # # ]: 0 : if (array->used >= array->alloced) { 24 : 0 : int num = array->alloced + array->alloc_align; 25 : 0 : int oldsize = array->alloced * array->elem_size; 26 : 0 : int size = (num + 1) * array->elem_size; 27 : 0 : void *nlist; 28 [ # # ]: 0 : if (snd_BUG_ON(num >= 4096)) 29 : : return NULL; 30 : 0 : nlist = krealloc(array->list, size, GFP_KERNEL); 31 [ # # ]: 0 : if (!nlist) 32 : : return NULL; 33 : 0 : memset(nlist + oldsize, 0, size - oldsize); 34 : 0 : array->list = nlist; 35 : 0 : array->alloced = num; 36 : : } 37 : 0 : return snd_array_elem(array, array->used++); 38 : : } 39 : : EXPORT_SYMBOL_GPL(snd_array_new); 40 : : 41 : : /** 42 : : * snd_array_free - free the given array elements 43 : : * @array: the array object 44 : : */ 45 : 0 : void snd_array_free(struct snd_array *array) 46 : : { 47 : 0 : kfree(array->list); 48 : 0 : array->used = 0; 49 : 0 : array->alloced = 0; 50 : 0 : array->list = NULL; 51 : 0 : } 52 : : EXPORT_SYMBOL_GPL(snd_array_free);